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.
--- /dev/null
+/* { 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(); }
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),