diff options
author | Hal Finkel <hfinkel@anl.gov> | 2016-07-11 02:48:23 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2016-07-11 02:48:23 +0000 |
commit | e186debb8b08429bf075b14b645effaa7ca387a0 (patch) | |
tree | 29c0e72172639a85cd081ef56e136f1bb27106ed | |
parent | 6fd5e1f02bf414803a86b6877a61818fb8914597 (diff) | |
download | bcm5719-llvm-e186debb8b08429bf075b14b645effaa7ca387a0.tar.gz bcm5719-llvm-e186debb8b08429bf075b14b645effaa7ca387a0.zip |
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
-rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 7 | ||||
-rw-r--r-- | llvm/test/Analysis/ScalarEvolution/returned.ll | 16 |
2 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 9c1712ab771..2abbf348035 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -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); diff --git a/llvm/test/Analysis/ScalarEvolution/returned.ll b/llvm/test/Analysis/ScalarEvolution/returned.ll new file mode 100644 index 00000000000..4c07cd13466 --- /dev/null +++ b/llvm/test/Analysis/ScalarEvolution/returned.ll @@ -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 + |