[llvm] [VPlan] Introduce ResumePhi VPInstruction, use to create phi for FOR. (PR #94760)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 11 04:52:20 PDT 2024
================
@@ -637,13 +651,35 @@ Value *VPInstruction::generatePerPart(VPTransformState &State, unsigned Part) {
Value *Addend = State.get(getOperand(1), Part, /* IsScalar */ true);
return Builder.CreatePtrAdd(Ptr, Addend, Name);
}
+ case VPInstruction::ResumePhi: {
+ if (Part != 0)
+ return State.get(this, 0, /*IsScalar*/ true);
+ Value *IncomingFromVPlanPred =
+ State.get(getOperand(0), Part, /* IsScalar */ true);
+ Value *IncomingFromOtherPreds =
+ State.get(getOperand(1), Part, /* IsScalar */ true);
+ auto *NewPhi =
+ Builder.CreatePHI(IncomingFromOtherPreds->getType(), 2, Name);
+ BasicBlock *VPlanPred =
+ State.CFG
+ .VPBB2IRBB[cast<VPBasicBlock>(getParent()->getSinglePredecessor())];
+ NewPhi->addIncoming(IncomingFromVPlanPred, VPlanPred);
+ for (auto *OtherPred : predecessors(Builder.GetInsertBlock())) {
+ assert(OtherPred != VPlanPred &&
+ "VPlan predecessors should not be connected yet");
+ NewPhi->addIncoming(IncomingFromOtherPreds, OtherPred);
+ }
+ return NewPhi;
+ }
+
default:
llvm_unreachable("Unsupported opcode for instruction");
}
}
bool VPInstruction::isVectorToScalar() const {
return getOpcode() == VPInstruction::ExtractFromEnd ||
+ getOpcode() == VPInstruction::ResumePhi ||
----------------
fhahn wrote:
Removed, superseded by isSingleScalar.
https://github.com/llvm/llvm-project/pull/94760
More information about the llvm-commits
mailing list