[llvm] [Verifier] Reject incorrect types in assume operand bundles (PR #196446)

Nikolas Klauser via llvm-commits llvm-commits at lists.llvm.org
Sun May 10 02:51:55 PDT 2026


https://github.com/philnik777 updated https://github.com/llvm/llvm-project/pull/196446

>From b5d34438aaacac4b4c24b94ba058ca756ddfac41 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 8 May 2026 01:29:19 +0200
Subject: [PATCH 1/5] [Verifier] Reject incorrect types in assume operand
 bundles

---
 llvm/lib/IR/Verifier.cpp             | 21 +++++++++++++++++++--
 llvm/test/Verifier/assume-bundles.ll |  2 ++
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 2ea113fe665d9..b7b4eac422bc1 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -5994,11 +5994,28 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
               Call);
         continue;
       }
-      Check(Elem.Tag->getKey() == "ignore" ||
-                Attribute::isExistingAttribute(Elem.Tag->getKey()),
+      if (Elem.Tag->getKey() == "ignore")
+        break;
+      Check(Attribute::isExistingAttribute(Elem.Tag->getKey()),
             "tags must be valid attribute names", Call);
       Attribute::AttrKind Kind =
           Attribute::getAttrKindFromName(Elem.Tag->getKey());
+
+      // Reject assume bundles with incorrect types
+      if (Elem.Begin != Elem.End) {
+        AttributeSet AS = AttributeSet().addAttribute(Context, Kind);
+        AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(
+            Call.getOperand(Elem.Begin)->getType(), AS);
+        for (Attribute Attr : AS) {
+          if (!Attr.isStringAttribute() &&
+              IncompatibleAttrs.contains(Attr.getKindAsEnum())) {
+            CheckFailed("Attribute '" + Attr.getAsString() +
+                            "' applied to incompatible type!",
+                        Call.getOperand(Elem.Begin));
+          }
+        }
+      }
+
       if (Kind == Attribute::Alignment) {
         Check(ArgCount <= 3 && ArgCount >= 2,
               "alignment assumptions should have 2 or 3 arguments", Call);
diff --git a/llvm/test/Verifier/assume-bundles.ll b/llvm/test/Verifier/assume-bundles.ll
index 728b118c99fb6..00032fd3955c7 100644
--- a/llvm/test/Verifier/assume-bundles.ll
+++ b/llvm/test/Verifier/assume-bundles.ll
@@ -34,5 +34,7 @@ define void @func(ptr %P, i32 %P1, ptr %P2, ptr %P3, i1 %cond) {
   call void @llvm.assume(i1 true) ["align"(ptr %P, i32 4), "dereferenceable"(ptr %P)]
 ; CHECK: assume with operand bundles must have i1 true condition
   call void @llvm.assume(i1 %cond) ["nonnull"(ptr %P)]
+; CHECK: Attribute 'nonnull' applied to incompatible type!
+  call void @llvm.assume(i1 true) ["nonnull"(i1 true)]
   ret void
 }

>From d64c411087a4f6ab15c4299bf98a1f2ebf6867e0 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Fri, 8 May 2026 21:07:00 +0200
Subject: [PATCH 2/5] Address comments

---
 llvm/lib/IR/Verifier.cpp | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index b7b4eac422bc1..6a026f8d9cf63 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -6006,13 +6006,10 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
         AttributeSet AS = AttributeSet().addAttribute(Context, Kind);
         AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(
             Call.getOperand(Elem.Begin)->getType(), AS);
-        for (Attribute Attr : AS) {
-          if (!Attr.isStringAttribute() &&
-              IncompatibleAttrs.contains(Attr.getKindAsEnum())) {
-            CheckFailed("Attribute '" + Attr.getAsString() +
-                            "' applied to incompatible type!",
-                        Call.getOperand(Elem.Begin));
-          }
+        if (IncompatibleAttrs.contains(AS.begin()->getKindAsEnum())) {
+          CheckFailed("Attribute '" + AS.begin()->getAsString() +
+                          "' applied to incompatible type!",
+                      Call.getOperand(Elem.Begin));
         }
       }
 

>From b629e44ca061d0d9a7e41b9cebb5543c5d9ee2a6 Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Sun, 10 May 2026 11:25:02 +0200
Subject: [PATCH 3/5] Address comments

---
 llvm/lib/IR/Verifier.cpp             | 5 +++--
 llvm/test/Verifier/assume-bundles.ll | 4 ++++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 6a026f8d9cf63..e1909ef3df01b 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -6006,8 +6006,9 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
         AttributeSet AS = AttributeSet().addAttribute(Context, Kind);
         AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(
             Call.getOperand(Elem.Begin)->getType(), AS);
-        if (IncompatibleAttrs.contains(AS.begin()->getKindAsEnum())) {
-          CheckFailed("Attribute '" + AS.begin()->getAsString() +
+        if (auto AttrKind = AS.begin()->getKindAsEnum();
+            IncompatibleAttrs.contains(AttrKind)) {
+          CheckFailed("Attribute '" + Attribute::getNameFromAttrKind(AttrKind) +
                           "' applied to incompatible type!",
                       Call.getOperand(Elem.Begin));
         }
diff --git a/llvm/test/Verifier/assume-bundles.ll b/llvm/test/Verifier/assume-bundles.ll
index 00032fd3955c7..29e205a79e7a7 100644
--- a/llvm/test/Verifier/assume-bundles.ll
+++ b/llvm/test/Verifier/assume-bundles.ll
@@ -36,5 +36,9 @@ define void @func(ptr %P, i32 %P1, ptr %P2, ptr %P3, i1 %cond) {
   call void @llvm.assume(i1 %cond) ["nonnull"(ptr %P)]
 ; CHECK: Attribute 'nonnull' applied to incompatible type!
   call void @llvm.assume(i1 true) ["nonnull"(i1 true)]
+; CHECK: Attribute 'align' applied to incompatible type!
+  call void @llvm.assume(i1 true) ["align"(i1 true)]
+; CHECK: Attribute 'dereferenceable' applied to incompatible type!
+  call void @llvm.assume(i1 true) ["dereferenceable"(i1 true)]
   ret void
 }

>From 5cc40c84141e703542821fc20f4286a2c5a80d8d Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Sun, 10 May 2026 11:40:03 +0200
Subject: [PATCH 4/5] Address comments

---
 llvm/lib/IR/Verifier.cpp | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index e1909ef3df01b..9c6e28aac075d 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -6017,8 +6017,6 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
       if (Kind == Attribute::Alignment) {
         Check(ArgCount <= 3 && ArgCount >= 2,
               "alignment assumptions should have 2 or 3 arguments", Call);
-        Check(Call.getOperand(Elem.Begin)->getType()->isPointerTy(),
-              "first argument should be a pointer", Call);
         Check(Call.getOperand(Elem.Begin + 1)->getType()->isIntegerTy(),
               "second argument should be an integer", Call);
         if (ArgCount == 3)
@@ -6029,8 +6027,6 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
       if (Kind == Attribute::Dereferenceable) {
         Check(ArgCount == 2,
               "dereferenceable assumptions should have 2 arguments", Call);
-        Check(Call.getOperand(Elem.Begin)->getType()->isPointerTy(),
-              "first argument should be a pointer", Call);
         Check(Call.getOperand(Elem.Begin + 1)->getType()->isIntegerTy(),
               "second argument should be an integer", Call);
         continue;

>From 53a1a6d23a87a49e99799c0bf0070b46d423cacb Mon Sep 17 00:00:00 2001
From: Nikolas Klauser <nikolasklauser at berlin.de>
Date: Sun, 10 May 2026 11:51:43 +0200
Subject: [PATCH 5/5] Address comments

---
 llvm/lib/IR/Verifier.cpp | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 9c6e28aac075d..4c2431bc04716 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -6003,12 +6003,11 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
 
       // Reject assume bundles with incorrect types
       if (Elem.Begin != Elem.End) {
-        AttributeSet AS = AttributeSet().addAttribute(Context, Kind);
         AttributeMask IncompatibleAttrs = AttributeFuncs::typeIncompatible(
-            Call.getOperand(Elem.Begin)->getType(), AS);
-        if (auto AttrKind = AS.begin()->getKindAsEnum();
-            IncompatibleAttrs.contains(AttrKind)) {
-          CheckFailed("Attribute '" + Attribute::getNameFromAttrKind(AttrKind) +
+            Call.getOperand(Elem.Begin)->getType(),
+            AttributeSet().addAttribute(Context, Kind));
+        if (IncompatibleAttrs.contains(Kind)) {
+          CheckFailed("Attribute '" + Attribute::getNameFromAttrKind(Kind) +
                           "' applied to incompatible type!",
                       Call.getOperand(Elem.Begin));
         }



More information about the llvm-commits mailing list