aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-10-23 11:25:17 +0200
committerRichard Biener <rguenther@suse.de>2023-10-23 12:32:00 +0200
commitd96bd4aade170fcd86f5f09b68b770dde798e631 (patch)
tree7c279d74aa1be4649df8b1bcf93af9b2a22a4cd7
parent0c4bd1321a6def5eb44c530e83b01a415633b660 (diff)
downloadgcc-d96bd4aade170fcd86f5f09b68b770dde798e631.zip
gcc-d96bd4aade170fcd86f5f09b68b770dde798e631.tar.gz
gcc-d96bd4aade170fcd86f5f09b68b770dde798e631.tar.bz2
tree-optimization/111917 - bougs IL after guard hoisting
The unswitching code to hoist guards inserts conditions in wrong places. The following fixes this, simplifying code. 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.
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr111917.c23
-rw-r--r--gcc/tree-ssa-loop-unswitch.cc5
2 files changed, 24 insertions, 4 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr111917.c b/gcc/testsuite/gcc.dg/torture/pr111917.c
new file mode 100644
index 0000000..532e302
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr111917.c
@@ -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(); }
diff --git a/gcc/tree-ssa-loop-unswitch.cc b/gcc/tree-ssa-loop-unswitch.cc
index 619b50f..b4611ac 100644
--- a/gcc/tree-ssa-loop-unswitch.cc
+++ b/gcc/tree-ssa-loop-unswitch.cc
@@ -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),