summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2016-07-11 02:48:23 +0000
committerHal Finkel <hfinkel@anl.gov>2016-07-11 02:48:23 +0000
commite186debb8b08429bf075b14b645effaa7ca387a0 (patch)
tree29c0e72172639a85cd081ef56e136f1bb27106ed
parent6fd5e1f02bf414803a86b6877a61818fb8914597 (diff)
downloadbcm5719-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.cpp7
-rw-r--r--llvm/test/Analysis/ScalarEvolution/returned.ll16
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
+
OpenPOWER on IntegriCloud