On 12/28/2021 3:21 AM, Jakub Jelinek wrote:
Hi!

In the following testcase we have a -fcompare-debug failure, because
can_move_invariant_reg doesn't ignore DEBUG_INSNs in its decisions.
In the testcase we have due to uninitialized variable:
   loop_header
     debug_insn using pseudo84
     pseudo84 = invariant
     insn using pseudo84
   end loop
and with -g decide not to move the pseudo84 = invariant before the
loop header; in this case not resetting the debug insns might be fine.
But, we could have also:
   pseudo84 = whatever
   loop_header
     debug_insn using pseudo84
     pseudo84 = invariant
     insn using pseudo84
   end loop
and in that case not resetting the debug insns would result in wrong-debug.
And, we don't really have generally a good substitution on what pseudo84
contains, it could inherit various values from different paths.
So, the following patch ignores DEBUG_INSNs in the decisions, and if there
are any that previously prevented the optimization, resets them before
return true.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2021-12-28  Jakub Jelinek  <ja...@redhat.com>

        PR rtl-optimization/103837
        * loop-invariant.c (can_move_invariant_reg): Ignore DEBUG_INSNs in
        the decisions whether to return false or continue and right before
        returning true reset those debug insns that previously caused
        returning false.

        * gcc.dg/pr103837.c: New test.
OK
jeff

Reply via email to