[PATCH] D94433: Do not emit non-power-of-2 alignment assume bundles (PR48713).

Ryan Mansfield via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 6 09:43:42 PDT 2021


rmansfield updated this revision to Diff 364826.
rmansfield retitled this revision from "[ValueTracking] Check that alignment is non-zero in computeKnownBitsFromAssume (PR48713)." to "Do not emit non-power-of-2 alignment assume bundles  (PR48713).".
rmansfield edited the summary of this revision.
Herald added a subscriber: dexonsmith.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94433/new/

https://reviews.llvm.org/D94433

Files:
  clang/lib/CodeGen/CGCall.cpp
  clang/test/CodeGen/non-power-of-2-alignment-assumptions.c
  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
@@ -4610,12 +4610,16 @@
                "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)) {
Index: clang/test/CodeGen/non-power-of-2-alignment-assumptions.c
===================================================================
--- clang/test/CodeGen/non-power-of-2-alignment-assumptions.c
+++ clang/test/CodeGen/non-power-of-2-alignment-assumptions.c
@@ -21,7 +21,6 @@
 // CHECK-NEXT:    [[ALIGN_ADDR:%.*]] = alloca i32, align 4
 // CHECK-NEXT:    store i32 [[ALIGN:%.*]], i32* [[ALIGN_ADDR]], align 4
 // CHECK-NEXT:    [[CALL:%.*]] = call i8* @alloc(i32 7)
-// CHECK-NEXT:    call void @llvm.assume(i1 true) [ "align"(i8* [[CALL]], i64 7) ]
 // CHECK-NEXT:    ret void
 //
 void t1(int align) {
Index: clang/lib/CodeGen/CGCall.cpp
===================================================================
--- clang/lib/CodeGen/CGCall.cpp
+++ clang/lib/CodeGen/CGCall.cpp
@@ -4558,10 +4558,11 @@
     const auto *AlignmentCI = dyn_cast<llvm::ConstantInt>(Alignment);
     if (!AlignmentCI)
       return Attrs;
-    // We may legitimately have non-power-of-2 alignment here.
-    // If so, this is UB land, emit it via `@llvm.assume` instead.
-    if (!AlignmentCI->getValue().isPowerOf2())
+    // Non power-of-2 alignment is UB and rejected by the IR verifier.
+    if (!AlignmentCI->getValue().isPowerOf2()) {
+      AA = nullptr; // We're done. Disallow doing anything else.
       return Attrs;
+    }
     llvm::AttributeList NewAttrs = maybeRaiseRetAlignmentAttribute(
         CGF.getLLVMContext(), Attrs,
         llvm::Align(


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D94433.364826.patch
Type: text/x-patch
Size: 3503 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210806/ecc8a65e/attachment.bin>


More information about the llvm-commits mailing list