diff options
author | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2004-12-18 07:55:42 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2004-12-18 07:55:42 +0000 |
commit | 9f70d2bc3ae689e9fe86cd1ebd07d7b51a785e2b (patch) | |
tree | 2b690f3b251c1444c16804e71fd3a29ca5c237a2 | |
parent | bc6d19abb1155efe6938d3e96c409f4c10269bee (diff) | |
download | gcc-9f70d2bc3ae689e9fe86cd1ebd07d7b51a785e2b.zip gcc-9f70d2bc3ae689e9fe86cd1ebd07d7b51a785e2b.tar.gz gcc-9f70d2bc3ae689e9fe86cd1ebd07d7b51a785e2b.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/loop.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20041218-1.c | 117 |
4 files changed, 130 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 127880a..a98a1d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 @@ -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++; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a2e5f6f..1ef26ba 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/gcc.c-torture/execute/20041218-1.c b/gcc/testsuite/gcc.c-torture/execute/20041218-1.c new file mode 100644 index 0000000..4d113e4 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20041218-1.c @@ -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 (); +} |