mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 07:31:53 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275037 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d90d6130ff
commit
837551f8d6
@ -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);
|
||||
|
16
test/Analysis/ScalarEvolution/returned.ll
Normal file
16
test/Analysis/ScalarEvolution/returned.ll
Normal file
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user