[GlobalISel] Fix crash when lowering G_SELECT of pointer vectors.
The bit masking lowering only works for vectors of scalars, so for pointer
element types we need to add some casting.
Differential Revision: https://reviews.llvm.org/D133672
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index ef66104..2a45cff 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -7231,6 +7231,15 @@
if (!DstTy.isVector())
return UnableToLegalize;
+ bool IsEltPtr = DstTy.getElementType().isPointer();
+ if (IsEltPtr) {
+ LLT ScalarPtrTy = LLT::scalar(DstTy.getScalarSizeInBits());
+ LLT NewTy = DstTy.changeElementType(ScalarPtrTy);
+ Op1Reg = MIRBuilder.buildPtrToInt(NewTy, Op1Reg).getReg(0);
+ Op2Reg = MIRBuilder.buildPtrToInt(NewTy, Op2Reg).getReg(0);
+ DstTy = NewTy;
+ }
+
if (MaskTy.isScalar()) {
// Turn the scalar condition into a vector condition mask.
@@ -7260,7 +7269,12 @@
auto NotMask = MIRBuilder.buildNot(MaskTy, MaskReg);
auto NewOp1 = MIRBuilder.buildAnd(MaskTy, Op1Reg, MaskReg);
auto NewOp2 = MIRBuilder.buildAnd(MaskTy, Op2Reg, NotMask);
- MIRBuilder.buildOr(DstReg, NewOp1, NewOp2);
+ if (IsEltPtr) {
+ auto Or = MIRBuilder.buildOr(DstTy, NewOp1, NewOp2);
+ MIRBuilder.buildIntToPtr(DstReg, Or);
+ } else {
+ MIRBuilder.buildOr(DstReg, NewOp1, NewOp2);
+ }
MI.eraseFromParent();
return Legalized;
}