[llvm] [GVN] Teach GVN simple masked load/store forwarding (PR #157689)
Matthew Devereau via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 23 06:28:52 PDT 2025
================
@@ -2287,6 +2288,46 @@ bool GVNPass::processLoad(LoadInst *L) {
return true;
}
+// Attempt to process masked loads which have loaded from
+// masked stores with the same mask
+bool GVNPass::processMaskedLoad(IntrinsicInst *I) {
+ Value *Mask = I->getOperand(2);
+ Value *Passthrough = I->getOperand(3);
+
+ MemDepResult Dep = MD->getDependency(I);
+ Instruction *DepInst = Dep.getInst();
+ if (!DepInst || !Dep.isLocal())
+ return false;
+
+ Value *StoreVal;
+ if (!match(DepInst,
+ m_Intrinsic<Intrinsic::masked_store>(m_Value(StoreVal), m_Value(),
+ m_Value(), m_Specific(Mask))))
+ return false;
+
+ Value *OpToForward = nullptr;
+ if (match(StoreVal, m_MaskedLoad(m_Value(), m_Value(), m_Specific(Mask),
+ m_Specific(Passthrough))))
+ // For MaskedLoad->MaskedStore->MaskedLoad, the mask must be the same for
+ // all three instructions. The Passthrough on the two loads must also be the
+ // same.
+ OpToForward = AvailableValue::get(StoreVal).getSimpleValue();
+ else if (match(StoreVal, m_Intrinsic<Intrinsic::masked_load>()))
+ return false;
+ else {
+ // MaskedStore(Op, ptr, mask)->MaskedLoad(ptr, mask, passthrough) can be
+ // replaced with MaskedStore(Op, ptr, mask)->select(mask, Op, passthrough)
+ IRBuilder<> Builder(I);
+ OpToForward = Builder.CreateSelect(Mask, StoreVal, Passthrough);
+ }
+
+ I->replaceAllUsesWith(OpToForward);
+ ICF->removeUsersOf(I);
+ salvageAndRemoveInstruction(I);
----------------
MDevereau wrote:
```c++
if (MSSAU)
MSSAU->removeMemoryAccess(L);
```
This is indirectly called by
```c++
salvageAndRemoveInstruction(I)
//...
removeInstruction(I)
```
I've added the Pointer stuff though.
https://github.com/llvm/llvm-project/pull/157689
More information about the llvm-commits
mailing list