From 8af01c66fb6123572bd534d8e912031fcb681a48 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 25 May 2016 16:25:35 -0600 Subject: [PATCH] re PR tree-optimization/71272 (internal compiler error: in operator[], through tree-ssa-threadupdate.c:1981) PR tree-optimization/71272 * tree-ssa-threadbackward.c (convert_and_register_jump_thread_path): Update comments. Add test for empty path. PR tree-optimization/71272 * gcc.c-torture/compile/pr71272.c: new test. From-SVN: r236755 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr71272.c | 33 +++++++++++++++++++ gcc/tree-ssa-threadbackward.c | 20 +++++++++++ 4 files changed, 64 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr71272.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 27eeee4189e..a3c4d902bec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-05-25 Jeff Law + + PR tree-optimization/71272 + * tree-ssa-threadbackward.c (convert_and_register_jump_thread_path): + Update comments. Add test for empty path. + 2016-05-25 Bill Seurer * config/rs6000/altivec.h (vec_cmpne): Add #define for vec_cmpne. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 30b5d2576b4..61c064f9867 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-05-25 Jeff Law + + PR tree-optimization/71272 + * gcc.c-torture/compile/pr71272.c: new test. + 2016-05-25 Bill Seurer * gcc.target/powerpc/vec-cmpne.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr71272.c b/gcc/testsuite/gcc.c-torture/compile/pr71272.c new file mode 100644 index 00000000000..22f14981afb --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr71272.c @@ -0,0 +1,33 @@ +int a, b, c, d; + +int +f1 (int p1, int p2) +{ + return p1 - p2; +} + +void +f2 (short p1, short p2) +{ + for (;;) + { + if (5 < (1 ^ p2)) + for (; a;) + for (;;) + { + b = 0xE7BC92A3EDA01CD8 < (d = p2) || (0, 0); + break; + } + if (p1) + break; + p2 = 5; + } +} + +void +f3 (int x) +{ + int tmp = -2L; + c = f1 (90, x != 10); + f2 (c, tmp); +} diff --git a/gcc/tree-ssa-threadbackward.c b/gcc/tree-ssa-threadbackward.c index 4d0fd9cac57..636b67da42d 100644 --- a/gcc/tree-ssa-threadbackward.c +++ b/gcc/tree-ssa-threadbackward.c @@ -373,6 +373,10 @@ convert_and_register_jump_thread_path (vec *&path, { basic_block bb1 = (*path)[path->length () - j - 1]; basic_block bb2 = (*path)[path->length () - j - 2]; + + /* This can happen when we have an SSA_NAME as a PHI argument and + its initialization block is the head of the PHI argument's + edge. */ if (bb1 == bb2) continue; @@ -382,6 +386,22 @@ convert_and_register_jump_thread_path (vec *&path, jump_thread_path->safe_push (x); } + /* As a consequence of the test for duplicate blocks in the path + above, we can get a path with no blocks. This happens if a + conditional can be fully evaluated at compile time using just + defining statements in the same block as the test. + + When we no longer push the block associated with a PHI argument + onto the stack, then this as well as the test in the loop above + can be removed. */ + if (jump_thread_path->length () == 0) + { + jump_thread_path->release (); + delete jump_thread_path; + path->pop (); + return; + } + /* Add the edge taken when the control variable has value ARG. */ jump_thread_edge *x = new jump_thread_edge (taken_edge, EDGE_NO_COPY_SRC_BLOCK); -- 2.30.2