diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.h b/llvm/lib/Target/ARM/ARMBaseInstrInfo.h --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.h +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.h @@ -372,6 +372,9 @@ MachineBasicBlock::iterator &It, MachineFunction &MF, const outliner::Candidate &C) const override; + /// Enable outlining by default at -Oz. + bool shouldOutlineFromFunctionByDefault(MachineFunction &MF) const override; + private: /// Returns an unused general-purpose register which can be used for /// constructing an outlined call if one exists. Returns 0 otherwise. diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -6129,3 +6129,8 @@ It--; return CallPt; } + +bool ARMBaseInstrInfo::shouldOutlineFromFunctionByDefault( + MachineFunction &MF) const { + return Subtarget.isMClass() && MF.getFunction().hasMinSize(); +} diff --git a/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/llvm/lib/Target/ARM/ARMTargetMachine.cpp --- a/llvm/lib/Target/ARM/ARMTargetMachine.cpp +++ b/llvm/lib/Target/ARM/ARMTargetMachine.cpp @@ -251,7 +251,7 @@ // ARM supports the MachineOutliner. setMachineOutliner(true); - setSupportsDefaultOutlining(false); + setSupportsDefaultOutlining(true); } ARMBaseTargetMachine::~ARMBaseTargetMachine() = default; diff --git a/llvm/test/CodeGen/ARM/O3-pipeline.ll b/llvm/test/CodeGen/ARM/O3-pipeline.ll --- a/llvm/test/CodeGen/ARM/O3-pipeline.ll +++ b/llvm/test/CodeGen/ARM/O3-pipeline.ll @@ -170,6 +170,8 @@ ; CHECK-NEXT: Contiguously Lay Out Funclets ; CHECK-NEXT: StackMap Liveness Analysis ; CHECK-NEXT: Live DEBUG_VALUE analysis +; CHECK-NEXT: Machine Outliner +; CHECK-NEXT: FunctionPass Manager ; CHECK-NEXT: MachineDominator Tree Construction ; CHECK-NEXT: ARM constant island placement and branch shortening pass ; CHECK-NEXT: MachineDominator Tree Construction diff --git a/llvm/test/CodeGen/ARM/machine-outliner-tail.ll b/llvm/test/CodeGen/ARM/machine-outliner-tail.ll --- a/llvm/test/CodeGen/ARM/machine-outliner-tail.ll +++ b/llvm/test/CodeGen/ARM/machine-outliner-tail.ll @@ -7,6 +7,8 @@ ; RUN: | FileCheck %s --check-prefix=MACHO ; RUN: llc -enable-machine-outliner -verify-machineinstrs -mtriple=thumbv5-- \ ; RUN: --stop-after=machine-outliner < %s | FileCheck %s --check-prefix=THUMB1 +; RUN: llc -verify-machineinstrs -mtriple=thumbv8m.main \ +; RUN: --stop-after=machine-outliner < %s | FileCheck %s --check-prefix=THUMB ; ARM-LABEL: name: OUTLINED_FUNCTION_0 ; ARM: $r0 = MOVi 1, 14 /* CC::al */, $noreg, $noreg @@ -31,7 +33,7 @@ ; THUMB1-NOT: OUTLINED_FUNCTION_0 -define void @a() { +define void @a() #0 { entry: tail call void @z(i32 1, i32 2, i32 3, i32 4) ret void @@ -39,8 +41,10 @@ declare void @z(i32, i32, i32, i32) -define dso_local void @b(i32* nocapture readnone %p) { +define dso_local void @b(i32* nocapture readnone %p) #0 { entry: tail call void @z(i32 1, i32 2, i32 3, i32 4) ret void } + +attributes #0 = { minsize optsize } diff --git a/llvm/test/CodeGen/ARM/machine-outliner-thunk.ll b/llvm/test/CodeGen/ARM/machine-outliner-thunk.ll --- a/llvm/test/CodeGen/ARM/machine-outliner-thunk.ll +++ b/llvm/test/CodeGen/ARM/machine-outliner-thunk.ll @@ -7,10 +7,12 @@ ; RUN: | FileCheck %s --check-prefix=MACHO ; RUN: llc -enable-machine-outliner -verify-machineinstrs -mtriple=thumbv5-- \ ; RUN: --stop-after=machine-outliner < %s | FileCheck %s --check-prefix=THUMB1 +; RUN: llc -verify-machineinstrs -mtriple=thumbv8m.main \ +; RUN: --stop-after=machine-outliner < %s | FileCheck %s --check-prefix=THUMB declare i32 @thunk_called_fn(i32, i32, i32, i32) -define i32 @a() { +define i32 @a() #0 { ; ARM-LABEL: name: a ; ARM: bb.0.entry: ; ARM-NEXT: liveins: $r11, $lr @@ -52,7 +54,7 @@ ret i32 %cx } -define i32 @b() { +define i32 @b() #0 { ; ARM-LABEL: name: b ; ARM: bb.0.entry: ; ARM-NEXT: liveins: $r11, $lr @@ -117,3 +119,5 @@ ; MACHO-NEXT: $r2, dead $cpsr = tMOVi8 3, 14 /* CC::al */, $noreg ; MACHO-NEXT: $r3, dead $cpsr = tMOVi8 4, 14 /* CC::al */, $noreg ; MACHO-NEXT: tTAILJMPd @thunk_called_fn, 14 /* CC::al */, $noreg, implicit $sp + +attributes #0 = { minsize optsize }