Teach the verifier to reject all non-constant arguments to the second

argument of the cttz and ctlz intrinsics.

llvm-svn: 146360
This commit is contained in:
Chandler Carruth 2011-12-12 04:36:02 +00:00
parent a31b95cacf
commit 026cc37e48
2 changed files with 22 additions and 0 deletions

View File

@ -1688,6 +1688,12 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) {
switch (ID) {
default:
break;
case Intrinsic::ctlz: // llvm.ctlz
case Intrinsic::cttz: // llvm.cttz
Assert1(isa<ConstantInt>(CI.getArgOperand(1)),
"is_zero_undef argument of bit counting intrinsics must be a "
"constant int", &CI);
break;
case Intrinsic::dbg_declare: { // llvm.dbg.declare
Assert1(CI.getArgOperand(0) && isa<MDNode>(CI.getArgOperand(0)),
"invalid llvm.dbg.declare intrinsic call 1", &CI);

View File

@ -0,0 +1,16 @@
; RUN: not llvm-as < %s -o /dev/null |& FileCheck %s
declare i32 @llvm.ctlz.i32(i32, i1)
declare i32 @llvm.cttz.i32(i32, i1)
define void @f(i32 %x, i1 %is_not_zero) {
entry:
; CHECK: is_zero_undef argument of bit counting intrinsics must be a constant int
; CHECK-NEXT: @llvm.ctlz.i32
call i32 @llvm.ctlz.i32(i32 %x, i1 %is_not_zero)
; CHECK: is_zero_undef argument of bit counting intrinsics must be a constant int
; CHECK-NEXT: @llvm.cttz.i32
call i32 @llvm.cttz.i32(i32 %x, i1 %is_not_zero)
ret void
}