tree-optimization/111917 - bougs IL after guard hoisting
Checks
Commit Message
The unswitching code to hoist guards inserts conditions in wrong
places. The following fixes this, simplifying code.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.
PR tree-optimization/111917
* tree-ssa-loop-unswitch.cc (hoist_guard): Always insert
new conditional after last stmt.
* gcc.dg/torture/pr111917.c: New testcase.
---
gcc/testsuite/gcc.dg/torture/pr111917.c | 23 +++++++++++++++++++++++
gcc/tree-ssa-loop-unswitch.cc | 5 +----
2 files changed, 24 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/torture/pr111917.c
new file mode 100644
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-funswitch-loops" } */
+
+long t;
+long a() {
+ long b = t, c = t;
+ for (; b < 31; b++)
+ c <<= 1;
+ return c;
+}
+long t1;
+static
+int d() {
+ if (!t1)
+ return 0;
+e:
+f:
+ for (; a();)
+ ;
+ goto f;
+ return 0;
+}
+int main() { d(); }
@@ -1455,10 +1455,7 @@ hoist_guard (class loop *loop, edge guard)
cond_stmt = as_a <gcond *> (stmt);
extract_true_false_edges_from_block (guard_bb, &te, &fe);
/* Insert guard to PRE_HEADER. */
- if (!empty_block_p (pre_header))
- gsi = gsi_last_bb (pre_header);
- else
- gsi = gsi_start_bb (pre_header);
+ gsi = gsi_last_bb (pre_header);
/* Create copy of COND_STMT. */
new_cond_stmt = gimple_build_cond (gimple_cond_code (cond_stmt),
gimple_cond_lhs (cond_stmt),