From: Jin Lin Date: Wed, 3 Mar 2021 20:06:42 +0000 (-0800) Subject: Add the use of register r for outlined function when register r is live in and define... X-Git-Tag: llvmorg-14-init~13467 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7c2192b277e6050f30a1582efe5217b1ee904b1b;p=platform%2Fupstream%2Fllvm.git 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 --- 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