Skip to content

Commit

Permalink
[Sparc] Check register use with isPhysRegUsed() instead of reg_nodbg_…
Browse files Browse the repository at this point in the history
…empty()

Summary: By using reg_nodbg_empty() to determine if a function can be
treated as a leaf function or not, we miss the case when the register
pair L0_L1 is used but not L0 by itself. This has the effect that
use_all_i32_regs(), a test in reserved-regs.ll which tries to use all
registers, gets treated as a leaf function.

Reviewers: jyknight, venkatra

Reviewed By: jyknight

Subscribers: davide, RKSimon, sepavloff, llvm-commits

Differential Revision: https://reviews.llvm.org/D27089

llvm-svn: 297285
  • Loading branch information
doac committed Mar 8, 2017
1 parent ac17087 commit 9db582a
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 7 deletions.
11 changes: 5 additions & 6 deletions llvm/lib/Target/Sparc/SparcFrameLowering.cpp
Expand Up @@ -288,11 +288,11 @@ static bool LLVM_ATTRIBUTE_UNUSED verifyLeafProcRegUse(MachineRegisterInfo *MRI)
{

for (unsigned reg = SP::I0; reg <= SP::I7; ++reg)
if (!MRI->reg_nodbg_empty(reg))
if (MRI->isPhysRegUsed(reg))
return false;

for (unsigned reg = SP::L0; reg <= SP::L7; ++reg)
if (!MRI->reg_nodbg_empty(reg))
if (MRI->isPhysRegUsed(reg))
return false;

return true;
Expand All @@ -305,20 +305,19 @@ bool SparcFrameLowering::isLeafProc(MachineFunction &MF) const
MachineFrameInfo &MFI = MF.getFrameInfo();

return !(MFI.hasCalls() // has calls
|| !MRI.reg_nodbg_empty(SP::L0) // Too many registers needed
|| !MRI.reg_nodbg_empty(SP::O6) // %SP is used
|| MRI.isPhysRegUsed(SP::L0) // Too many registers needed
|| MRI.isPhysRegUsed(SP::O6) // %SP is used
|| hasFP(MF)); // need %FP
}

void SparcFrameLowering::remapRegsForLeafProc(MachineFunction &MF) const {
MachineRegisterInfo &MRI = MF.getRegInfo();
// Remap %i[0-7] to %o[0-7].
for (unsigned reg = SP::I0; reg <= SP::I7; ++reg) {
if (MRI.reg_nodbg_empty(reg))
if (!MRI.isPhysRegUsed(reg))
continue;

unsigned mapped_reg = reg - SP::I0 + SP::O0;
assert(MRI.reg_nodbg_empty(mapped_reg));

// Replace I register with O register.
MRI.replaceRegWith(reg, mapped_reg);
Expand Down
4 changes: 3 additions & 1 deletion llvm/test/CodeGen/SPARC/reserved-regs.ll
@@ -1,11 +1,12 @@
; RUN: llc -march=sparc < %s | FileCheck %s
; RUN: llc -march=sparc -verify-machineinstrs < %s | FileCheck %s

@g = common global [32 x i32] zeroinitializer, align 16
@h = common global [16 x i64] zeroinitializer, align 16

;; Ensures that we don't use registers which are supposed to be reserved.

; CHECK-LABEL: use_all_i32_regs:
; CHECK: save %sp
; CHECK-NOT: %g0
; CHECK-NOT: %g1
; CHECK-NOT: %g5
Expand Down Expand Up @@ -86,6 +87,7 @@ entry:


; CHECK-LABEL: use_all_i64_regs:
; CHECK: save %sp
; CHECK-NOT: %g0
; CHECK-NOT: %g1
; CHECK-NOT: %g4
Expand Down

0 comments on commit 9db582a

Please sign in to comment.