diff options
author | Andrey Belevantsev <abel@ispras.ru> | 2018-04-09 13:19:50 +0300 |
---|---|---|
committer | Andrey Belevantsev <abel@gcc.gnu.org> | 2018-04-09 13:19:50 +0300 |
commit | 6abce7391ae63fd2808aa471aa9dd2679eb00496 (patch) | |
tree | 6eed31f778672ee91998c2248cd01ed9927de7fd /gcc | |
parent | 8e9a9b014264250eeda5544cafbdc16eba9489e1 (diff) | |
download | gcc-6abce7391ae63fd2808aa471aa9dd2679eb00496.zip gcc-6abce7391ae63fd2808aa471aa9dd2679eb00496.tar.gz gcc-6abce7391ae63fd2808aa471aa9dd2679eb00496.tar.bz2 |
re PR rtl-optimization/80463 (ICE with -fselective-scheduling2 and -fvar-tracking-assignments)
PR rtl-optimization/80463
PR rtl-optimization/83972
PR rtl-optimization/83480
* sel-sched-ir.c (has_dependence_note_mem_dep): Take into account the
correct producer for the insn.
(tidy_control_flow): Fixup seqnos in case of debug insns.
* gcc.dg/pr80463.c: New test.
* g++.dg/pr80463.C: Likewise.
* gcc.dg/pr83972.c: Likewise.
From-SVN: r259231
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/sel-sched-ir.c | 34 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/pr80463.C | 20 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr80463.c | 54 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr83972.c | 26 |
6 files changed, 149 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a22c610..eef1fe4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,15 @@ 2018-04-09 Andrey Belevantsev <abel@ispras.ru> + PR rtl-optimization/80463 + PR rtl-optimization/83972 + PR rtl-optimization/83480 + + * sel-sched-ir.c (has_dependence_note_mem_dep): Take into account the + correct producer for the insn. + (tidy_control_flow): Fixup seqnos in case of debug insns. + +2018-04-09 Andrey Belevantsev <abel@ispras.ru> + PR rtl-optimization/83913 * sel-sched-ir.c (merge_expr_data): Choose the middle between two diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 6f1e5a1..ee97052 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -3297,11 +3297,22 @@ has_dependence_note_mem_dep (rtx mem ATTRIBUTE_UNUSED, /* Note a dependence. */ static void -has_dependence_note_dep (insn_t pro ATTRIBUTE_UNUSED, - ds_t ds ATTRIBUTE_UNUSED) -{ - if (!sched_insns_conditions_mutex_p (has_dependence_data.pro, - VINSN_INSN_RTX (has_dependence_data.con))) +has_dependence_note_dep (insn_t pro, ds_t ds ATTRIBUTE_UNUSED) +{ + insn_t real_pro = has_dependence_data.pro; + insn_t real_con = VINSN_INSN_RTX (has_dependence_data.con); + + /* We do not allow for debug insns to move through others unless they + are at the start of bb. This movement may create bookkeeping copies + that later would not be able to move up, violating the invariant + that a bookkeeping copy should be movable as the original insn. + Detect that here and allow that movement if we allowed it before + in the first place. */ + if (DEBUG_INSN_P (real_con) + && INSN_UID (NEXT_INSN (pro)) == INSN_UID (real_con)) + return; + + if (!sched_insns_conditions_mutex_p (real_pro, real_con)) { ds_t *dsp = &has_dependence_data.has_dep_p[has_dependence_data.where]; @@ -3898,6 +3909,19 @@ tidy_control_flow (basic_block xbb, bool full_tidying) gcc_assert (EDGE_SUCC (xbb->prev_bb, 0)->flags & EDGE_FALLTHRU); + /* We could have skipped some debug insns which did not get removed with the block, + and the seqnos could become incorrect. Fix them up here. */ + if (MAY_HAVE_DEBUG_INSNS && (sel_bb_head (xbb) != first || sel_bb_end (xbb) != last)) + { + if (!sel_bb_empty_p (xbb->prev_bb)) + { + int prev_seqno = INSN_SEQNO (sel_bb_end (xbb->prev_bb)); + if (prev_seqno > INSN_SEQNO (sel_bb_head (xbb))) + for (insn_t insn = sel_bb_head (xbb); insn != first; insn = NEXT_INSN (insn)) + INSN_SEQNO (insn) = prev_seqno + 1; + } + } + /* It can turn out that after removing unused jump, basic block that contained that jump, becomes empty too. In such case remove it too. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2de94af..f89ddfe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,15 @@ 2018-04-09 Andrey Belevantsev <abel@ispras.ru> + PR rtl-optimization/80463 + PR rtl-optimization/83972 + PR rtl-optimization/83480 + + * gcc.dg/pr80463.c: New test. + * g++.dg/pr80463.C: Likewise. + * gcc.dg/pr83972.c: Likewise. + +2018-04-09 Andrey Belevantsev <abel@ispras.ru> + PR rtl-optimization/83913 * gcc.dg/pr83913.c: New test. diff --git a/gcc/testsuite/g++.dg/pr80463.C b/gcc/testsuite/g++.dg/pr80463.C new file mode 100644 index 0000000..f4ea65a --- /dev/null +++ b/gcc/testsuite/g++.dg/pr80463.C @@ -0,0 +1,20 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */ +/* { dg-options "-g -fselective-scheduling2 -O2 -fvar-tracking-assignments" } */ + +int *a; +int b, c; +void +d () +{ + for (int e; c; e++) + switch (e) + { + case 0: + a[e] = 1; + case 1: + b = 2; + break; + default: + a[e] = 3; + } +} diff --git a/gcc/testsuite/gcc.dg/pr80463.c b/gcc/testsuite/gcc.dg/pr80463.c new file mode 100644 index 0000000..cebf2fe --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr80463.c @@ -0,0 +1,54 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */ +/* { dg-options "-g -O2 -fvar-tracking-assignments -fselective-scheduling2 -ftree-loop-vectorize -fnon-call-exceptions -fno-tree-vrp -fno-gcse-lm -fno-tree-loop-im -fno-reorder-blocks-and-partition -fno-reorder-blocks -fno-move-loop-invariants -w" } */ + +short int t2; +int cd, aa, ft; + +void +dh (void) +{ + int qs = 0; + + if (t2 < 1) + { + int bq = 0; + + while (bq < 1) + { + } + + while (t2 < 1) + { + if (t2 == 0) + { + bq = 0; + cd = !!cd; + } + else + { + bq = 1; + cd = bq > qs; + } + + t2 += cd; + bq = (t2 / qs) == bq; + + if (aa != ft) + { + qs %= 0; + while (bq != 0) + { + ro: + ; + } + } + + ++t2; + } + + ia: + goto ro; + } + + goto ia; +} diff --git a/gcc/testsuite/gcc.dg/pr83972.c b/gcc/testsuite/gcc.dg/pr83972.c new file mode 100644 index 0000000..b8de42c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83972.c @@ -0,0 +1,26 @@ +/* { dg-do compile { target powerpc*-*-* ia64-*-* i?86-*-* x86_64-*-* } } */ +/* { dg-options "-O1 -fschedule-insns -fselective-scheduling -fsel-sched-pipelining -fvar-tracking-assignments -funroll-loops -fno-tree-dominator-opts -w" } */ + +int s7, p0; + +void +i0 (int ke) +{ + while (ke < 1) + { + if (s7 == 0) + p0 = 0; + else + { + if (p0 == 0) + s7 = 0; + + if (!!s7 || !!p0) + s7 = 0; + else + p0 = 0; + } + + ++ke; + } +} |