[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