diff options
author | Artur Pilipenko <apilipenko@azulsystems.com> | 2015-10-07 16:01:18 +0000 |
---|---|---|
committer | Artur Pilipenko <apilipenko@azulsystems.com> | 2015-10-07 16:01:18 +0000 |
commit | d94903c9f80d9dfa2664caed8e35845b46a7b8f2 (patch) | |
tree | 0e22981dbc4cc26c322d666816440979713e1286 | |
parent | d45b205ed1a1f83529929de88feb0e63e5a27649 (diff) | |
download | bcm5719-llvm-d94903c9f80d9dfa2664caed8e35845b46a7b8f2.tar.gz bcm5719-llvm-d94903c9f80d9dfa2664caed8e35845b46a7b8f2.zip |
Teach computeKnownBits to use new align attribute/metadata
Reviewed By: reames
Differential Revision: http://reviews.llvm.org/D13470
llvm-svn: 249557
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 15 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/assume-redundant.ll | 26 |
2 files changed, 38 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index d3723037dda..d8a449193a3 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -1415,7 +1415,7 @@ static void computeKnownBitsFromOperator(Operator *I, APInt &KnownZero, } } -static unsigned getAlignment(Value *V, const DataLayout &DL) { +static unsigned getAlignment(const Value *V, const DataLayout &DL) { unsigned Align = 0; if (auto *GO = dyn_cast<GlobalObject>(V)) { Align = GO->getAlignment(); @@ -1433,7 +1433,7 @@ static unsigned getAlignment(Value *V, const DataLayout &DL) { } } } - } else if (Argument *A = dyn_cast<Argument>(V)) { + } else if (const Argument *A = dyn_cast<Argument>(V)) { Align = A->getType()->isPointerTy() ? A->getParamAlignment() : 0; if (!Align && A->hasStructRetAttr()) { @@ -1442,7 +1442,16 @@ static unsigned getAlignment(Value *V, const DataLayout &DL) { if (EltTy->isSized()) Align = DL.getABITypeAlignment(EltTy); } - } + } else if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) + Align = AI->getAlignment(); + else if (auto CS = ImmutableCallSite(V)) + Align = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex); + else if (const LoadInst *LI = dyn_cast<LoadInst>(V)) + if (MDNode *MD = LI->getMetadata(LLVMContext::MD_align)) { + ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0)); + Align = CI->getLimitedValue(); + } + return Align; } diff --git a/llvm/test/Transforms/InstCombine/assume-redundant.ll b/llvm/test/Transforms/InstCombine/assume-redundant.ll index 4b869ef2c50..4bdbcc8d086 100644 --- a/llvm/test/Transforms/InstCombine/assume-redundant.ll +++ b/llvm/test/Transforms/InstCombine/assume-redundant.ll @@ -47,6 +47,32 @@ for.end: ; preds = %for.body ret void } +declare align 8 i8* @get() + +; Check that redundant align assume is removed +; CHECK-LABEL: @test +; CHECK-NOT: call void @llvm.assume +define void @test1() { + %p = call align 8 i8* @get() + %ptrint = ptrtoint i8* %p to i64 + %maskedptr = and i64 %ptrint, 7 + %maskcond = icmp eq i64 %maskedptr, 0 + call void @llvm.assume(i1 %maskcond) + ret void +} + +; Check that redundant align assume is removed +; CHECK-LABEL: @test +; CHECK-NOT: call void @llvm.assume +define void @test3() { + %p = alloca i8, align 8 + %ptrint = ptrtoint i8* %p to i64 + %maskedptr = and i64 %ptrint, 7 + %maskcond = icmp eq i64 %maskedptr, 0 + call void @llvm.assume(i1 %maskcond) + ret void +} + ; Function Attrs: nounwind declare void @llvm.assume(i1) #1 |