From: Jakub Jelinek Date: Wed, 30 Nov 2011 18:58:33 +0000 (+0100) Subject: re PR rtl-optimization/48721 (ICE: verify_flow_info failed: missing barrier after... X-Git-Tag: upstream/12.2.0~79450 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9790c19e52e65814d6c738fe0e31e25e93f3f4cb;p=platform%2Fupstream%2Fgcc.git re PR rtl-optimization/48721 (ICE: verify_flow_info failed: missing barrier after block 6 with -foptimize-sibling-calls -fsched2-use-superblocks) PR rtl-optimization/48721 * sched-deps.c (sched_analyze_insn): For SIBLING_CALL_P set reg_pending_barrier to TRUE_BARRIER. * gcc.target/i386/pr48721.c: New test. From-SVN: r181856 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a09a42f..6acc6af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,10 @@ 2011-11-30 Jakub Jelinek PR rtl-optimization/48721 + * sched-deps.c (sched_analyze_insn): For SIBLING_CALL_P set + reg_pending_barrier to TRUE_BARRIER. + + PR rtl-optimization/48721 * sched-ebb.c (begin_move_insn): Insert empty unreachable block after BARRIER if insn is followed by it. diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index 043204a..af2892d 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -2873,7 +2873,11 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx insn) else sched_analyze_2 (deps, XEXP (link, 0), insn); } - if (find_reg_note (insn, REG_SETJMP, NULL)) + /* Don't schedule anything after a tail call, tail call needs + to use at least all call-saved registers. */ + if (SIBLING_CALL_P (insn)) + reg_pending_barrier = TRUE_BARRIER; + else if (find_reg_note (insn, REG_SETJMP, NULL)) reg_pending_barrier = MOVE_BARRIER; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb13fb5..a47925b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-11-30 Jakub Jelinek + + PR rtl-optimization/48721 + * gcc.target/i386/pr48721.c: New test. + 2011-11-30 Paolo Carlini PR c++/51299 diff --git a/gcc/testsuite/gcc.target/i386/pr48721.c b/gcc/testsuite/gcc.target/i386/pr48721.c new file mode 100644 index 0000000..f37a169 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr48721.c @@ -0,0 +1,51 @@ +/* PR rtl-optimization/48721 */ +/* { dg-do compile } */ +/* { dg-options "-O -foptimize-sibling-calls -fsched2-use-superblocks -fschedule-insns2 -mtune=core2" } */ + +extern unsigned char a[]; +extern int b[], d[], e[], f[], g[], *h[], m[], *n[], o[]; +extern char c[]; + +struct S +{ + unsigned char s1; + int s2, s3, s4, s5, s6, s7, s8; +}; + +__attribute__((noinline, noclone)) int +foo (int x) +{ + return 0; +} + +int +bar (int x, struct S *y) +{ + int z; + switch (x) + { + case 1: + case 2: + { + int t2, t4, t5, t6, t7, t8; + z = o[y->s8 * 6]; + t8 = *n[m[x] * 5]; + t4 = *h[y->s7]; + t7 = z; + z = g[f[x] + y->s6]; + t6 = e[y->s5]; + t5 = d[c[x] + y->s3 * 17]; + if (z) + t2 = b[z]; + if (a[z] != y->s1) + return foo (x); + y->s8 = t8; + y->s4 = t4; + y->s7 = t7; + y->s6 = t6; + y->s5 = t5; + y->s2 = t2; + } + } + return 0; +}