+2018-03-08 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/84178
+ * tree-if-conv.c (combine_blocks): Move insert_gimplified_predicates
+ to caller.
+ (version_loop_for_if_conversion): Delay update_ssa call.
+ (tree_if_conversion): Delay update_ssa until after predicate
+ insertion.
+
2018-03-08 David Malcolm <dmalcolm@redhat.com>
PR tree-optimization/84178
+2018-03-08 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/84178
+ * gcc.dg/torture/pr84178-2.c: New testcase.
+
2018-03-08 David Malcolm <dmalcolm@redhat.com>
PR tree-optimization/84178
--- /dev/null
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-forwprop" } */
+
+int zy, h4;
+
+void
+r8 (long int mu, int *jr, int *fi, short int dv)
+{
+ do
+ {
+ int tx;
+
+ tx = !!h4 ? (zy + h4) : 1;
+ mu = tx;
+ *jr = (((unsigned char) mu > (254 >> dv)) ? 0 : (unsigned char) tx) + *fi;
+ } while (*jr == 0);
+
+ r8 (mu, jr, fi, 1);
+}
+
edge_iterator ei;
remove_conditions_and_labels (loop);
- insert_gimplified_predicates (loop);
predicate_all_scalar_phis (loop);
if (any_pred_load_store)
gsi = gsi_last_bb (cond_bb);
gimple_call_set_arg (g, 1, build_int_cst (integer_type_node, new_loop->num));
gsi_insert_before (&gsi, g, GSI_SAME_STMT);
- update_ssa (TODO_update_ssa);
return new_loop;
}
unsigned int todo = 0;
bool aggressive_if_conv;
struct loop *rloop;
+ bool need_update_ssa = false;
again:
rloop = NULL;
struct loop *nloop = version_loop_for_if_conversion (vloop);
if (nloop == NULL)
goto cleanup;
+ need_update_ssa = true;
if (vloop != loop)
{
/* If versionable_outer_loop_p decided to version the
}
}
+ /* Due to hard to fix issues we end up with immediate uses recorded
+ for not yet inserted predicates which will confuse SSA update so
+ we delayed this from after versioning to after predicate insertion. */
+ insert_gimplified_predicates (loop);
+ if (need_update_ssa)
+ update_ssa (TODO_update_ssa);
+
/* Now all statements are if-convertible. Combine all the basic
blocks into one huge basic block doing the if-conversion
on-the-fly. */