diff --git a/llvm/lib/CodeGen/BasicBlockSections.cpp b/llvm/lib/CodeGen/BasicBlockSections.cpp --- a/llvm/lib/CodeGen/BasicBlockSections.cpp +++ b/llvm/lib/CodeGen/BasicBlockSections.cpp @@ -286,8 +286,16 @@ while (!MI->isEHLabel()) ++MI; MCInst Nop = MF.getSubtarget().getInstrInfo()->getNop(); - BuildMI(MBB, MI, DebugLoc(), - MF.getSubtarget().getInstrInfo()->get(Nop.getOpcode())); + MachineInstr &NopInstr = + *BuildMI(MBB, MI, DebugLoc(), + MF.getSubtarget().getInstrInfo()->get(Nop.getOpcode())); + + // On AArch64, the NOP instruction has an immediate operand of 0, which + // must be propagated. + if (Nop.getNumOperands() == 0 || !Nop.getOperand(0).isImm()) + continue; + NopInstr.addOperand( + MachineOperand::CreateImm(Nop.getOperand(0).getImm())); } } } diff --git a/llvm/lib/CodeGen/MachineFunctionSplitter.cpp b/llvm/lib/CodeGen/MachineFunctionSplitter.cpp --- a/llvm/lib/CodeGen/MachineFunctionSplitter.cpp +++ b/llvm/lib/CodeGen/MachineFunctionSplitter.cpp @@ -68,6 +68,13 @@ cl::desc("Splits all EH code and it's descendants by default."), cl::init(false), cl::Hidden); +static cl::opt AllowUnsupportedTriple( + "mfs-split-unsupported-triple", + cl::desc( + "Splits functions even if the target triple isn't supported. This is " + "testing flag for targets that don't yet support function splitting."), + cl::init(false), cl::Hidden); + namespace { class MachineFunctionSplitter : public MachineFunctionPass { @@ -138,10 +145,9 @@ bool MachineFunctionSplitter::doInitialization(Module &M) { StringRef T = M.getTargetTriple(); - if (!isSupportedTriple(Triple(T))) { + if (!isSupportedTriple(Triple(T)) && !AllowUnsupportedTriple) { UnsupportedTriple = true; - M.getContext().diagnose( - DiagnosticInfoMachineFunctionSplit(T, DS_Warning)); + M.getContext().diagnose(DiagnosticInfoMachineFunctionSplit(T, DS_Warning)); return false; } return MachineFunctionPass::doInitialization(M); diff --git a/llvm/test/CodeGen/Generic/machine-function-splitter.ll b/llvm/test/CodeGen/Generic/machine-function-splitter.ll --- a/llvm/test/CodeGen/Generic/machine-function-splitter.ll +++ b/llvm/test/CodeGen/Generic/machine-function-splitter.ll @@ -7,6 +7,11 @@ ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-psi-cutoff=950000 | FileCheck %s -check-prefixes=MFS-OPTS2,MFS-OPTS2-X86 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -split-machine-functions -mfs-split-ehcode | FileCheck %s -check-prefixes=MFS-EH-SPLIT,MFS-EH-SPLIT-X86 +; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-split-unsupported-triple | FileCheck %s -check-prefixes=MFS-DEFAULTS,MFS-DEFAULTS-AARCH64 +; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-split-unsupported-triple -mfs-psi-cutoff=0 -mfs-count-threshold=2000 | FileCheck %s --dump-input=always -check-prefixes=MFS-OPTS1,MFS-OPTS1-AARCH64 +; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-split-unsupported-triple -mfs-psi-cutoff=950000 | FileCheck %s -check-prefixes=MFS-OPTS2,MFS-OPTS2-AARCH64 +; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-split-unsupported-triple -mfs-split-ehcode | FileCheck %s -check-prefixes=MFS-EH-SPLIT,MFS-EH-SPLIT-AARCH64 + ; COM: Machine function splitting with AFDO profiles ; RUN: sed 's/InstrProf/SampleProfile/g' %s > %t.ll ; RUN: llc < %t.ll -mtriple=x86_64-unknown-linux-gnu -split-machine-functions | FileCheck %s --check-prefix=FSAFDO-MFS @@ -14,6 +19,9 @@ ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -debug-pass=Structure -fs-profile-file=%S/Inputs/fsloader-mfs.afdo -enable-fs-discriminator=true -improved-fs-discriminator=true -split-machine-functions 2>&1 | FileCheck %s --check-prefix=MFS_ON ; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -debug-pass=Structure -fs-profile-file=%S/Inputs/fsloader-mfs.afdo -enable-fs-discriminator=true -improved-fs-discriminator=true -split-machine-functions 2>&1 | FileCheck %s --check-prefix=MFS_OFF +; RUN: llc < %t.ll -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-split-unsupported-triple | FileCheck %s --check-prefix=FSAFDO-MFS +; RUN: llc < %t.ll -mtriple=aarch64-unknown-linux-gnu -enable-split-machine-functions -mfs-split-unsupported-triple | FileCheck %s --check-prefix=FSAFDO-MFS2 + ;; Check that MFS is on for X86 targets. ; MFS_ON: Machine Function Splitter Transformation ; MFS_ON_NO: warning: -fsplit-machine-functions is not valid for @@ -28,6 +36,8 @@ ; MFS-DEFAULTS-NEXT: foo1.cold: ; MFS-DEFAULTS-X86-NOT: callq bar ; MFS-DEFAULTS-X86-NEXT: callq baz +; MFS-DEFAULTS-AARCH64-NOT: bl bar +; MFS-DEFAULTS-AARCH64-NEXT: bl baz br i1 %0, label %2, label %4, !prof !17 2: ; preds = %1 @@ -89,6 +99,9 @@ ; MFS-OPTS1-X86-NOT: callq bar ; MFS-OPTS1-X86-NOT: callq baz ; MFS-OPTS1-X86-NEXT: callq bam +; MFS-OPTS1-AARCH64-NOT: bl bar +; MFS-OPTS1-AARCH64-NOT: bl baz +; MFS-OPTS1-AARCH64-NEXT: bl bam br i1 %0, label %3, label %7, !prof !18 3: @@ -123,6 +136,9 @@ ; MFS-OPTS2-X86-NOT: callq bar ; MFS-OPTS2-X86-NOT: callq baz ; MFS-OPTS2-X86-NEXT: callq bam +; MFS-OPTS2-AARCH64-NOT: bl bar +; MFS-OPTS2-AARCH64-NOT: bl baz +; MFS-OPTS2-AARCH64-NEXT: bl bam br i1 %0, label %3, label %7, !prof !21 3: @@ -175,6 +191,7 @@ ; MFS-DEFAULTS-NEXT: foo7.cold: ; MFS-DEFAULTS-X86: callq baz ; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT +; MFS-DEFAULTS-AARCH64: bl baz entry: invoke void @_Z1fv() to label %try.cont unwind label %lpad @@ -209,12 +226,14 @@ ; MFS-DEFAULTS: .section .text.split.foo8,"ax",@progbits ; MFS-DEFAULTS-NEXT: foo8.cold: ; MFS-DEFAULTS-X86: callq baz +; MFS-DEFAULTS-AARCH64: bl baz ;; Check that all ehpads are by default treated as cold with -mfs-split-ehcode. ; MFS-EH-SPLIT-LABEL: foo8 ; MFS-EH-SPLIT-X86: callq baz -; MFS-EH-SPLIT: .section .text.split.foo8,"ax",@progbits -; MFS-EH-SPLIT-NEXT: foo8.cold: +; MFS-EH-SPLIT-AARCH64: bl baz +; MFS-EH-SPLIT-X86: .section .text.split.foo8,"ax",@progbits +; MFS-EH-SPLIT-X86-NEXT: foo8.cold: ; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT ; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT entry: @@ -273,8 +292,9 @@ ;; Check that nop is inserted just before the EH pad if it's beginning a section. ; MFS-DEFAULTS-LABEL: foo10 ; MFS-DEFAULTS-X86-LABEL: callq baz -; MFS-DEFAULTS: .section .text.split.foo10,"ax",@progbits -; MFS-DEFAULTS-NEXT: foo10.cold: +; MFS-DEFAULTS-AARCH64: bl baz +; MFS-DEFAULTS-X86: .section .text.split.foo10,"ax",@progbits +; MFS-DEFAULTS-X86-NEXT: foo10.cold: ; MFS-DEFAULTS-X86: nop ; MFS-DEFAULTS-X86: callq _Unwind_Resume@PLT entry: @@ -296,8 +316,8 @@ ;; Check that function having landing pads are split with mfs-split-ehcode ;; even in the absence of profile data ; MFS-EH-SPLIT-LABEL: foo11 -; MFS-EH-SPLIT: .section .text.split.foo11,"ax",@progbits -; MFS-EH-SPLIT-NEXT: foo11.cold: +; MFS-EH-SPLIT-X86: .section .text.split.foo11,"ax",@progbits +; MFS-EH-SPLIT-X86-NEXT: foo11.cold: ; MFS-EH-SPLIT-X86: nop ; MFS-EH-SPLIT-X86: callq _Unwind_Resume@PLT entry: @@ -323,6 +343,9 @@ ; MFS-EH-SPLIT-X86: callq bar ; MFS-EH-SPLIT-X86: callq baz ; MFS-EH-SPLIT-X86: callq qux +; MFS-EH-SPLIT-AARCH64: bl bar +; MFS-EH-SPLIT-AARCH64: bl baz +; MFS-EH-SPLIT-AARCH64: bl qux entry: invoke void @_Z1fv() to label %8 unwind label %lpad @@ -355,11 +378,15 @@ ;; is not touched. ; MFS-EH-SPLIT-LABEL: foo13 ; MFS-EH-SPLIT-X86: callq bam +; MFS-EH-SPLIT-AARCH64: bl bam ; MFS-EH-SPLIT: .section .text.split.foo13,"ax",@progbits ; MFS-EH-SPLIT-NEXT: foo13.cold: ; MFS-EH-SPLIT-X86: callq baz ; MFS-EH-SPLIT-X86: callq bar ; MFS-EH-SPLIT-X86: callq qux +; MFS-EH-SPLIT-AARCH64: bl baz +; MFS-EH-SPLIT-AARCH64: bl bar +; MFS-EH-SPLIT-AARCH64: bl qux entry: invoke void @_Z1fv() to label %try.cont unwind label %lpad, !prof !17