diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -703,6 +703,13 @@ return; } + if (V->getType()->isPointerTy()) { + if (RetainedKnowledge RK = getKnowledgeValidInContext( + V, {Attribute::Alignment}, Q.CxtI, Q.DT, Q.AC)) { + Known.Zero.setLowBits(Log2_32(RK.ArgValue)); + } + } + // The remaining tests are all recursive, so bail out if we hit the limit. if (Depth == MaxAnalysisRecursionDepth) continue; @@ -1955,7 +1962,7 @@ // Aligned pointers have trailing zeros - refine Known.Zero set if (isa(V->getType())) { Align Alignment = V->getPointerAlignment(Q.DL); - Known.Zero.setLowBits(countTrailingZeros(Alignment.value())); + Known.Zero.setLowBits(Log2(Alignment)); } // computeKnownBitsFromAssume strictly refines Known. diff --git a/llvm/test/Analysis/BasicAA/featuretest.ll b/llvm/test/Analysis/BasicAA/featuretest.ll --- a/llvm/test/Analysis/BasicAA/featuretest.ll +++ b/llvm/test/Analysis/BasicAA/featuretest.ll @@ -128,7 +128,7 @@ ; USE_ASSUME-LABEL: @gep_distance_test3( ; USE_ASSUME-NEXT: [[C1:%.*]] = getelementptr i32, i32* [[A:%.*]], i64 1 ; USE_ASSUME-NEXT: [[C:%.*]] = bitcast i32* [[C1]] to i8* -; USE_ASSUME-NEXT: store i8 42, i8* [[C]], align 1 +; USE_ASSUME-NEXT: store i8 42, i8* [[C]], align 4 ; USE_ASSUME-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[A]], i64 4), "nonnull"(i32* [[A]]), "align"(i32* [[A]], i64 4) ] ; USE_ASSUME-NEXT: ret i32 0 ; diff --git a/llvm/test/Analysis/ValueTracking/assume-queries-counter.ll b/llvm/test/Analysis/ValueTracking/assume-queries-counter.ll --- a/llvm/test/Analysis/ValueTracking/assume-queries-counter.ll +++ b/llvm/test/Analysis/ValueTracking/assume-queries-counter.ll @@ -2,8 +2,8 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -instcombine --debug-counter=assume-queries-counter-skip=0,assume-queries-counter-count=1 -S | FileCheck %s --check-prefixes=SAME,COUNTER1 -; RUN: opt < %s -instcombine --debug-counter=assume-queries-counter-skip=1,assume-queries-counter-count=2 -S | FileCheck %s --check-prefixes=SAME,COUNTER2 -; RUN: opt < %s -instcombine --debug-counter=assume-queries-counter-skip=2,assume-queries-counter-count=1 -S | FileCheck %s --check-prefixes=SAME,COUNTER3 +; RUN: opt < %s -instcombine --debug-counter=assume-queries-counter-skip=1,assume-queries-counter-count=4 -S | FileCheck %s --check-prefixes=SAME,COUNTER2 +; RUN: opt < %s -instcombine --debug-counter=assume-queries-counter-skip=6,assume-queries-counter-count=1 -S | FileCheck %s --check-prefixes=SAME,COUNTER3 declare i1 @get_val() declare void @llvm.assume(i1) diff --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp --- a/llvm/unittests/Analysis/ValueTrackingTest.cpp +++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp @@ -19,6 +19,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/KnownBits.h" #include "llvm/Support/SourceMgr.h" +#include "llvm/Transforms/Utils/Local.h" #include "gtest/gtest.h" using namespace llvm; @@ -938,6 +939,35 @@ } } +TEST_F(ValueTrackingTest, computePtrAlignment) { + parseAssembly( + "declare i1 @f_i1()\n" + "declare i8* @f_i8p()\n" + "declare void @llvm.assume(i1)\n" + "define void @test() {\n" + " %A = call i8* @f_i8p()\n" + " %cond = call i1 @f_i1()\n" + " %CxtI = add i32 0, 0\n" + " br i1 %cond, label %BB1, label %EXIT\n" + "BB1:\n" + " %CxtI2 = add i32 0, 0\n" + " %cond2 = call i1 @f_i1()\n" + " call void @llvm.assume(i1 true) [ \"align\"(i8* %A, i64 16) ]\n" + " br i1 %cond2, label %BB2, label %EXIT\n" + "BB2:\n" + " %CxtI3 = add i32 0, 0\n" + " ret void\n" + "EXIT:\n" + " ret void\n" + "}"); + AssumptionCache AC(*F); + DominatorTree DT(*F); + DataLayout DL = M->getDataLayout(); + EXPECT_EQ(getKnownAlignment(A, DL, CxtI, &AC, &DT), Align(1)); + EXPECT_EQ(getKnownAlignment(A, DL, CxtI2, &AC, &DT), Align(1)); + EXPECT_EQ(getKnownAlignment(A, DL, CxtI3, &AC, &DT), Align(16)); +} + TEST_F(ComputeKnownBitsTest, ComputeKnownBits) { parseAssembly( "define i32 @test(i32 %a, i32 %b) {\n"