Index: tree-pass.h =================================================================== --- tree-pass.h (revision 111268) +++ tree-pass.h (working copy) @@ -353,6 +353,7 @@ extern struct tree_opt_pass pass_regmove; extern struct tree_opt_pass pass_split_all_insns; extern struct tree_opt_pass pass_mode_switching; +extern struct tree_opt_pass pass_see; extern struct tree_opt_pass pass_recompute_reg_usage; extern struct tree_opt_pass pass_sms; extern struct tree_opt_pass pass_sched; Index: opts.c =================================================================== --- opts.c (revision 111268) +++ opts.c (working copy) @@ -596,6 +596,7 @@ flag_inline_functions = 1; flag_unswitch_loops = 1; flag_gcse_after_reload = 1; + flag_see = 1; } if (optimize < 2 || optimize_size) Index: timevar.def =================================================================== --- timevar.def (revision 111268) +++ timevar.def (working copy) @@ -143,6 +143,7 @@ DEFTIMEVAR (TV_FLOW , "flow analysis") DEFTIMEVAR (TV_COMBINE , "combiner") DEFTIMEVAR (TV_IFCVT , "if-conversion") +DEFTIMEVAR (TV_SEE , "see") DEFTIMEVAR (TV_REGMOVE , "regmove") DEFTIMEVAR (TV_MODE_SWITCH , "mode switching") DEFTIMEVAR (TV_SMS , "sms modulo scheduling") Index: common.opt =================================================================== --- common.opt (revision 111268) +++ common.opt (working copy) @@ -795,6 +795,10 @@ Common Report Var(flag_rtl_seqabstr) Perform sequence abstraction optimization on RTL +fsee +Common Report Var(flag_see) Init(0) +Eliminate redundant sign extensions using LCM. + fshared-data Common Report Var(flag_shared_data) Mark data as shared rather than private Index: Makefile.in =================================================================== --- Makefile.in (revision 111268) +++ Makefile.in (working copy) @@ -987,7 +987,7 @@ real.o recog.o reg-stack.o regclass.o regmove.o regrename.o \ reload.o reload1.o reorg.o resource.o rtl.o rtlanal.o rtl-error.o \ sbitmap.o sched-deps.o sched-ebb.o sched-rgn.o sched-vis.o sdbout.o \ - simplify-rtx.o sreal.o stmt.o stor-layout.o stringpool.o \ + see.o simplify-rtx.o sreal.o stmt.o stor-layout.o stringpool.o \ struct-equiv.o targhooks.o timevar.o toplev.o tracer.o tree.o tree-dump.o \ varasm.o varray.o vec.o version.o vmsdbgout.o xcoffout.o alloc-pool.o \ et-forest.o cfghooks.o bt-load.o pretty-print.o $(GGC) web.o passes.o \ @@ -2302,6 +2302,9 @@ web.o : web.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ hard-reg-set.h $(FLAGS_H) $(BASIC_BLOCK_H) $(FUNCTION_H) output.h toplev.h \ $(DF_H) $(OBSTACK_H) timevar.h tree-pass.h +see.o : see.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ + hard-reg-set.h $(FLAGS_H) $(BASIC_BLOCK_H) function.h output.h toplev.h \ + $(DF_H) $(OBSTACK_H) timevar.h tree-pass.h gcse.o : gcse.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ $(REGS_H) hard-reg-set.h $(FLAGS_H) real.h insn-config.h $(GGC_H) \ $(RECOG_H) $(EXPR_H) $(BASIC_BLOCK_H) $(FUNCTION_H) output.h toplev.h \ Index: passes.c =================================================================== --- passes.c (revision 111268) +++ passes.c (working copy) @@ -651,6 +651,7 @@ NEXT_PASS (pass_regmove); NEXT_PASS (pass_split_all_insns); NEXT_PASS (pass_mode_switching); + NEXT_PASS (pass_see); NEXT_PASS (pass_recompute_reg_usage); NEXT_PASS (pass_sms); NEXT_PASS (pass_sched); Index: doc/invoke.texi =================================================================== --- doc/invoke.texi (revision 111268) +++ doc/invoke.texi (working copy) @@ -332,7 +332,7 @@ -fsched-spec-load-dangerous @gol -fsched-stalled-insns=@var{n} -fsched-stalled-insns-dep=@var{n} @gol -fsched2-use-superblocks @gol --fsched2-use-traces -freschedule-modulo-scheduled-loops @gol +-fsched2-use-traces -fsee -freschedule-modulo-scheduled-loops @gol -fsection-anchors -fsignaling-nans -fsingle-precision-constant @gol -fstack-protector -fstack-protector-all @gol -fstrength-reduce -fstrict-aliasing -ftracer -fthread-jumps @gol @@ -4989,6 +4989,12 @@ sense when scheduling after register allocation, i.e.@: with @option{-fschedule-insns2} or at @option{-O2} or higher. +@item -fsee +@opindex fsee +Eliminates redundant extension instructions and move the non redundant +ones to optimal placement using LCM. +Enabled at level @option{-O3}. + @item -freschedule-modulo-scheduled-loops @opindex fscheduling-in-modulo-scheduled-loops The modulo scheduling comes before the traditional scheduling, if a loop was modulo scheduled