[Bug pending/30773] Spec cpu2k6/h264ref and sphinx3 miscompare regression
ian at airs dot com
gcc-bugzilla@gcc.gnu.org
Fri Feb 16 00:38:00 GMT 2007
------- Comment #5 from ian at airs dot com 2007-02-16 00:38 -------
I believe this is also related to the failure of gcc.c-torture/execute/simd-1.c
on i686-pc-linux-gnu at -O1 and above.
I think the problem is that we fail to add a REG_EQUIV note here in
local-alloc.c:
if (REG_N_SETS (regno) == 1
&& note && ! rtx_varies_p (XEXP (note, 0), 0))
{
rtx note_value = XEXP (note, 0);
remove_note (insn, note);
set_unique_reg_note (insn, REG_EQUIV, note_value);
}
because the insn looks like this:
(insn 213 211 214 2
/home/iant/gcc/trunk/gcc/testsuite/gcc.c-torture/execute/simd-1.c:44 (parallel
[
(set (reg:SI 195)
(div:SI (reg:SI 174 [ i+8 ])
(mem/j/c/i:SI (plus:SI (reg/f:SI 20 frame)
(const_int -232 [0xffffff18])) [0 j.64+8 S4 A32])))
(set (reg:SI 196)
(mod:SI (reg:SI 174 [ i+8 ])
(mem/j/c/i:SI (plus:SI (reg/f:SI 20 frame)
(const_int -232 [0xffffff18])) [0 j.64+8 S4 A32])))
(clobber (reg:CC 17 flags))
]) 193 {*divmodsi4_nocltd} (nil)
(expr_list:REG_DEAD (reg:SI 174 [ i+8 ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(expr_list:REG_UNUSED (reg:SI 196)
(nil)))))
(i.e., has two SETs).
That means that in this code:
if (MEM_P (dest) && REG_P (src)
&& (regno = REGNO (src)) >= FIRST_PSEUDO_REGISTER
&& REG_BASIC_BLOCK (regno) >= 0
&& REG_N_SETS (regno) == 1
&& reg_equiv[regno].init_insns != 0
&& reg_equiv[regno].init_insns != const0_rtx
&& ! find_reg_note (XEXP (reg_equiv[regno].init_insns, 0),
REG_EQUIV, NULL_RTX)
&& ! contains_replace_regs (XEXP (dest, 0)))
the ! find_reg_note test fails where it used to succeed. That causes us to set
reg_equiv_init to an inappropriate insn, which we later delete during reload.
--
ian at airs dot com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |ian at airs dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30773
More information about the Gcc-bugs
mailing list