mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
[Verifier] Add checks for masked.load and masked.store intrinsics
While trying to track down what appears to be a LoopVectorizer bug, I noticed that we had no validation of the correctness of calls emitted to @llvm.masked.load and @llvm.masked.store. This meant malformed IR was showing up much much later than it should. Hopefully, having Verifier rules in place will make this easier to isolate. llvm-svn: 260296
This commit is contained in:
parent
4c9e344480
commit
bcbb054410
@ -4048,6 +4048,44 @@ void Verifier::visitIntrinsicCallSite(Intrinsic::ID ID, CallSite CS) {
|
||||
"eh.exceptionpointer argument must be a catchpad", CS);
|
||||
break;
|
||||
}
|
||||
case Intrinsic::masked_load: {
|
||||
Assert(CS.getType()->isVectorTy(), "masked_load: must return a vector", CS);
|
||||
|
||||
Value *Ptr = CS.getArgOperand(0);
|
||||
//Value *Alignment = CS.getArgOperand(1);
|
||||
Value *Mask = CS.getArgOperand(2);
|
||||
Value *PassThru = CS.getArgOperand(3);
|
||||
Assert(Mask->getType()->isVectorTy(),
|
||||
"masked_load: mask must be vector", CS);
|
||||
|
||||
// DataTy is the overloaded type
|
||||
Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
|
||||
Assert(DataTy == CS.getType(),
|
||||
"masked_load: return must match pointer type", CS);
|
||||
Assert(PassThru->getType() == DataTy,
|
||||
"masked_load: pass through and data type must match", CS);
|
||||
Assert(Mask->getType()->getVectorNumElements() ==
|
||||
DataTy->getVectorNumElements(),
|
||||
"masked_load: vector mask must be same length as data", CS);
|
||||
break;
|
||||
}
|
||||
case Intrinsic::masked_store: {
|
||||
Value *Val = CS.getArgOperand(0);
|
||||
Value *Ptr = CS.getArgOperand(1);
|
||||
//Value *Alignment = CS.getArgOperand(2);
|
||||
Value *Mask = CS.getArgOperand(3);
|
||||
Assert(Mask->getType()->isVectorTy(),
|
||||
"masked_store: mask must be vector", CS);
|
||||
|
||||
// DataTy is the overloaded type
|
||||
Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
|
||||
Assert(DataTy == Val->getType(),
|
||||
"masked_store: storee must match pointer type", CS);
|
||||
Assert(Mask->getType()->getVectorNumElements() ==
|
||||
DataTy->getVectorNumElements(),
|
||||
"masked_store: vector mask must be same length as data", CS);
|
||||
break;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user