mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
bc6d19abb1
commit
9f70d2bc3a
|
|
@ -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>
|
2004-12-17 Zack Weinberg <zack@codesourcery.com>
|
||||||
|
|
||||||
PR 18897
|
PR 18897
|
||||||
|
|
|
||||||
|
|
@ -1119,6 +1119,9 @@ scan_loop (struct loop *loop, int flags)
|
||||||
in_libcall--;
|
in_libcall--;
|
||||||
if (NONJUMP_INSN_P (p))
|
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);
|
temp = find_reg_note (p, REG_LIBCALL, NULL_RTX);
|
||||||
if (temp)
|
if (temp)
|
||||||
in_libcall++;
|
in_libcall++;
|
||||||
|
|
|
||||||
|
|
@ -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>
|
2004-12-17 Diego Novillo <dnovillo@redhat.com>
|
||||||
|
|
||||||
* gcc.dg/pr18501.c: New test.
|
* gcc.dg/pr18501.c: New test.
|
||||||
|
|
|
||||||
|
|
@ -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 ();
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue