------- Comment #1 from jakub at gcc dot gnu dot org  2010-03-22 19:16 -------
Several issues:
1) reassoc changes:
  [pr43478.c : 6:9] D.2722_1 = h ();
  [pr43478.c : 6:5] x_2 = D.2722_1 * 2;
  [pr43478.c : 6:5] # DEBUG x => x_2
  [pr43478.c : 7:9] D.2723_3 = h ();
  [pr43478.c : 7:5] y_4 = D.2723_3 * 2;
  [pr43478.c : 7:5] # DEBUG y => y_4
  [pr43478.c : 8:3] D.2724_5 = x_2 + y_4;
  return D.2724_5;
into
  [pr43478.c : 6:9] D.2722_1 = h ();
  [pr43478.c : 6:5] # DEBUG x => [pr43478.c : 6] D.2722_1 * 2
  [pr43478.c : 7:9] D.2723_3 = h ();
  D.2728_2 = D.2723_3 + D.2722_1;
  D.2728_4 = D.2728_2 * 2;
  [pr43478.c : 7:5] # DEBUG y => [pr43478.c : 7] D.2723_3 * 2
  [pr43478.c : 8:3] D.2724_5 = D.2728_4;
  return D.2724_5;
Perhaps it would be helpful if the DEBUG stmt got moved first in this case if
it in the end only references SSA names from before the statements.
2) during fwprop1, the well known DF dropping DEBUG_INSNS referencing DEAD
stmts
triggers:
(insn 9 8 10 2 pr43478.c:7 (set (reg:SI 60 [ D.2723 ])
        (reg:SI 0 ax)) 47 {*movsi_1} (nil))

(insn 10 9 11 2 pr43478.c:7 (parallel [
            (set (reg:SI 59 [ D.2728 ])
                (plus:SI (reg:SI 60 [ D.2723 ])
                    (reg:SI 58 [ D.2722 ])))
            (clobber (reg:CC 17 flags))
        ]) 251 {*addsi_1} (nil))

(debug_insn 11 10 12 2 pr43478.c:7 (var_location:SI y (mult:SI (reg:SI 60 [
D.2723 ])
        (const_int 2 [0x2]))) -1 (nil))
becomes:
(insn 9 8 10 2 pr43478.c:7 (set (reg:SI 60 [ D.2723 ])
        (reg:SI 0 ax)) 47 {*movsi_1} (expr_list:REG_DEAD (reg:SI 0 ax)
        (nil)))

(insn 10 9 11 2 pr43478.c:7 (parallel [
            (set (reg:SI 59 [ D.2728 ])
                (plus:SI (reg:SI 60 [ D.2723 ])
                    (reg:SI 58 [ D.2722 ])))
            (clobber (reg:CC 17 flags))
        ]) 251 {*addsi_1} (expr_list:REG_DEAD (reg:SI 60 [ D.2723 ])
        (expr_list:REG_DEAD (reg:SI 58 [ D.2722 ])
            (expr_list:REG_UNUSED (reg:CC 17 flags)
                (nil)))))

(debug_insn 11 10 12 2 pr43478.c:7 (var_location:SI y (clobber (const_int 0
[0x0]))) -1 (nil))
because reg:SI 60 is REG_DEAD in the insn before it.  In this case we even
can't
rematerialize it as (mult:SI (minus:SI (reg:SI 59) (reg:SI 58)) (const_int 2))
(while plus is reversible operation, both pseudos 60 and 58 are REG_DEAD in the
previous insn).
3) even if we handle this all the way through to var-tracking, while in theory
we can express it on the addition insn, the variable value is irrevocably lost
on the shl $1, %eax insn.


-- 


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

Reply via email to