------- Comment #15 from rguenth at gcc dot gnu dot org 2007-02-25 22:50 ------- We start with
D.59982_3 = variable_2(D) + 4B; __unary_op = __unary_op.65; goto <bb 4> (<L1>); <L0>:; D.61146_10 = __unary_op._M_arg1; D.61147_11 = __unary_op._M_arg2; D.61093_12 = D.61146_10 + D.61147_11; *variable_13 = D.61093_12; variable_14 = variable_7 + 4B; variable_15 = variable_13 + 4B; # variable_7 = PHI <variable_2(D)(2), variable_14(3)> # variable_13 = PHI <variable_2(D)(2), variable_15(3)> <L1>:; if (D.59982_3 != variable_7) goto <L0>; else goto <L2>; and loop header copying and DOM make it optimizable: D.59982_3 = variable_2(D) + 4B; __unary_op.65._M_arg2 = v_1(D); __unary_op.65._M_arg1 = 0; __unary_op = __unary_op.65; __unary_op$_M_arg2_54 = __unary_op._M_arg2; __unary_op$_M_arg1_53 = __unary_op._M_arg1; if (variable_2(D) != D.59982_3) goto <L7>; else goto <L2>; <L2>:; return; # variable_49 = PHI <variable_2(D)(2)> # variable_27 = PHI <variable_2(D)(2)> <L7>:; __unary_op$_M_arg1_25 = __unary_op$_M_arg1_53; __unary_op$_M_arg2_17 = __unary_op$_M_arg2_54; D.61093_18 = __unary_op$_M_arg1_53 + __unary_op$_M_arg2_54; *variable_49 = D.61093_18; variable_20 = variable_27 + 4B; variable_21 = variable_49 + 4B; goto <bb 3> (<L2>); so a tweaked forwprop fixes it at least before PRE. But dunno if we want to do tree combining on conditions here. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19431