[Bug rtl-optimization/28965] distribute_notes fails to change REG_DEAD into REG_UNUSED notes for global registers
amylaar at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Mon Sep 11 19:50:00 GMT 2006
------- Comment #3 from amylaar at gcc dot gnu dot org 2006-09-11 19:50 -------
(In reply to comment #2)
> Please provide a testcase as well as the other required bits of info.
>
This is a stripped down cc1plus testcase:
void
f (unsigned char *a, int &i)
{
i = a[0] << 8 & a[1];
}
This doesn't actually trigger the 'global variable' part, but distribute_notes
fails to see that there is a set because it looks at PATTERN (tem), when it
should be looking at tem, and thus fails to see a REG_INC note.
The invalid REG_DEAD note triggered an ICE during sched1 with a 4.1.1 based
compiler with ENABLE_CHECKING set, compiling for sh4-elf with -O2
-fno-exceptions.
I can replicate the invalid REG_DEAD note with vanilla 4.1-2006-03-21,
although of course it won't ICE, since checking is disabled.
This insn appears in the combine dump:
(insn 13 8 14 0 (set (reg:QI 162)
(mem:QI (post_inc:SI (reg/v/f:SI 159 [ a ])) [0 S1 A8])) 182 {movqi_i}
(
insn_list:REG_DEP_TRUE 6 (nil))
(expr_list:REG_UNUSED (reg:QI 162)
(expr_list:REG_DEAD (reg/v/f:SI 159 [ a ])
(expr_list:REG_INC (reg/v/f:SI 159 [ a ])
(nil)))))
The testcase doesn't trigger with 4.2, but that's because we don't have
a post-increment in the same place; the distribute_notes code is still wrong
there.
--
amylaar at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed|0000-00-00 00:00:00 |2006-09-11 19:50:45
date| |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28965
More information about the Gcc-bugs
mailing list