Teach the verifier to reject all non-constant arguments to the second
authorChandler Carruth <chandlerc@gmail.com>
Mon, 12 Dec 2011 04:36:02 +0000 (04:36 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 12 Dec 2011 04:36:02 +0000 (04:36 +0000)
argument of the cttz and ctlz intrinsics.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146360 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Verifier.cpp
test/Verifier/cttz-undef-arg.ll [new file with mode: 0644]

index f74d762be94fdc7b26ef9443386692f8c5dc6f82..003de442d61af2ef5ffdaaba044f711d72b3081e 100644 (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);
diff --git a/test/Verifier/cttz-undef-arg.ll b/test/Verifier/cttz-undef-arg.ll
new file mode 100644 (file)
index 0000000..48cd061
--- /dev/null
@@ -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
+}