re PR rtl-optimization/34628 (problems with inlining on ARM)

PR rtl-optimization/34628
	* combine.c (try_combine): Stop and undo after the first combination
	if an autoincrement side-effect on the first insn has effectively
	been lost.

From-SVN: r131744
This commit is contained in:
Eric Botcazou 2008-01-22 22:27:47 +00:00 committed by Eric Botcazou
parent ec46053bfa
commit df1a98aeca
4 changed files with 57 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2008-01-22 Eric Botcazou <ebotcazou@adacore.com>
PR rtl-optimization/34628
* combine.c (try_combine): Stop and undo after the first combination
if an autoincrement side-effect on the first insn has effectively
been lost.
2008-01-22 David Edelsohn <edelsohn@gnu.org>
PR target/34529

View File

@ -2751,12 +2751,17 @@ try_combine (rtx i3, rtx i2, rtx i1, int *new_direct_jump_p)
if (i1 && GET_CODE (newpat) != CLOBBER)
{
/* Before we can do this substitution, we must redo the test done
above (see detailed comments there) that ensures that I1DEST
isn't mentioned in any SETs in NEWPAT that are field assignments. */
if (! combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX,
0, (rtx*) 0))
/* Check that an autoincrement side-effect on I1 has not been lost.
This happens if I1DEST is mentioned in I2 and dies there, and
has disappeared from the new pattern. */
if ((FIND_REG_INC_NOTE (i1, NULL_RTX) != 0
&& !i1_feeds_i3
&& dead_or_set_p (i2, i1dest)
&& !reg_overlap_mentioned_p (i1dest, newpat))
/* Before we can do this substitution, we must redo the test done
above (see detailed comments there) that ensures that I1DEST
isn't mentioned in any SETs in NEWPAT that are field assignments. */
|| !combinable_i3pat (NULL_RTX, &newpat, i1dest, NULL_RTX, 0, 0))
{
undo_all ();
return 0;

View File

@ -1,3 +1,7 @@
2008-01-22 Eric Botcazou <ebotcazou@adacore.com>
* gcc.c-torture/execute/20080122-1.c: New test.
2008-01-22 Tom Tromey <tromey@redhat.com>
PR c++/34859:

View File

@ -0,0 +1,35 @@
/* PR rtl-optimization/34628 */
/* Origin: Martin Michlmayr <tbm@cyrius.com> */
typedef unsigned short u16;
typedef unsigned char u8;
static void
do_segfault(u8 in_buf[], const u8 out_buf[], const int len)
{
int i;
for (i = 0; i < len; i++) {
asm("");
in_buf[2*i] = ( out_buf[2*i] | out_buf[(2*i)+1]<<8 ) & 0xFF;
asm("");
in_buf[(2*i)+1] = ( out_buf[2*i] | out_buf[(2*i)+1]<<8 ) >> 8;
asm("");
}
}
int main(int argc, char *argv[])
{
u8 outbuf[32] = "buffer ";
u8 inbuf[32] = "\f";
asm("");
do_segfault(inbuf, outbuf, 12);
asm("");
return 0;
}