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. */
}
/* 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
/* 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;
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))
tree_ssa_prefetch_arrays (void)
{
bool unrolled = false;
+ bool need_lc_ssa_update = false;
int todo_flags = 0;
if (!targetm.have_prefetch ()
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 ();