forked from OSchip/llvm-project
Teach SCEV to look through returned-argument functions
When building SCEVs, if a function is known to return its argument, then we can build the SCEV using the corresponding argument value. Differential Revision: http://reviews.llvm.org/D9381 llvm-svn: 275037
This commit is contained in:
parent
6fd5e1f02b
commit
e186debb8b
|
@ -5225,6 +5225,13 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
|
||||||
if (isa<Instruction>(U))
|
if (isa<Instruction>(U))
|
||||||
return createNodeForSelectOrPHI(cast<Instruction>(U), U->getOperand(0),
|
return createNodeForSelectOrPHI(cast<Instruction>(U), U->getOperand(0),
|
||||||
U->getOperand(1), U->getOperand(2));
|
U->getOperand(1), U->getOperand(2));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Instruction::Call:
|
||||||
|
case Instruction::Invoke:
|
||||||
|
if (Value *RV = CallSite(U).getReturnedArgOperand())
|
||||||
|
return getSCEV(RV);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return getUnknown(V);
|
return getUnknown(V);
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
; RUN: opt < %s -S -analyze -scalar-evolution | FileCheck %s
|
||||||
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
||||||
|
|
||||||
|
define i8* @foo(i32 %no, i8* nocapture %d) nounwind {
|
||||||
|
entry:
|
||||||
|
%v = call i8* @func1(i8* %d)
|
||||||
|
%w = getelementptr i8, i8* %v, i64 5
|
||||||
|
ret i8* %w
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK-LABEL: Classifying expressions for: @foo
|
||||||
|
; CHECK: %w = getelementptr i8, i8* %v, i64 5
|
||||||
|
; CHECK-NEXT: (5 + %d)
|
||||||
|
|
||||||
|
declare i8* @func1(i8* returned) nounwind argmemonly
|
||||||
|
|
Loading…
Reference in New Issue