[llvm] [IndVarSimplify] Allow predicateLoopExit on some loops with local writes (PR #155901)
Florian Mayer via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 29 13:18:58 PDT 2025
================
@@ -1816,11 +1821,31 @@ bool IndVarSimplify::predicateLoopExits(Loop *L, SCEVExpander &Rewriter) {
// suggestions on how to improve this? I can obviously bail out for outer
// loops, but that seems less than ideal. MemorySSA can find memory writes,
// is that enough for *all* side effects?
+ bool HasLocalSideEffects = false;
for (BasicBlock *BB : L->blocks())
for (auto &I : *BB)
// TODO:isGuaranteedToTransfer
- if (I.mayHaveSideEffects())
- return false;
+ if (I.mayHaveSideEffects()) {
+ if (!LoopPredicationTraps)
+ return false;
+ HasLocalSideEffects = true;
+ if (StoreInst *SI = dyn_cast<StoreInst>(&I)) {
+ // The local could have leaked out of the function, so we need to
+ // consider atomic operations as effects.
+ // Because we need to preserve the relative order of volatile
+ // accesses, turn off this optimization if we see any of them.
+ // TODO:
+ // We could be smarter about volatile, and check whether the
+ // reordering is valid.
+ // We also could be smarter about atomic, and check whether the
+ // local has leaked.
+ if (SI->isAtomic() || SI->isVolatile() ||
----------------
fmayer wrote:
Done
https://github.com/llvm/llvm-project/pull/155901
More information about the llvm-commits
mailing list