From 98b9ddd8872749599c4c905c3472e624a0298d30 Mon Sep 17 00:00:00 2001 From: Jessica Paquette Date: Fri, 27 Jul 2018 20:18:27 +0000 Subject: [PATCH] Recommit "Enable MachineOutliner by default under -Oz for AArch64" Fixed the ASAN failure from before in r338148, so recommiting. This patch enables the MachineOutliner by default in AArch64 under -Oz. The MachineOutliner offers around a 4.5% improvement on the current -Oz code size improvements. We have done work into improving the debuggability of outlined code, so that users of -Oz won't be surprised by the optimization. We have also been executing the LLVM test suite and common external tests such as the SPEC suites continuously with no issue. The outliner has a low compile-time overhead of roughly 1%. At this point, the outliner would be a really good addition to the -Oz pass pipeline! llvm-svn: 338160 --- lib/Target/AArch64/AArch64InstrInfo.cpp | 5 ++ lib/Target/AArch64/AArch64InstrInfo.h | 1 + lib/Target/AArch64/AArch64TargetMachine.cpp | 3 + test/CodeGen/AArch64/O3-pipeline.ll | 2 + test/CodeGen/AArch64/arm64-memset-to-bzero.ll | 6 +- .../AArch64/arm64-opt-remarks-lazy-bfi.ll | 8 +-- test/CodeGen/AArch64/cond-sel.ll | 4 +- .../AArch64/machine-outliner-default.mir | 71 +++++++++++++++++++ .../CodeGen/AArch64/machine-outliner-flags.ll | 8 ++- test/CodeGen/AArch64/max-jump-table.ll | 1 + 10 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 test/CodeGen/AArch64/machine-outliner-default.mir diff --git a/lib/Target/AArch64/AArch64InstrInfo.cpp b/lib/Target/AArch64/AArch64InstrInfo.cpp index 230480cf1ce..b571c4207c9 100644 --- a/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -5482,3 +5482,8 @@ MachineBasicBlock::iterator AArch64InstrInfo::insertOutlinedCall( return CallPt; } + +bool AArch64InstrInfo::shouldOutlineFromFunctionByDefault( + MachineFunction &MF) const { + return MF.getFunction().optForMinSize(); +} diff --git a/lib/Target/AArch64/AArch64InstrInfo.h b/lib/Target/AArch64/AArch64InstrInfo.h index 0e5953f6216..585cbd4b9c7 100644 --- a/lib/Target/AArch64/AArch64InstrInfo.h +++ b/lib/Target/AArch64/AArch64InstrInfo.h @@ -249,6 +249,7 @@ public: insertOutlinedCall(Module &M, MachineBasicBlock &MBB, MachineBasicBlock::iterator &It, MachineFunction &MF, const outliner::Candidate &C) const override; + bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const override; /// Returns true if the instruction sets to an immediate value that can be /// executed more efficiently. bool isExynosResetFast(const MachineInstr &MI) const; diff --git a/lib/Target/AArch64/AArch64TargetMachine.cpp b/lib/Target/AArch64/AArch64TargetMachine.cpp index 01a997e5aed..120d71381c6 100644 --- a/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -255,6 +255,9 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT, // AArch64 supports the MachineOutliner. setMachineOutliner(true); + + // AArch64 supports default outlining behaviour. + setSupportsDefaultOutlining(true); } AArch64TargetMachine::~AArch64TargetMachine() = default; diff --git a/test/CodeGen/AArch64/O3-pipeline.ll b/test/CodeGen/AArch64/O3-pipeline.ll index e482682fc9d..f0c7e4e67c1 100644 --- a/test/CodeGen/AArch64/O3-pipeline.ll +++ b/test/CodeGen/AArch64/O3-pipeline.ll @@ -154,6 +154,8 @@ ; CHECK-NEXT: Insert fentry calls ; CHECK-NEXT: Insert XRay ops ; CHECK-NEXT: Implement the 'patchable-function' attribute +; CHECK-NEXT: Machine Outliner +; CHECK-NEXT: FunctionPass Manager ; CHECK-NEXT: Lazy Machine Block Frequency Analysis ; CHECK-NEXT: Machine Optimization Remark Emitter ; CHECK-NEXT: AArch64 Assembly Printer diff --git a/test/CodeGen/AArch64/arm64-memset-to-bzero.ll b/test/CodeGen/AArch64/arm64-memset-to-bzero.ll index 0afe1c006b0..ab819a42729 100644 --- a/test/CodeGen/AArch64/arm64-memset-to-bzero.ll +++ b/test/CodeGen/AArch64/arm64-memset-to-bzero.ll @@ -1,6 +1,6 @@ -; RUN: llc %s -mtriple=arm64-apple-darwin -o - | \ -; RUN: FileCheck --check-prefixes=CHECK,CHECK-DARWIN %s -; RUN: llc %s -mtriple=arm64-linux-gnu -o - | \ +; RUN: llc %s -enable-machine-outliner=never -mtriple=arm64-apple-darwin -o - \ +; RUN: | FileCheck --check-prefixes=CHECK,CHECK-DARWIN %s +; RUN: llc %s -enable-machine-outliner=never -mtriple=arm64-linux-gnu -o - | \ ; RUN: FileCheck --check-prefixes=CHECK,CHECK-LINUX %s ; ARM64: Calls to bzero() replaced with calls to memset() diff --git a/test/CodeGen/AArch64/arm64-opt-remarks-lazy-bfi.ll b/test/CodeGen/AArch64/arm64-opt-remarks-lazy-bfi.ll index 7efb4bf6d59..452c822e43b 100644 --- a/test/CodeGen/AArch64/arm64-opt-remarks-lazy-bfi.ll +++ b/test/CodeGen/AArch64/arm64-opt-remarks-lazy-bfi.ll @@ -26,8 +26,8 @@ ; requested. (This hard-codes the previous pass to the Assembly Printer, ; please adjust accordingly.) -; HOTNESS: Executing Pass 'Implement the 'patchable-function' attribute' -; HOTNESS-NEXT: Freeing Pass 'Implement the 'patchable-function' attribute' +; HOTNESS: Freeing Pass 'Machine Outliner' +; HOTNESS-NEXT: Executing Pass 'Function Pass Manager' ; HOTNESS-NEXT: Executing Pass 'Lazy Machine Block Frequency Analysis' ; HOTNESS-NEXT: Executing Pass 'Machine Optimization Remark Emitter' ; HOTNESS-NEXT: Building MachineBlockFrequencyInfo on the fly @@ -41,8 +41,8 @@ ; HOTNESS: arm64-summary-remarks.ll:5:0: 1 instructions in function (hotness: 33) -; NO_HOTNESS: Executing Pass 'Implement the 'patchable-function' attribute' -; NO_HOTNESS-NEXT: Freeing Pass 'Implement the 'patchable-function' attribute' +; NO_HOTNESS: Freeing Pass 'Machine Outliner' +; NO_HOTNESS-NEXT: Executing Pass 'Function Pass Manager' ; NO_HOTNESS-NEXT: Executing Pass 'Lazy Machine Block Frequency Analysis' ; NO_HOTNESS-NEXT: Executing Pass 'Machine Optimization Remark Emitter' ; NO_HOTNESS-NEXT: Executing Pass 'AArch64 Assembly Printer' diff --git a/test/CodeGen/AArch64/cond-sel.ll b/test/CodeGen/AArch64/cond-sel.ll index b39cea1f619..691cbcf1a5d 100644 --- a/test/CodeGen/AArch64/cond-sel.ll +++ b/test/CodeGen/AArch64/cond-sel.ll @@ -1,5 +1,5 @@ -; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -mcpu=cyclone | FileCheck %s -; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -mattr=-fp-armv8 | FileCheck --check-prefix=CHECK-NOFP %s +; RUN: llc -enable-machine-outliner=never -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -mcpu=cyclone | FileCheck %s +; RUN: llc -enable-machine-outliner=never -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -mattr=-fp-armv8 | FileCheck --check-prefix=CHECK-NOFP %s @var32 = global i32 0 @var64 = global i64 0 diff --git a/test/CodeGen/AArch64/machine-outliner-default.mir b/test/CodeGen/AArch64/machine-outliner-default.mir new file mode 100644 index 00000000000..698a2fc55b5 --- /dev/null +++ b/test/CodeGen/AArch64/machine-outliner-default.mir @@ -0,0 +1,71 @@ +# RUN: llc -mtriple=aarch64--- -run-pass=machine-outliner \ +# RUN: -verify-machineinstrs %s -o - | FileCheck %s + +--- | + define void @outline_1() #0 { ret void } + define void @outline_2() #0 { ret void } + define void @outline_3() #0 { ret void } + define void @dont_outline() #1 { ret void } + + attributes #0 = { noredzone minsize optsize } + attributes #1 = { noredzone } +... +--- + +name: outline_1 +tracksRegLiveness: true +body: | + bb.0: + ; CHECK-LABEL: bb.0: + ; CHECK: OUTLINED + liveins: $w8, $wzr + $w8 = ORRWri $wzr, 1 + $w8 = ORRWri $wzr, 2 + $w8 = ORRWri $wzr, 3 + $w8 = ORRWri $wzr, 4 + RET undef $lr +... +--- + +name: outline_2 +tracksRegLiveness: true +body: | + bb.0: + ; CHECK-LABEL: bb.0: + ; CHECK: OUTLINED + liveins: $w8, $wzr + $w8 = ORRWri $wzr, 1 + $w8 = ORRWri $wzr, 2 + $w8 = ORRWri $wzr, 3 + $w8 = ORRWri $wzr, 4 + RET undef $lr +... +--- + +name: outline_3 +tracksRegLiveness: true +body: | + bb.0: + ; CHECK-LABEL: bb.0: + ; CHECK: OUTLINED + liveins: $w8, $wzr + $w8 = ORRWri $wzr, 1 + $w8 = ORRWri $wzr, 2 + $w8 = ORRWri $wzr, 3 + $w8 = ORRWri $wzr, 4 + RET undef $lr +... +--- + +name: dont_outline +tracksRegLiveness: true +body: | + bb.0: + ; CHECK-LABEL: bb.0: + ; CHECK-NOT: BL + liveins: $w8, $wzr + $w8 = ORRWri $wzr, 1 + $w8 = ORRWri $wzr, 2 + $w8 = ORRWri $wzr, 3 + $w8 = ORRWri $wzr, 4 + RET undef $lr diff --git a/test/CodeGen/AArch64/machine-outliner-flags.ll b/test/CodeGen/AArch64/machine-outliner-flags.ll index e00a19099cf..c435093b794 100644 --- a/test/CodeGen/AArch64/machine-outliner-flags.ll +++ b/test/CodeGen/AArch64/machine-outliner-flags.ll @@ -14,7 +14,7 @@ ; RUN: | FileCheck %s -check-prefix=NEVER ; RUN: llc %s -debug-pass=Structure -verify-machineinstrs \ -; RUN: -mtriple arm64---- -o /dev/null 2>&1 \ +; RUN: --debug-only=machine-outliner -mtriple arm64---- -o /dev/null 2>&1 \ ; RUN: | FileCheck %s -check-prefix=NOT-ADDED ; RUN: llc %s -O=0 -debug-pass=Structure -verify-machineinstrs \ @@ -27,10 +27,11 @@ ; Cases where it should be added: ; * -enable-machine-outliner ; * -enable-machine-outliner=always +; * -enable-machine-outliner is not passed (AArch64 supports +; target-default outlining) ; ; Cases where it should not be added: ; * -O0 or equivalent -; * -enable-machine-outliner is not passed ; * -enable-machine-outliner=never is passed ; ALWAYS: Machine Outliner @@ -38,7 +39,8 @@ ; ENABLE: Machine Outliner ; ENABLE: Machine Outliner: Running on all functions ; NEVER-NOT: Machine Outliner -; NOT-ADDED-NOT: Machine Outliner +; NOT-ADDED: Machine Outliner +; NOT-ADDED: Machine Outliner: Running on target-default functions ; OPTNONE-NOT: Machine Outliner define void @foo() { diff --git a/test/CodeGen/AArch64/max-jump-table.ll b/test/CodeGen/AArch64/max-jump-table.ll index 612eba8f2ce..44dde7b1cd0 100644 --- a/test/CodeGen/AArch64/max-jump-table.ll +++ b/test/CodeGen/AArch64/max-jump-table.ll @@ -89,6 +89,7 @@ entry: ; CHECKM1-NOT: %jump-table.1 ; CHECKM3-NEXT: %jump-table.0: %bb.1 %bb.2 %bb.3 %bb.4 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.7 %bb.5 %bb.6{{$}} ; CHECKM3-NOT: %jump-table.1 +; CHECK-DAG: End machine code for function jt2. bb1: tail call void @ext(i32 1) br label %return bb2: tail call void @ext(i32 2) br label %return