diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-08-13 15:52:21 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-08-13 15:52:21 +0000 |
commit | 0a04a062500e2c6d5b92b59c545db3f45e9daffe (patch) | |
tree | f7d822819221ac8eefc2f1ff606d35465558f601 /llvm/lib/CodeGen/MachineVerifier.cpp | |
parent | 5af9cf042f21d6b044f8925b581a8f089d739bc5 (diff) | |
download | bcm5719-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.cpp | 36 |
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: |