From e186debb8b08429bf075b14b645effaa7ca387a0 Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Mon, 11 Jul 2016 02:48:23 +0000 Subject: [PATCH] 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 --- llvm/lib/Analysis/ScalarEvolution.cpp | 7 +++++++ llvm/test/Analysis/ScalarEvolution/returned.ll | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 llvm/test/Analysis/ScalarEvolution/returned.ll diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 9c1712ab7715e..2abbf34803580 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(U)) return createNodeForSelectOrPHI(cast(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 0000000000000..4c07cd1346657 --- /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 +