[llvm] r275036 - Teach computeKnownBits to look through returned-argument functions
Hal Finkel via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 10 19:25:14 PDT 2016
Author: hfinkel
Date: Sun Jul 10 21:25:14 2016
New Revision: 275036
URL: http://llvm.org/viewvc/llvm-project?rev=275036&view=rev
Log:
Teach computeKnownBits to look through returned-argument functions
If a function is known to return one of its arguments, we can use that in order
to compute known bits of the return value.
Differential Revision: http://reviews.llvm.org/D9397
Modified:
llvm/trunk/lib/Analysis/ValueTracking.cpp
llvm/trunk/test/Transforms/InstCombine/align-attr.ll
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=275036&r1=275035&r2=275036&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Sun Jul 10 21:25:14 2016
@@ -1279,11 +1279,16 @@ static void computeKnownBitsFromOperator
}
case Instruction::Call:
case Instruction::Invoke:
+ // If range metadata is attached to this call, set known bits from that,
+ // and then intersect with known bits based on other properties of the
+ // function.
if (MDNode *MD = cast<Instruction>(I)->getMetadata(LLVMContext::MD_range))
computeKnownBitsFromRangeMetadata(*MD, KnownZero, KnownOne);
- // If a range metadata is attached to this IntrinsicInst, intersect the
- // explicit range specified by the metadata and the implicit range of
- // the intrinsic.
+ if (Value *RV = CallSite(I).getReturnedArgOperand()) {
+ computeKnownBits(RV, KnownZero2, KnownOne2, Depth + 1, Q);
+ KnownZero |= KnownZero2;
+ KnownOne |= KnownOne2;
+ }
if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
switch (II->getIntrinsicID()) {
default: break;
Modified: llvm/trunk/test/Transforms/InstCombine/align-attr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/align-attr.ll?rev=275036&r1=275035&r2=275036&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/align-attr.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/align-attr.ll Sun Jul 10 21:25:14 2016
@@ -13,3 +13,16 @@ entry:
; CHECK: ret i32
}
+define i32 @foo2(i32* align 32 %a) #0 {
+entry:
+ %v = call i32* @func1(i32* %a)
+ %0 = load i32, i32* %v, align 4
+ ret i32 %0
+
+; CHECK-LABEL: @foo2
+; CHECK-DAG: load i32, i32* %v, align 32
+; CHECK: ret i32
+}
+
+declare i32* @func1(i32* returned) nounwind
+
More information about the llvm-commits
mailing list