diff options
author | Carol Eidt <carol.eidt@microsoft.com> | 2018-03-26 13:33:28 -0700 |
---|---|---|
committer | Carol Eidt <carol.eidt@microsoft.com> | 2018-03-26 13:33:28 -0700 |
commit | 26c5dcb837fc7b5f629c7b34be5e127d1bac1539 (patch) | |
tree | 034ff9e449c9a20ca603fe7cb38bd8f74e2fff36 /src/jit/lsra.cpp | |
parent | 240ea0c7feecd8325af704be18022eb9c3b6b2f9 (diff) | |
download | coreclr-26c5dcb837fc7b5f629c7b34be5e127d1bac1539.tar.gz coreclr-26c5dcb837fc7b5f629c7b34be5e127d1bac1539.tar.bz2 coreclr-26c5dcb837fc7b5f629c7b34be5e127d1bac1539.zip |
Fix condition
Diffstat (limited to 'src/jit/lsra.cpp')
-rw-r--r-- | src/jit/lsra.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/jit/lsra.cpp b/src/jit/lsra.cpp index 8bf17effe8..7cdcb8ee62 100644 --- a/src/jit/lsra.cpp +++ b/src/jit/lsra.cpp @@ -8282,9 +8282,23 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, { // We may have freed up the other half of a double where the lower half // was already free. - regNumber lowerHalfReg = REG_PREV(fromReg); - if (location[lowerHalfReg] == REG_NA) + regNumber lowerHalfReg = REG_PREV(fromReg); + regNumber lowerHalfSrcReg = (regNumber)source[lowerHalfReg]; + regNumber lowerHalfSrcLoc = (regNumber)location[lowerHalfReg]; + // Necessary conditions: + // - There is a source register for this reg (lowerHalfSrcReg != REG_NA) + // - It is currently free (lowerHalfSrcLoc == REG_NA) + // - The source interval isn't yet completed (sourceIntervals[lowerHalfSrcReg] != nullptr) + // - It's not in the ready set ((targetRegsReady & genRegMask(lowerHalfReg)) == + // RBM_NONE) + // + if ((lowerHalfSrcReg != REG_NA) && (lowerHalfSrcLoc == REG_NA) && + (sourceIntervals[lowerHalfSrcReg] != nullptr) && + ((targetRegsReady & genRegMask(lowerHalfReg)) == RBM_NONE)) { + // This must be a double interval, otherwise it would be in targetRegsReady, or already + // completed. + assert(sourceIntervals[lowerHalfSrcReg]->registerType == TYP_DOUBLE); targetRegsReady |= genRegMask(lowerHalfReg); } #endif // _TARGET_ARM_ |