1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

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

llvm-svn: 275036
This commit is contained in:
Hal Finkel 2016-07-11 02:25:14 +00:00
parent 9dd10de0f9
commit 66f66627ed
2 changed files with 21 additions and 3 deletions

View File

@ -1279,11 +1279,16 @@ static void computeKnownBitsFromOperator(Operator *I, APInt &KnownZero,
}
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;

View File

@ -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