summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/MachineVerifier.cpp
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-08-13 15:52:21 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-08-13 15:52:21 +0000
commit0a04a062500e2c6d5b92b59c545db3f45e9daffe (patch)
treef7d822819221ac8eefc2f1ff606d35465558f601 /llvm/lib/CodeGen/MachineVerifier.cpp
parent5af9cf042f21d6b044f8925b581a8f089d739bc5 (diff)
downloadbcm5719-llvm-0a04a062500e2c6d5b92b59c545db3f45e9daffe.tar.gz
bcm5719-llvm-0a04a062500e2c6d5b92b59c545db3f45e9daffe.zip
GlobalISel: Add more verifier checks for G_SHUFFLE_VECTOR
llvm-svn: 368705
Diffstat (limited to 'llvm/lib/CodeGen/MachineVerifier.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineVerifier.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index ba2e72568b7..33d22469075 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -1395,12 +1395,46 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
}
const Constant *Mask = MaskOp.getShuffleMask();
+ auto *MaskVT = dyn_cast<VectorType>(Mask->getType());
+ if (!MaskVT || !MaskVT->getElementType()->isIntegerTy(32)) {
+ report("Invalid shufflemask constant type", MI);
+ break;
+ }
+
if (!Mask->getAggregateElement(0u)) {
report("Invalid shufflemask constant type", MI);
break;
}
- // TODO: Verify element numbers consistent
+ LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
+ LLT Src0Ty = MRI->getType(MI->getOperand(1).getReg());
+ LLT Src1Ty = MRI->getType(MI->getOperand(2).getReg());
+
+ if (Src0Ty != Src1Ty)
+ report("Source operands must be the same type", MI);
+
+ if (Src0Ty.getScalarType() != DstTy.getScalarType())
+ report("G_SHUFFLE_VECTOR cannot change element type", MI);
+
+ // Don't check that all operands are vector because scalars are used in
+ // place of 1 element vectors.
+ int SrcNumElts = Src0Ty.isVector() ? Src0Ty.getNumElements() : 1;
+ int DstNumElts = DstTy.isVector() ? DstTy.getNumElements() : 1;
+
+ SmallVector<int, 32> MaskIdxes;
+ ShuffleVectorInst::getShuffleMask(Mask, MaskIdxes);
+
+ if (static_cast<int>(MaskIdxes.size()) != DstNumElts)
+ report("Wrong result type for shufflemask", MI);
+
+ for (int Idx : MaskIdxes) {
+ if (Idx < 0)
+ continue;
+
+ if (Idx >= 2 * SrcNumElts)
+ report("Out of bounds shuffle index", MI);
+ }
+
break;
}
default:
OpenPOWER on IntegriCloud