------- Comment #5 from rguenth at gcc dot gnu dot org  2009-01-27 14:34 -------
We try to insert {nop_expr,g_2.7_58} in bb 41

<bb 18>:
  # g_67_22 = PHI <g_67_63(39), g_67_44(D)(24)>
  # g_2.7_58 = PHI <g_2.11_10(39), g_2.7_1(24)>
  # g_2_59 = PHI <g_2_48(39), g_2_43(D)(24)>
  # VUSE <g_162_45(D)>
  g_162.9_61 ={v} g_162;
  if (g_162.9_61 != 0)
    goto <bb 41>;
  else
    goto <bb 42>;

<bb 42>:
  goto <bb 13>;

<bb 41>:
  goto <bb 4>;

The original avail_out computation says

exp_gen[41] := {  }
tmp_gen[41] := {  }
avail_out[41] := { g_2.7_1 (0002), g_2.7_58 (0030), g_162.9_61 (0032) }

(correct)

but at the point of insertion we instead have

debug[0] := { g_2.7_1 (0002), g_162.9_61 (0032), pretmp.23_38 (0046),
prephitmp.24_23 (0044), prephitmp.29_66 (0037) }

so we replaced some value here, but with a different value-number.

This happens in

              /* Note that we need to value_replace both NEW_SETS, and
                 AVAIL_OUT. For both the case of NEW_SETS, the value may be
                 represented by some non-simple expression here that we want
                 to replace it with.  */
              FOR_EACH_EXPR_ID_IN_SET (newset, i, bi)
                {
                  pre_expr expr = expression_for_id (i);
                  bitmap_value_replace_in_set (NEW_SETS (block), expr);
                  bitmap_value_replace_in_set (AVAIL_OUT (block), expr);
                }

where I see us replacing in

debug[0] := { g_2.7_1 (0002), g_2.7_58 (0030), g_162.9_61 (0032), pretmp.23_38
(0046), prephitmp.24_23 (0044), prephitmp.29_66 (0037) }

with expr prephitmp.29_66 (0037)

with the above result.  The expression set for 0037 at that point is

debug[0] := { g_2.7_58 (0030), {g_2} (0037), pretmp.23_2 (0037),
prephitmp.29_66 (0037) }

where for some weird reason g_2.7_58 (0030) is in it (!?).


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38926

Reply via email to