diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 9c1712ab7715..2abbf3480358 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 000000000000..4c07cd134665 --- /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 +