It turns out that the REG_EQUAL note is removed on a hoisted instruction (relevant code is in dead_or_predicable in ifcvt.c) if the source of the move instruction is not a function invariant. In this case, the source is a function invariant (constant) and so that doesn't kick in. I don't understand why this exemption for function invariant is there and the original thread in https://gcc.gnu.org/ml/gcc/2005-05/msg01710.html doesn't explain either. Should I just remove the REG_EQUAL notes of all hoisted instructions or are there cases where it is safe to leave the note?
Thanks, Easwaran On Fri, Aug 29, 2014 at 1:06 PM, Jeff Law <l...@redhat.com> wrote: > On 08/25/14 16:42, Easwaran Raman wrote: >> >> This patch deletes REG_EQUAL note when a src register is replaced by a >> constant in an assignment. This is to prevent spurious equivalences >> between the constant and the expression in the REG_EQUAL note. In the >> bug reported in PR 62146, an assignment in one branch (which is >> actually dead) of an IF statement has a REG_EQUAL note equating a >> register with an expression. Conditional copy propagation replaces the >> register with 0. The instruction is hoisted above the branch >> subsequently and then the value 0 is equated with the expression in >> the REG_EQUAL. Is this ok for 4.9 branch if all tests pass? >> >> This patch looks applicable to trunk as well, but I don't have a test >> case to reproduce the issue in trunk. > > Something doesn't feel right with this patch. It seems to me the real > problem is when when hoist the insn with the note. If the equivalence > implied by the note is no longer valid at the insn's new location, then the > note needs to be removed. > > Now determining if the note is no longer valid at the new location may prove > difficult ;-) You'd probably have to know why the note was created, how it > was changed, etc. So I suspect the right thing to do is just remove > REG_EQUAL notes on any insns we hoist in this manner. > > Jeff