mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-01 08:12:12 +00:00
[PM] Add devirtualization-based iteration utility into the new PM's
default pipeline. A clang with this patch built with ASan and asserts can build all of the test-suite as well, so it seems to not uncover any latent problems. Differential Revision: https://reviews.llvm.org/D29853 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294888 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9c2410924c
commit
1f7ef68a4e
@ -147,6 +147,9 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
static cl::opt<unsigned> MaxDevirtIterations("pm-max-devirt-iterations",
|
||||
cl::ReallyHidden, cl::init(4));
|
||||
|
||||
static Regex DefaultAliasRegex("^(default|lto-pre-link|lto)<(O[0123sz])>$");
|
||||
|
||||
static bool isOptimizingForSize(PassBuilder::OptimizationLevel Level) {
|
||||
@ -465,8 +468,14 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
|
||||
MainCGPipeline.addPass(createCGSCCToFunctionPassAdaptor(
|
||||
buildFunctionSimplificationPipeline(Level, DebugLogging)));
|
||||
|
||||
// We wrap the CGSCC pipeline in a devirtualization repeater. This will try
|
||||
// to detect when we devirtualize indirect calls and iterate the SCC passes
|
||||
// in that case to try and catch knock-on inlining or function attrs
|
||||
// opportunities. Then we add it to the module pipeline by walking the SCCs
|
||||
// in postorder (or bottom-up).
|
||||
MPM.addPass(
|
||||
createModuleToPostOrderCGSCCPassAdaptor(std::move(MainCGPipeline)));
|
||||
createModuleToPostOrderCGSCCPassAdaptor(createDevirtSCCRepeatedPass(
|
||||
std::move(MainCGPipeline), MaxDevirtIterations, DebugLogging)));
|
||||
|
||||
// This ends the canonicalization and simplification phase of the pipeline.
|
||||
// At this point, we expect to have canonical and simple IR which we begin
|
||||
|
@ -7,6 +7,9 @@
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='cgscc(function-attrs,function(gvn,instcombine))' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=BEFORE
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='cgscc(devirt<1>(function-attrs,function(gvn,instcombine)))' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER --check-prefix=AFTER1
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='cgscc(devirt<2>(function-attrs,function(gvn,instcombine)))' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER --check-prefix=AFTER2
|
||||
;
|
||||
; We also verify that the real O2 pipeline catches these cases.
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes='default<O2>' -S < %s | FileCheck %s --check-prefix=CHECK --check-prefix=AFTER --check-prefix=AFTER2
|
||||
|
||||
declare void @readnone() readnone
|
||||
; CHECK: Function Attrs: readnone
|
||||
@ -93,8 +96,7 @@ entry:
|
||||
}
|
||||
|
||||
declare i8* @memcpy(i8*, i8*, i64)
|
||||
; CHECK-NOT: Function Attrs
|
||||
; CHECK: declare i8* @memcpy(i8*, i8*, i64)
|
||||
; CHECK: declare i8* @memcpy(
|
||||
|
||||
; The @test3 function checks that when we refine an indirect call to an
|
||||
; intrinsic we still revisit the SCC pass. This also covers cases where the
|
||||
@ -112,3 +114,15 @@ define void @test3(i8* %src, i8* %dest, i64 %size) {
|
||||
; CHECK: call void @llvm.memcpy
|
||||
ret void
|
||||
}
|
||||
|
||||
; A boring function that just keeps our declarations around.
|
||||
define void @keep(i8** %sink) {
|
||||
; CHECK-NOT: Function Attrs
|
||||
; CHECK: define void @keep(
|
||||
entry:
|
||||
store volatile i8* bitcast (void ()* @readnone to i8*), i8** %sink
|
||||
store volatile i8* bitcast (void ()* @unknown to i8*), i8** %sink
|
||||
store volatile i8* bitcast (i8* (i8*, i8*, i64)* @memcpy to i8*), i8** %sink
|
||||
call void @unknown()
|
||||
ret void
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user