new file mode 100644
@@ -0,0 +1,17 @@
+// { dg-do compile }
+// { dg-require-effective-target vect_int }
+
+inline const int& maxx (const int& a, const int &b)
+{
+ return a > b ? a : b;
+}
+
+int foo(int *a)
+{
+ int max = 0;
+ for (int i = 0; i < 1024; ++i)
+ max = maxx(max, a[i]);
+ return max;
+}
+
+// { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" { xfail vect_no_int_min_max } } }
@@ -3734,7 +3734,7 @@ tree_if_conversion (class loop *loop, vec<gimple *> *preds)
auto_vec <gassign *, 4> reads_to_lower;
auto_vec <gassign *, 4> writes_to_lower;
bitmap exit_bbs;
- edge pe;
+ edge pe, e;
auto_vec<data_reference_p, 10> refs;
bool loop_versioned;
@@ -3894,11 +3894,13 @@ tree_if_conversion (class loop *loop, vec<gimple *> *preds)
/* Perform local CSE, this esp. helps the vectorizer analysis if loads
and stores are involved. CSE only the loop body, not the entry
PHIs, those are to be kept in sync with the non-if-converted copy.
+ Do this by adding a fake entry edge - we do want to include the
+ latch as otherwise copies on a reduction path cannot be propagated out.
??? We'll still keep dead stores though. */
+ e = make_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), loop->header, EDGE_FAKE);
exit_bbs = BITMAP_ALLOC (NULL);
for (edge exit : get_loop_exit_edges (loop))
bitmap_set_bit (exit_bbs, exit->dest->index);
- bitmap_set_bit (exit_bbs, loop->latch->index);
std::pair <tree, tree> *name_pair;
unsigned ssa_names_idx;
@@ -3908,6 +3910,9 @@ tree_if_conversion (class loop *loop, vec<gimple *> *preds)
todo |= do_rpo_vn (cfun, loop_preheader_edge (loop), exit_bbs);
+ /* Remove the fake edge again. */
+ remove_edge (e);
+
/* Delete dead predicate computations. */
ifcvt_local_dce (loop);
BITMAP_FREE (exit_bbs);