[llvm] 97c0df5 - [AlignmentFromAssumes] Handle non-power-of-two alignment (PR64687)

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 15 07:13:03 PDT 2023


Author: Nikita Popov
Date: 2023-08-15T16:12:53+02:00
New Revision: 97c0df5eb23d053de8001c531ab107dc494d3b6c

URL: https://github.com/llvm/llvm-project/commit/97c0df5eb23d053de8001c531ab107dc494d3b6c
DIFF: https://github.com/llvm/llvm-project/commit/97c0df5eb23d053de8001c531ab107dc494d3b6c.diff

LOG: [AlignmentFromAssumes] Handle non-power-of-two alignment (PR64687)

Align operand bundles can contain non-power-of-two alignments,
but LLVM otherwise does not support them. Bail out in that case
instead of crashing.

Fixes https://github.com/llvm/llvm-project/issues/64687.

Added: 
    

Modified: 
    llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp
    llvm/test/Transforms/AlignmentFromAssumptions/simple.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp b/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp
index b259c76fc3a5d0..63b7903ef955d9 100644
--- a/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp
+++ b/llvm/lib/Transforms/Scalar/AlignmentFromAssumptions.cpp
@@ -179,6 +179,9 @@ bool AlignmentFromAssumptionsPass::extractAlignmentInfo(CallInst *I,
     // Added to suppress a crash because consumer doesn't expect non-constant
     // alignments in the assume bundle.  TODO: Consider generalizing caller.
     return false;
+  if (!cast<SCEVConstant>(AlignSCEV)->getAPInt().isPowerOf2())
+    // Only power of two alignments are supported.
+    return false;
   if (AlignOB.Inputs.size() == 3)
     OffSCEV = SE->getSCEV(AlignOB.Inputs[2].get());
   else

diff  --git a/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll b/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll
index 85523fa63943d9..268aca093a698e 100644
--- a/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll
+++ b/llvm/test/Transforms/AlignmentFromAssumptions/simple.ll
@@ -381,6 +381,20 @@ entry:
   ret i32 %0
 }
 
+define i32 @pr64687(ptr nocapture %a) {
+; CHECK-LABEL: define i32 @pr64687
+; CHECK-SAME: (ptr nocapture [[A:%.*]]) {
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    tail call void @llvm.assume(i1 true) [ "align"(ptr [[A]], i32 123) ]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[A]], align 4
+; CHECK-NEXT:    ret i32 [[TMP0]]
+;
+entry:
+  tail call void @llvm.assume(i1 true) ["align"(ptr %a, i32 123)]
+  %0 = load i32, ptr %a, align 4
+  ret i32 %0
+}
+
 declare void @llvm.assume(i1) nounwind
 
 declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind


        


More information about the llvm-commits mailing list