new file mode 100644
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fprefetch-loop-arrays --param l2-cache-size=0 --param prefetch-latency=3 -fprefetch-loop-arrays" } */
+
+int
+bar (void)
+{
+ /* No return statement. */
+}
+
+__attribute__ ((simd)) int
+foo (void)
+{
+ if (bar ())
+ return 0;
+
+ __builtin_unreachable ();
+}
@@ -1308,8 +1308,6 @@ emit_mfence_after_loop (class loop *loop)
gsi_insert_before (&bsi, call, GSI_NEW_STMT);
}
-
- update_ssa (TODO_update_ssa_only_virtuals);
}
/* Returns true if we can use storent in loop, false otherwise. */
@@ -1340,23 +1338,27 @@ may_use_storent_in_loop_p (class loop *loop)
}
/* Marks nontemporal stores in LOOP. GROUPS contains the description of memory
- references in the loop. */
+ references in the loop. Returns whether we inserted any mfence call. */
-static void
+static bool
mark_nontemporal_stores (class loop *loop, struct mem_ref_group *groups)
{
struct mem_ref *ref;
bool any = false;
if (!may_use_storent_in_loop_p (loop))
- return;
+ return false;
for (; groups; groups = groups->next)
for (ref = groups->refs; ref; ref = ref->next)
any |= mark_nontemporal_store (ref);
if (any && FENCE_FOLLOWING_MOVNT != NULL_TREE)
- emit_mfence_after_loop (loop);
+ {
+ emit_mfence_after_loop (loop);
+ return true;
+ }
+ return false;
}
/* Determines whether we can profitably unroll LOOP FACTOR times, and if
@@ -1874,10 +1876,11 @@ insn_to_prefetch_ratio_too_small_p (unsigned ninsns, unsigned prefetch_count,
/* Issue prefetch instructions for array references in LOOP. Returns
- true if the LOOP was unrolled. */
+ true if the LOOP was unrolled and updates NEED_LC_SSA_UPDATE if we need
+ to update SSA for virtual operands and LC SSA for a split edge. */
static bool
-loop_prefetch_arrays (class loop *loop)
+loop_prefetch_arrays (class loop *loop, bool &need_lc_ssa_update)
{
struct mem_ref_group *refs;
unsigned ahead, ninsns, time, unroll_factor;
@@ -1952,7 +1955,7 @@ loop_prefetch_arrays (class loop *loop)
unroll_factor))
goto fail;
- mark_nontemporal_stores (loop, refs);
+ need_lc_ssa_update |= mark_nontemporal_stores (loop, refs);
/* Step 4: what to prefetch? */
if (!schedule_prefetches (refs, unroll_factor, ahead))
@@ -1980,6 +1983,7 @@ unsigned int
tree_ssa_prefetch_arrays (void)
{
bool unrolled = false;
+ bool need_lc_ssa_update = false;
int todo_flags = 0;
if (!targetm.have_prefetch ()
@@ -2028,12 +2032,15 @@ tree_ssa_prefetch_arrays (void)
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Processing loop %d:\n", loop->num);
- unrolled |= loop_prefetch_arrays (loop);
+ unrolled |= loop_prefetch_arrays (loop, need_lc_ssa_update);
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\n\n");
}
+ if (need_lc_ssa_update)
+ rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa_only_virtuals);
+
if (unrolled)
{
scev_reset ();