aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/ExpandVectorPredication.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@sifive.com>2025-09-05 22:00:55 -0700
committerGitHub <noreply@github.com>2025-09-05 22:00:55 -0700
commit0335eba6e8d3c03f65d770cb9cfd38ae85868341 (patch)
tree57c2819b15016c94180b017d32ec250c673203eb /llvm/lib/CodeGen/ExpandVectorPredication.cpp
parent151c6edd4592b78984f80f22ced1fef52b5e7ab1 (diff)
downloadllvm-0335eba6e8d3c03f65d770cb9cfd38ae85868341.zip
llvm-0335eba6e8d3c03f65d770cb9cfd38ae85868341.tar.gz
llvm-0335eba6e8d3c03f65d770cb9cfd38ae85868341.tar.bz2
[ExpandVectorPredication] Support vp.merge in foldEVLIntoMask. (#157195)
Partial fix for #157184. It still crashes later in SelectionDAG.
Diffstat (limited to 'llvm/lib/CodeGen/ExpandVectorPredication.cpp')
-rw-r--r--llvm/lib/CodeGen/ExpandVectorPredication.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/ExpandVectorPredication.cpp b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
index 753c656..5f79bd7 100644
--- a/llvm/lib/CodeGen/ExpandVectorPredication.cpp
+++ b/llvm/lib/CodeGen/ExpandVectorPredication.cpp
@@ -527,6 +527,12 @@ std::pair<Value *, bool> CachingVPExpander::foldEVLIntoMask(VPIntrinsic &VPI) {
// Only VP intrinsics can have an %evl parameter.
Value *OldMaskParam = VPI.getMaskParam();
+ if (!OldMaskParam) {
+ assert(VPI.getIntrinsicID() == Intrinsic::vp_merge &&
+ "Unexpected VP intrinsic without mask operand");
+ OldMaskParam = VPI.getArgOperand(0);
+ }
+
Value *OldEVLParam = VPI.getVectorLengthParam();
assert(OldMaskParam && "no mask param to fold the vl param into");
assert(OldEVLParam && "no EVL param to fold away");
@@ -538,7 +544,10 @@ std::pair<Value *, bool> CachingVPExpander::foldEVLIntoMask(VPIntrinsic &VPI) {
ElementCount ElemCount = VPI.getStaticVectorLength();
Value *VLMask = convertEVLToMask(Builder, OldEVLParam, ElemCount);
Value *NewMaskParam = Builder.CreateAnd(VLMask, OldMaskParam);
- VPI.setMaskParam(NewMaskParam);
+ if (VPI.getIntrinsicID() == Intrinsic::vp_merge)
+ VPI.setArgOperand(0, NewMaskParam);
+ else
+ VPI.setMaskParam(NewMaskParam);
// Drop the %evl parameter.
discardEVLParameter(VPI);