[PATCH] D110634: [llvm] Update IR verifier to reject non-power-of-2 alignment assume bundles (PR48713).

Ryan Mansfield via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 28 08:50:46 PDT 2021


rmansfield created this revision.
rmansfield added a reviewer: jdoerfert.
Herald added subscribers: dexonsmith, hiraditya.
rmansfield requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D110634

Files:
  llvm/lib/IR/Verifier.cpp
  llvm/test/Verifier/assume-bundles.ll


Index: llvm/test/Verifier/assume-bundles.ll
===================================================================
--- llvm/test/Verifier/assume-bundles.ll
+++ llvm/test/Verifier/assume-bundles.ll
@@ -8,7 +8,7 @@
   call void @llvm.assume(i1 true) ["adazdazd"()]
 ; CHECK: the second argument should be a constant integral value
   call void @llvm.assume(i1 true) ["dereferenceable"(i32* %P, i32 %P1)]
-; CHECK: to many arguments
+; CHECK: too many arguments
   call void @llvm.assume(i1 true) ["dereferenceable"(i32* %P, i32 8, i32 8)]
 ; CHECK: this attribute should have 2 arguments
   call void @llvm.assume(i1 true) ["dereferenceable"(i32* %P)]
@@ -21,6 +21,8 @@
   call void @llvm.assume(i1 true) ["align"(i32* %P, i32 %P1, i32 4, i32 4)]
 ; CHECK: second argument should be an integer
   call void @llvm.assume(i1 true) ["align"(i32* %P, i32* %P2)]
+; CHECK: alignment must be a power of 2
+  call void @llvm.assume(i1 true) ["align"(i32* %P, i32 7)]
 ; CHECK: third argument should be an integer if present
   call void @llvm.assume(i1 true) ["align"(i32* %P, i32 %P1, i32* %P2)]
   ret void
Index: llvm/lib/IR/Verifier.cpp
===================================================================
--- llvm/lib/IR/Verifier.cpp
+++ llvm/lib/IR/Verifier.cpp
@@ -4663,12 +4663,17 @@
                "first argument should be a pointer");
         Assert(Call.getOperand(Elem.Begin + 1)->getType()->isIntegerTy(),
                "second argument should be an integer");
+        ConstantInt *Alignment =
+            dyn_cast<ConstantInt>(Call.getOperand(Elem.Begin + 1));
+        if (Alignment)
+          Assert(Alignment->getValue().isPowerOf2(),
+                 "alignment must be a power of 2", Call);
         if (ArgCount == 3)
           Assert(Call.getOperand(Elem.Begin + 2)->getType()->isIntegerTy(),
                  "third argument should be an integer if present");
         return;
       }
-      Assert(ArgCount <= 2, "to many arguments");
+      Assert(ArgCount <= 2, "too many arguments");
       if (Kind == Attribute::None)
         break;
       if (Attribute::isIntAttrKind(Kind)) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D110634.375592.patch
Type: text/x-patch
Size: 2106 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210928/a03f760e/attachment.bin>


More information about the llvm-commits mailing list