From: ebotcazou Date: Sat, 18 Dec 2004 07:55:42 +0000 (+0000) Subject: PR rtl-optimization/16968 X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=a287ef4f965e7c4214096571f10b4c00f57801ed;hp=4ffeedd359748eb61387efe467fa7d2bc604c0b5;p=pf3gnuchains%2Fgcc-fork.git PR rtl-optimization/16968 * loop.c (scan_loop): Stop scanning the loop for movable insns as soon as an optimization barrier is encountered. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92348 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 127880aa24d..a98a1d7d83b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-12-18 Eric Botcazou + + 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 PR 18897 diff --git a/gcc/loop.c b/gcc/loop.c index 15039e85bfc..faf6cb23b82 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -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 a2e5f6f1a71..1ef26bacd31 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-12-18 Jakub Jelinek + + * gcc.c-torture/execute/20041218-1.c: New test. + 2004-12-17 Diego Novillo * 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 00000000000..4d113e4557c --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20041218-1.c @@ -0,0 +1,117 @@ +/* PR rtl-optimization/16968 */ +/* Testcase by Jakub Jelinek */ + +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 (); +}