[flang-commits] [flang] [Flang] Add opt-in affine loop optimization pipeline (PR #191854)
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Wed Apr 15 09:24:36 PDT 2026
================
@@ -278,6 +278,57 @@ static bool ivDoesNotEscape(ArrayRef<Value> ivAliases) {
return true;
}
+// ---- Check if a bound value can be safely rematerialized after the loop ---
+// Runs during analysis (pre-transformation) to reject nests whose bounds
+// contain ops that cannot be correctly duplicated after the outermost loop.
+//
+// Safe: values defined outside the outermost loop, loop IVs (block args of
+// fir.do_loop — resolved via ivFinalMap), fir.convert, arith constants,
+// and arithmetic over safe values. Loads of IV allocas are safe because
+// transformOneLoop will forward them to fir.convert(IV) before
+// rematerializeOutside runs.
+// Unsafe: fir.load of a non-IV address inside the loop — the memory may have
+// been modified between the original load and the post-loop insertion
+// point, so duplicating the load would read a wrong value.
+
+static bool canSafelyRematerialize(Value val, fir::DoLoopOp outermost,
+ ArrayRef<LoopIVInfo> infos) {
+ if (auto blockArg = dyn_cast<BlockArgument>(val)) {
+ auto *owner = blockArg.getOwner()->getParentOp();
+ if (!outermost->isAncestor(owner))
+ return true;
----------------
tblah wrote:
Does isAncestor return true when `owner == outermost`?
https://github.com/llvm/llvm-project/pull/191854
More information about the flang-commits
mailing list