re PR rtl-optimization/16968 (loop optimizer miscompilation)

PR rtl-optimization/16968
	* loop.c (scan_loop): Stop scanning the loop for movable
	insns as soon as an optimization barrier is encountered.

From-SVN: r92348
This commit is contained in:
Eric Botcazou 2004-12-18 07:55:42 +00:00
parent bc6d19abb1
commit 9f70d2bc3a
4 changed files with 130 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2004-12-18 Eric Botcazou <ebotcazou@libertysurf.fr>
PR rtl-optimization/16968
* loop.c (scan_loop): Stop scanning the loop for movable
insns as soon as an optimization barrier is encountered.
2004-12-17 Zack Weinberg <zack@codesourcery.com>
PR 18897

View File

@ -1119,6 +1119,9 @@ scan_loop (struct loop *loop, int flags)
in_libcall--;
if (NONJUMP_INSN_P (p))
{
/* Do not scan past an optimization barrier. */
if (GET_CODE (PATTERN (p)) == ASM_INPUT)
break;
temp = find_reg_note (p, REG_LIBCALL, NULL_RTX);
if (temp)
in_libcall++;

View File

@ -1,3 +1,7 @@
2004-12-18 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20041218-1.c: New test.
2004-12-17 Diego Novillo <dnovillo@redhat.com>
* gcc.dg/pr18501.c: New test.

View File

@ -0,0 +1,117 @@
/* PR rtl-optimization/16968 */
/* Testcase by Jakub Jelinek <jakub@redhat.com> */
struct T
{
unsigned int b, c, *d;
unsigned char e;
};
struct S
{
unsigned int a;
struct T f;
};
struct U
{
struct S g, h;
};
struct V
{
unsigned int i;
struct U j;
};
extern void exit (int);
extern void abort (void);
void *
dummy1 (void *x)
{
return "";
}
void *
dummy2 (void *x, void *y)
{
exit (0);
}
struct V *
baz (unsigned int x)
{
static struct V v;
__builtin_memset (&v, 0x55, sizeof (v));
return &v;
}
int
check (void *x, struct S *y)
{
if (y->a || y->f.b || y->f.c || y->f.d || y->f.e)
abort ();
return 1;
}
static struct V *
bar (unsigned int x, void *y)
{
const struct T t = { 0, 0, (void *) 0, 0 };
struct V *u;
void *v;
v = dummy1 (y);
if (!v)
return (void *) 0;
u = baz (sizeof (struct V));
u->i = x;
u->j.g.a = 0;
u->j.g.f = t;
u->j.h.a = 0;
u->j.h.f = t;
if (!check (v, &u->j.g) || !check (v, &u->j.h))
return (void *) 0;
return u;
}
int
foo (unsigned int *x, unsigned int y, void **z)
{
void *v;
unsigned int i, j;
*z = v = (void *) 0;
for (i = 0; i < y; i++)
{
struct V *c;
j = *x;
switch (j)
{
case 1:
c = bar (j, x);
break;
default:
c = 0;
break;
}
if (c)
v = dummy2 (v, c);
else
return 1;
}
*z = v;
return 0;
}
int
main (void)
{
unsigned int one = 1;
void *p;
foo (&one, 1, &p);
abort ();
}