[llvm] [llvm] Support invariant.load on readonly intrinsics (PR #205916)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 5 08:50:44 PDT 2026
================
@@ -208,31 +210,47 @@ MemDepResult MemoryDependenceResults::getCallDependencyFrom(
ModRefInfo MR = GetLocation(Inst, Loc, TLI);
if (Loc.Ptr) {
// A simple instruction.
- if (isModOrRefSet(AA.getModRefInfo(Call, Loc)))
+ if (isModOrRefSet(AA.getModRefInfo(Call, Loc))) {
+ if (IsInvariantLoad)
+ continue;
return MemDepResult::getClobber(Inst);
+ }
continue;
}
if (auto *CallB = dyn_cast<CallBase>(Inst)) {
+ bool IsIdenticalReadOnlyCall = isReadOnlyCall && !isModSet(MR) &&
+ Call->isIdenticalToWhenDefined(CallB);
+
+ // An identical earlier invariant load-like call is an available value
+ // even if AA sees both calls as reading the same memory.
+ if (IsInvariantLoad && IsIdenticalReadOnlyCall)
+ return MemDepResult::getDef(Inst);
+
// If these two calls do not interfere, look past it.
if (isNoModRef(AA.getModRefInfo(Call, CallB))) {
// If the two calls are the same, return Inst as a Def, so that
// Call can be found redundant and eliminated.
- if (isReadOnlyCall && !isModSet(MR) &&
- Call->isIdenticalToWhenDefined(CallB))
+ if (IsIdenticalReadOnlyCall)
return MemDepResult::getDef(Inst);
// Otherwise if the two calls don't interact (e.g. CallB is readnone)
// keep scanning.
continue;
- } else
+ } else if (IsInvariantLoad) {
+ continue;
+ } else {
return MemDepResult::getClobber(Inst);
+ }
}
// If we could not obtain a pointer for the instruction and the instruction
// touches memory then assume that this is a dependency.
- if (isModOrRefSet(MR))
+ if (isModOrRefSet(MR)) {
+ if (IsInvariantLoad)
----------------
dtcxzyw wrote:
Is this path really reachable? Both load and intrinsic cases are handled above.
https://github.com/llvm/llvm-project/pull/205916
More information about the llvm-commits
mailing list