From: Matt Arsenault Date: Wed, 13 Mar 2019 19:46:34 +0000 (+0000) Subject: Verifier: Make sure masked load/store alignment is a power of 2 X-Git-Tag: llvmorg-10-init~10041 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0253620f891086458e1acc51d691d324e1a50388;p=platform%2Fupstream%2Fllvm.git 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. llvm-svn: 356094 --- diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 44095bf..2ef091b 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -4500,11 +4500,13 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { Call); Value *Ptr = Call.getArgOperand(0); - // Value *Alignment = Call.getArgOperand(1); + ConstantInt *Alignment = cast(Call.getArgOperand(1)); Value *Mask = Call.getArgOperand(2); Value *PassThru = Call.getArgOperand(3); Assert(Mask->getType()->isVectorTy(), "masked_load: mask must be vector", Call); + Assert(Alignment->getValue().isPowerOf2(), + "masked_load: alignment must be a power of 2", Call); // DataTy is the overloaded type Type *DataTy = cast(Ptr->getType())->getElementType(); @@ -4520,10 +4522,12 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { case Intrinsic::masked_store: { Value *Val = Call.getArgOperand(0); Value *Ptr = Call.getArgOperand(1); - // Value *Alignment = Call.getArgOperand(2); + ConstantInt *Alignment = cast(Call.getArgOperand(2)); Value *Mask = Call.getArgOperand(3); Assert(Mask->getType()->isVectorTy(), "masked_store: mask must be vector", Call); + Assert(Alignment->getValue().isPowerOf2(), + "masked_store: alignment must be a power of 2", Call); // DataTy is the overloaded type Type *DataTy = cast(Ptr->getType())->getElementType(); diff --git a/llvm/test/Assembler/auto_upgrade_intrinsics.ll b/llvm/test/Assembler/auto_upgrade_intrinsics.ll index 175bac8..9ca4c48 100644 --- a/llvm/test/Assembler/auto_upgrade_intrinsics.ll +++ b/llvm/test/Assembler/auto_upgrade_intrinsics.ll @@ -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) { ; CHECK-LABEL: @tests.masked.store( ; 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 } diff --git a/llvm/test/Transforms/InstCombine/masked_intrinsics.ll b/llvm/test/Transforms/InstCombine/masked_intrinsics.ll index cd9b30b..c12851f 100644 --- a/llvm/test/Transforms/InstCombine/masked_intrinsics.ll +++ b/llvm/test/Transforms/InstCombine/masked_intrinsics.ll @@ -54,7 +54,7 @@ define void @store_zeromask(<2 x double>* %ptr, <2 x double> %val) { ; CHECK-LABEL: @store_zeromask( ; 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 } diff --git a/llvm/test/Verifier/masked-load.ll b/llvm/test/Verifier/masked-load.ll new file mode 100644 index 0000000..3b996797 --- /dev/null +++ b/llvm/test/Verifier/masked-load.ll @@ -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 +} diff --git a/llvm/test/Verifier/masked-store.ll b/llvm/test/Verifier/masked-store.ll new file mode 100644 index 0000000..cdc573d --- /dev/null +++ b/llvm/test/Verifier/masked-store.ll @@ -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 +}