From c801057a20161fef2a12959b2503729940b9d36c Mon Sep 17 00:00:00 2001 From: Carol Eidt Date: Wed, 21 Mar 2018 15:13:17 -0700 Subject: [PATCH] Remove REG_OPT_RSVD from LSRA's candidate masks if it's reserved. --- src/jit/lsra.cpp | 40 ++++++++++++++++++++++++---------------- src/jit/lsra.h | 2 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/jit/lsra.cpp b/src/jit/lsra.cpp index 5399bb5..090cc05 100644 --- a/src/jit/lsra.cpp +++ b/src/jit/lsra.cpp @@ -824,19 +824,24 @@ LinearScan::RegMaskIndex LinearScan::GetIndexForRegMask(regMaskTP mask) return result; } -// We've decided that we can't use a register during register allocation (probably FPBASE), +// We've decided that we can't use one or more registers during register allocation (probably FPBASE), // but we've already added it to the register masks. Go through the masks and remove it. -void LinearScan::RemoveRegisterFromMasks(regNumber reg) +void LinearScan::RemoveRegistersFromMasks(regMaskTP removeMask) { - JITDUMP("Removing register %s from LSRA register masks\n", getRegName(reg)); + if (VERBOSE) + { + JITDUMP("Removing registers from LSRA register masks: "); + dumpRegMask(removeMask); + JITDUMP("\n"); + } - regMaskTP mask = ~genRegMask(reg); + regMaskTP mask = ~removeMask; for (int i = 0; i < nextFreeMask; i++) { regMaskTable[i] &= mask; } - JITDUMP("After removing register:\n"); + JITDUMP("After removing registers:\n"); DBEXEC(VERBOSE, dspRegisterMaskTable()); } @@ -2493,19 +2498,10 @@ void LinearScan::setFrameType() // used during lowering. Luckily, the TreeNodeInfo only stores an index to // the masks stored in the LinearScan class, so we only need to walk the // unique masks and remove FPBASE. + regMaskTP removeMask = RBM_NONE; if (frameType == FT_EBP_FRAME) { - if ((availableIntRegs & RBM_FPBASE) != 0) - { - RemoveRegisterFromMasks(REG_FPBASE); - - // We know that we're already in "read mode" for availableIntRegs. However, - // we need to remove the FPBASE register, so subsequent users (like callers - // to allRegs()) get the right thing. The RemoveRegisterFromMasks() code - // fixes up everything that already took a dependency on the value that was - // previously read, so this completes the picture. - availableIntRegs.OverrideAssign(availableIntRegs & ~RBM_FPBASE); - } + removeMask |= RBM_FPBASE; } compiler->rpFrameType = frameType; @@ -2518,8 +2514,20 @@ void LinearScan::setFrameType() compiler->codeGen->regSet.rsMaskResvd |= RBM_OPT_RSVD; assert(REG_OPT_RSVD != REG_FP); JITDUMP(" Reserved REG_OPT_RSVD (%s) due to large frame\n", getRegName(REG_OPT_RSVD)); + removeMask |= RBM_OPT_RSVD; } #endif // _TARGET_ARMARCH_ + + if ((removeMask != RBM_NONE) && ((availableIntRegs & removeMask) != 0)) + { + RemoveRegistersFromMasks(removeMask); + // We know that we're already in "read mode" for availableIntRegs. However, + // we need to remove these registers, so subsequent users (like callers + // to allRegs()) get the right thing. The RemoveRegistersFromMasks() code + // fixes up everything that already took a dependency on the value that was + // previously read, so this completes the picture. + availableIntRegs.OverrideAssign(availableIntRegs & ~removeMask); + } } //------------------------------------------------------------------------ diff --git a/src/jit/lsra.h b/src/jit/lsra.h index fe1d713..62ba386 100644 --- a/src/jit/lsra.h +++ b/src/jit/lsra.h @@ -695,7 +695,7 @@ public: RegMaskIndex GetIndexForRegMask(regMaskTP mask); regMaskTP GetRegMaskForIndex(RegMaskIndex index); - void RemoveRegisterFromMasks(regNumber reg); + void RemoveRegistersFromMasks(regMaskTP removeMask); static bool isSingleRegister(regMaskTP regMask) { -- 2.7.4