mirror of
https://github.com/RPCS3/llvm.git
synced 2025-03-02 15:45:44 +00:00
Verifier: Make sure masked load/store alignment is a power of 2
The same should also be done for scatter/gather, but the verifier doesn't check those at all now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356094 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
892b8f0cdb
commit
39c8bbd622
@ -4500,11 +4500,13 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
|
|||||||
Call);
|
Call);
|
||||||
|
|
||||||
Value *Ptr = Call.getArgOperand(0);
|
Value *Ptr = Call.getArgOperand(0);
|
||||||
// Value *Alignment = Call.getArgOperand(1);
|
ConstantInt *Alignment = cast<ConstantInt>(Call.getArgOperand(1));
|
||||||
Value *Mask = Call.getArgOperand(2);
|
Value *Mask = Call.getArgOperand(2);
|
||||||
Value *PassThru = Call.getArgOperand(3);
|
Value *PassThru = Call.getArgOperand(3);
|
||||||
Assert(Mask->getType()->isVectorTy(), "masked_load: mask must be vector",
|
Assert(Mask->getType()->isVectorTy(), "masked_load: mask must be vector",
|
||||||
Call);
|
Call);
|
||||||
|
Assert(Alignment->getValue().isPowerOf2(),
|
||||||
|
"masked_load: alignment must be a power of 2", Call);
|
||||||
|
|
||||||
// DataTy is the overloaded type
|
// DataTy is the overloaded type
|
||||||
Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
|
Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
|
||||||
@ -4520,10 +4522,12 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
|
|||||||
case Intrinsic::masked_store: {
|
case Intrinsic::masked_store: {
|
||||||
Value *Val = Call.getArgOperand(0);
|
Value *Val = Call.getArgOperand(0);
|
||||||
Value *Ptr = Call.getArgOperand(1);
|
Value *Ptr = Call.getArgOperand(1);
|
||||||
// Value *Alignment = Call.getArgOperand(2);
|
ConstantInt *Alignment = cast<ConstantInt>(Call.getArgOperand(2));
|
||||||
Value *Mask = Call.getArgOperand(3);
|
Value *Mask = Call.getArgOperand(3);
|
||||||
Assert(Mask->getType()->isVectorTy(), "masked_store: mask must be vector",
|
Assert(Mask->getType()->isVectorTy(), "masked_store: mask must be vector",
|
||||||
Call);
|
Call);
|
||||||
|
Assert(Alignment->getValue().isPowerOf2(),
|
||||||
|
"masked_store: alignment must be a power of 2", Call);
|
||||||
|
|
||||||
// DataTy is the overloaded type
|
// DataTy is the overloaded type
|
||||||
Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
|
Type *DataTy = cast<PointerType>(Ptr->getType())->getElementType();
|
||||||
|
@ -80,7 +80,7 @@ declare void @llvm.masked.store.v2f64(<2 x double> %val, <2 x double>* %ptrs, i3
|
|||||||
define void @tests.masked.store(<2 x double>* %ptr, <2 x i1> %mask, <2 x double> %val) {
|
define void @tests.masked.store(<2 x double>* %ptr, <2 x i1> %mask, <2 x double> %val) {
|
||||||
; CHECK-LABEL: @tests.masked.store(
|
; CHECK-LABEL: @tests.masked.store(
|
||||||
; CHECK: @llvm.masked.store.v2f64.p0v2f64
|
; CHECK: @llvm.masked.store.v2f64.p0v2f64
|
||||||
call void @llvm.masked.store.v2f64(<2 x double> %val, <2 x double>* %ptr, i32 3, <2 x i1> %mask)
|
call void @llvm.masked.store.v2f64(<2 x double> %val, <2 x double>* %ptr, i32 4, <2 x i1> %mask)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ define void @store_zeromask(<2 x double>* %ptr, <2 x double> %val) {
|
|||||||
; CHECK-LABEL: @store_zeromask(
|
; CHECK-LABEL: @store_zeromask(
|
||||||
; CHECK-NEXT: ret void
|
; CHECK-NEXT: ret void
|
||||||
;
|
;
|
||||||
call void @llvm.masked.store.v2f64.p0v2f64(<2 x double> %val, <2 x double>* %ptr, i32 3, <2 x i1> zeroinitializer)
|
call void @llvm.masked.store.v2f64.p0v2f64(<2 x double> %val, <2 x double>* %ptr, i32 4, <2 x i1> zeroinitializer)
|
||||||
ret void
|
ret void
|
||||||
|
|
||||||
}
|
}
|
||||||
|
10
test/Verifier/masked-load.ll
Normal file
10
test/Verifier/masked-load.ll
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
declare <2 x double> @llvm.masked.load.v2f64.p0v2f64(<2 x double>*, i32, <2 x i1>, <2 x double>)
|
||||||
|
|
||||||
|
define <2 x double> @masked_load(<2 x i1> %mask, <2 x double>* %addr, <2 x double> %dst) {
|
||||||
|
; CHECK: masked_load: alignment must be a power of 2
|
||||||
|
; CHECK-NEXT: %res = call <2 x double> @llvm.masked.load.v2f64.p0v2f64(<2 x double>* %addr, i32 3, <2 x i1> %mask, <2 x double> %dst)
|
||||||
|
%res = call <2 x double> @llvm.masked.load.v2f64.p0v2f64(<2 x double>* %addr, i32 3, <2 x i1>%mask, <2 x double> %dst)
|
||||||
|
ret <2 x double> %res
|
||||||
|
}
|
10
test/Verifier/masked-store.ll
Normal file
10
test/Verifier/masked-store.ll
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
declare void @llvm.masked.store.v4i32.p0v4i32(<4 x i32>, <4 x i32>*, i32, <4 x i1>)
|
||||||
|
|
||||||
|
define void @masked_store(<4 x i1> %mask, <4 x i32>* %addr, <4 x i32> %val) {
|
||||||
|
; CHECK: masked_store: alignment must be a power of 2
|
||||||
|
; CHECK-NEXT: call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %val, <4 x i32>* %addr, i32 3, <4 x i1> %mask)
|
||||||
|
call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %val, <4 x i32>* %addr, i32 3, <4 x i1> %mask)
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user