mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
c9829bfb08
``` // The legacy PM CGPassManager discovers SCCs this way: for function in the source order tarjanSCC(function) // While the new PM CGSCCPassManager does: for function in the reversed source order [1] discover a reference graph SCC build call graph SCCs inside the reference graph SCC ``` In the common cases, reference graph ~= call graph, the new PM order is undesired because for `a | b | c` (3 independent functions), the new PM will process them in the reversed order: c, b, a. If `a <-> b <-> c`, we can see that `-print-after-all` will report the sole SCC as `scc: (c, b, a)`. This patch corrects the iteration order. The discovered SCC order will match the legacy PM in the common cases. For some tests (`Transforms/Inline/cgscc-*.ll` and `unittests/Analysis/CGSCCPassManagerTest.cpp`), the behaviors are dependent on the SCC discovery order and there are too many check lines for the particular order. This patch simply reverses the function order to avoid changing too many check lines. Differential Revision: https://reviews.llvm.org/D90566
75 lines
2.5 KiB
LLVM
75 lines
2.5 KiB
LLVM
; RUN: opt < %s 2>&1 -disable-output \
|
|
; RUN: -inline -print-after-all | FileCheck %s --check-prefix=LEGACY
|
|
; RUN: opt < %s 2>&1 -disable-output \
|
|
; RUN: -passes=inline -print-after-all | FileCheck %s -check-prefix=INL
|
|
; RUN: opt < %s 2>&1 -disable-output \
|
|
; RUN: -passes=inliner-wrapper -print-after-all | FileCheck %s -check-prefix=INL
|
|
; RUN: opt < %s 2>&1 -disable-output \
|
|
; RUN: -inline -print-after-all -print-module-scope | FileCheck %s -check-prefix=LEGACY-MOD
|
|
; RUN: opt < %s 2>&1 -disable-output \
|
|
; RUN: -passes=inline -print-after-all -print-module-scope | FileCheck %s -check-prefix=INL-MOD
|
|
; RUN: opt < %s 2>&1 -disable-output \
|
|
; RUN: -passes=inliner-wrapper -print-after-all -print-module-scope | FileCheck %s -check-prefix=INL-MOD
|
|
|
|
; LEGACY: IR Dump After Function Integration/Inlining
|
|
; LEGACY: define void @bar()
|
|
; LEGACY-NEXT: call void @foo()
|
|
; LEGACY: define void @foo()
|
|
; LEGACY-NEXT: call void @bar()
|
|
; LEGACY: IR Dump After Function Integration/Inlining
|
|
; LEGACY: define void @tester()
|
|
; LEGACY-NEXT: call void @foo()
|
|
|
|
; INL: IR Dump After InlinerPass *** (scc: (foo, bar))
|
|
; INL: define void @foo()
|
|
; INL-NEXT: call void @bar()
|
|
; INL: define void @bar()
|
|
; INL-NEXT: call void @foo()
|
|
; INL: IR Dump After InlinerPass *** (scc: (tester))
|
|
; INL: define void @tester()
|
|
; INL-NEXT: call void @foo()
|
|
|
|
; LEGACY-MOD: IR Dump After Function Integration/Inlining
|
|
; LEGACY-MOD-NEXT: ModuleID =
|
|
; LEGACY-MOD: define void @tester()
|
|
; LEGACY-MOD: define void @foo()
|
|
; LEGACY-MOD: define void @bar()
|
|
|
|
; INL-MOD-LABEL:*** IR Dump After InlinerPass *** (scc: (foo, bar))
|
|
; INL-MOD-NEXT: ModuleID =
|
|
; INL-MOD-NEXT: source_filename =
|
|
; INL-MOD: define void @tester()
|
|
; INL-MOD-NEXT: call void @foo()
|
|
; INL-MOD: define void @foo()
|
|
; INL-MOD-NEXT: call void @bar()
|
|
; INL-MOD: define void @bar()
|
|
; INL-MOD-NEXT: call void @foo()
|
|
; INL-MOD-LABEL:*** IR Dump After InlinerPass *** (scc: (tester))
|
|
; INL-MOD-NEXT: ModuleID =
|
|
; INL-MOD-NEXT: source_filename =
|
|
; INL-MOD: define void @tester()
|
|
; INL-MOD-NEXT: call void @foo()
|
|
; INL-MOD: define void @foo()
|
|
; INL-MOD-NEXT: call void @bar()
|
|
; INL-MOD: define void @bar()
|
|
; INL-MOD-NEXT: call void @foo()
|
|
; INL-MOD: IR Dump After
|
|
; INL-MOD-NEXT: ModuleID =
|
|
; INL-MOD-NEXT: source_filename =
|
|
; INL-MOD-NOT: Printing <null> Function
|
|
|
|
define void @tester() noinline {
|
|
call void @foo()
|
|
ret void
|
|
}
|
|
|
|
define void @foo() noinline {
|
|
call void @bar()
|
|
ret void
|
|
}
|
|
|
|
define void @bar() noinline {
|
|
call void @foo()
|
|
ret void
|
|
}
|