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))
|
||||
return createNodeForSelectOrPHI(cast<Instruction>(U), U->getOperand(0),
|
||||
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);
|
||||
|
|
|
@ -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