From 7c2192b277e6050f30a1582efe5217b1ee904b1b Mon Sep 17 00:00:00 2001 From: Jin Lin Date: Wed, 3 Mar 2021 12:06:42 -0800 Subject: [PATCH] Add the use of register r for outlined function when register r is live in and defined later. The compiler needs to mark register $x0 as live in for the following case. $x1 = ADDXri $sp, 16, 0 BL @spam, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $x0, implicit killed $x1, implicit-def $sp, implicit-def dead $x0 Reviewed By: paquette Differential Revision: https://reviews.llvm.org/D95267 --- llvm/lib/CodeGen/MachineOutliner.cpp | 2 +- .../AArch64/machine-outliner-side-effect-2.mir | 51 ++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 llvm/test/CodeGen/AArch64/machine-outliner-side-effect-2.mir diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp index 3751d94..1d55bd0 100644 --- a/llvm/lib/CodeGen/MachineOutliner.cpp +++ b/llvm/lib/CodeGen/MachineOutliner.cpp @@ -806,7 +806,7 @@ bool MachineOutliner::outline(Module &M, if (MOP.isDef()) { // Introduce DefRegs set to skip the redundant register. DefRegs.insert(MOP.getReg()); - if (UseRegs.count(MOP.getReg())) + if (!MOP.isDead() && UseRegs.count(MOP.getReg())) // Since the regiester is modeled as defined, // it is not necessary to be put in use register set. UseRegs.erase(MOP.getReg()); diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-side-effect-2.mir b/llvm/test/CodeGen/AArch64/machine-outliner-side-effect-2.mir new file mode 100644 index 0000000..d95565b --- /dev/null +++ b/llvm/test/CodeGen/AArch64/machine-outliner-side-effect-2.mir @@ -0,0 +1,51 @@ +# RUN: llc -mtriple=aarch64 -run-pass=machine-outliner -verify-machineinstrs %s -o - | FileCheck %s + +# The test checks whether the compiler updates the side effect of function @OUTLINED_FUNCTION_0 by adding the use of register x0. + +--- | + declare void @spam() local_unnamed_addr + define void @bax() optsize minsize noredzone { ret void } + define void @bay() optsize minsize noredzone { ret void } + define void @baz() optsize minsize noredzone { ret void } +... +--- +name: bax +tracksRegLiveness: true +body: | + bb.0: + liveins: $x0, $lr + + $x1 = ADDXri $sp, 16, 0 + BL @spam, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $x0, implicit killed $x1, implicit-def $sp, implicit-def dead $x0 + + RET_ReallyLR + +... +--- +name: bay +tracksRegLiveness: true +body: | + bb.0: + liveins: $x0, $lr + + $x1 = ADDXri $sp, 16, 0 + BL @spam, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $x0, implicit killed $x1, implicit-def $sp, implicit-def dead $x0 + + RET_ReallyLR + +... +--- +name: baz +tracksRegLiveness: true +body: | + bb.0: + liveins: $x0, $lr + + $x1 = ADDXri $sp, 16, 0 + BL @spam, csr_darwin_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $x0, implicit killed $x1, implicit-def $sp, implicit-def dead $x0 + + RET_ReallyLR + +... + +# CHECK: BL @OUTLINED_FUNCTION_0, {{.*}}, implicit $x0 -- 2.7.4