mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-15 07:59:57 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275036 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4cb3366de0
commit
d90d6130ff
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user