[llvm] r275037 - Teach SCEV to look through returned-argument functions

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Sun Jul 10 19:48:23 PDT 2016


Author: hfinkel
Date: Sun Jul 10 21:48:23 2016
New Revision: 275037

URL: http://llvm.org/viewvc/llvm-project?rev=275037&view=rev
Log:
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

Added:
    llvm/trunk/test/Analysis/ScalarEvolution/returned.ll
Modified:
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=275037&r1=275036&r2=275037&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Sun Jul 10 21:48:23 2016
@@ -5225,6 +5225,13 @@ const SCEV *ScalarEvolution::createSCEV(
     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);

Added: llvm/trunk/test/Analysis/ScalarEvolution/returned.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/returned.ll?rev=275037&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/returned.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/returned.ll Sun Jul 10 21:48:23 2016
@@ -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
+




More information about the llvm-commits mailing list