[llvm] [LV][VPlan] Add initial support for CSA vectorization (PR #121222)

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Sun Feb 9 14:13:40 PST 2025


================
@@ -706,6 +706,24 @@ Value *VPInstruction::generate(VPTransformState &State) {
         Builder.getInt64Ty(), Mask, true, "first.active.lane");
     return Builder.CreateExtractElement(Vec, Ctz, "early.exit.value");
   }
+  case VPInstruction::ConditionalScalarAssignmentMaskPhi: {
+    BasicBlock *PreheaderBB = State.CFG.getPreheaderBBFor(this);
+    Value *InitMask = State.get(getOperand(0));
+    PHINode *MaskPhi =
+        State.Builder.CreatePHI(InitMask->getType(), 2, "csa.mask.phi");
+    MaskPhi->addIncoming(InitMask, PreheaderBB);
+    State.set(this, MaskPhi);
+    return MaskPhi;
+  }
+  case VPInstruction::ConditionalScalarAssignmentMaskSel: {
+    Value *WidenedCond = State.get(getOperand(0));
+    Value *MaskPhi = State.get(getOperand(1));
+    Value *AnyOf = State.get(getOperand(2), /*NeedsScalar=*/true);
+    Value *MaskSel =
+        State.Builder.CreateSelect(AnyOf, WidenedCond, MaskPhi, "csa.mask.sel");
+    cast<PHINode>(MaskPhi)->addIncoming(MaskSel, State.CFG.PrevBB);
----------------
fhahn wrote:

Why is this needed? A recipe's execution shouldn't modify outside the IR generated by the reicpe.

Can we instead update MaskPhi via the VPlan Def-use chains?

https://github.com/llvm/llvm-project/pull/121222


More information about the llvm-commits mailing list