mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 16:33:37 +01:00
c840cfe5c9
we have RefreshCallGraph detect when a function pass devirtualizes a call, and have CGSCCPassMgr iterate (up to a count) when this happens. This allows (in the example) GVN to devirtualize the call in foo, then the inliner to inline it away. This is not currently enabled because I haven't done any analysis on the (potentially substantial) code size or performance impact of doing this, and guess what, it exposes callgraph updating bugs in various passes. This is progress though, and you can play with it by passing -max-cg-scc-iterations=5 to opt. llvm-svn: 101973
24 lines
757 B
LLVM
24 lines
757 B
LLVM
; RUN: opt -inline -gvn %s -S -max-cg-scc-iterations=1 | FileCheck %s
|
|
; rdar://6295824 and PR6724
|
|
|
|
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-n8:16:32:64"
|
|
target triple = "x86_64-apple-darwin10.0.0"
|
|
|
|
define i32 @foo(i32 ()** noalias nocapture %p, i64* noalias nocapture %q) nounwind ssp {
|
|
entry:
|
|
store i32 ()* @bar, i32 ()** %p
|
|
store i64 0, i64* %q
|
|
%tmp3 = load i32 ()** %p ; <i32 ()*> [#uses=1]
|
|
%call = tail call i32 %tmp3() nounwind ; <i32> [#uses=1]
|
|
ret i32 %call
|
|
}
|
|
; CHECK: @foo
|
|
; CHECK: ret i32 7
|
|
; CHECK: @bar
|
|
; CHECK: ret i32 7
|
|
|
|
define internal i32 @bar() nounwind readnone ssp {
|
|
entry:
|
|
ret i32 7
|
|
}
|