diff options
author | Pat Gavlin <pagavlin@microsoft.com> | 2017-06-20 18:22:45 -0700 |
---|---|---|
committer | Pat Gavlin <pagavlin@microsoft.com> | 2017-06-24 14:10:19 -0700 |
commit | 04668c8a76da2b1ee07b48e00ae0376ddfbad960 (patch) | |
tree | 76e044caadb00e43853ba89b93aa329a2bef0136 /src/jit/decomposelongs.cpp | |
parent | ab7f3407fa9a03110157ee659b5145a8f6e392ca (diff) | |
download | coreclr-04668c8a76da2b1ee07b48e00ae0376ddfbad960.tar.gz coreclr-04668c8a76da2b1ee07b48e00ae0376ddfbad960.tar.bz2 coreclr-04668c8a76da2b1ee07b48e00ae0376ddfbad960.zip |
Maintain `LIR::IsUnusedValue` in the backend.
This flag indicates whether or not the SDSU temp produced by a node is
ever read. This information is needed by the register allocator, but is
also useful in other parts of the compiler (for example, `TryGetUse` can
return immediately if this flag is set). Setting this flag properly in
rationalize and maintaining it through decomposition and lowering allows
us to remove an IR walk immediately prior to LSRA.
Diffstat (limited to 'src/jit/decomposelongs.cpp')
-rw-r--r-- | src/jit/decomposelongs.cpp | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/src/jit/decomposelongs.cpp b/src/jit/decomposelongs.cpp index 5c3093a791..74031b2263 100644 --- a/src/jit/decomposelongs.cpp +++ b/src/jit/decomposelongs.cpp @@ -114,7 +114,7 @@ void DecomposeLongs::DecomposeRangeHelper() node = DecomposeNode(node); } - assert(Range().CheckLIR(m_compiler)); + assert(Range().CheckLIR(m_compiler, true)); } //------------------------------------------------------------------------ @@ -339,6 +339,14 @@ GenTree* DecomposeLongs::FinalizeDecomposition(LIR::Use& use, assert(Range().Contains(hiResult)); GenTree* gtLong = new (m_compiler, GT_LONG) GenTreeOp(GT_LONG, TYP_LONG, loResult, hiResult); + if (use.IsDummyUse()) + { + gtLong->gtLIRFlags |= LIR::Flags::IsUnusedValue; + } + + loResult->gtLIRFlags &= ~LIR::Flags::IsUnusedValue; + hiResult->gtLIRFlags &= ~LIR::Flags::IsUnusedValue; + Range().InsertAfter(insertResultAfter, gtLong); use.ReplaceWith(m_compiler, gtLong); @@ -1115,7 +1123,11 @@ GenTree* DecomposeLongs::DecomposeShift(LIR::Use& use) // feeds the hi operand while there are no side effects) if ((hiOp1->gtFlags & GTF_ALL_EFFECT) == 0) { - Range().Remove(hiOp1); + Range().Remove(hiOp1, true); + } + else + { + hiOp1->gtLIRFlags |= LIR::Flags::IsUnusedValue; } if (count < 64) @@ -1159,7 +1171,11 @@ GenTree* DecomposeLongs::DecomposeShift(LIR::Use& use) // that feeds the lo operand while there are no side effects) if ((loOp1->gtFlags & GTF_ALL_EFFECT) == 0) { - Range().Remove(loOp1); + Range().Remove(loOp1, true); + } + else + { + loOp1->gtLIRFlags |= LIR::Flags::IsUnusedValue; } // Zero out hi (shift of >= 64 bits moves all the bits out of the two registers) @@ -1215,7 +1231,11 @@ GenTree* DecomposeLongs::DecomposeShift(LIR::Use& use) // feeds the lo operand while there are no side effects) if ((loOp1->gtFlags & GTF_ALL_EFFECT) == 0) { - Range().Remove(loOp1); + Range().Remove(loOp1, true); + } + else + { + loOp1->gtLIRFlags |= LIR::Flags::IsUnusedValue; } assert(count >= 32); @@ -1247,7 +1267,11 @@ GenTree* DecomposeLongs::DecomposeShift(LIR::Use& use) // that feeds the hi operand while there are no side effects) if ((hiOp1->gtFlags & GTF_ALL_EFFECT) == 0) { - Range().Remove(hiOp1); + Range().Remove(hiOp1, true); + } + else + { + hiOp1->gtLIRFlags |= LIR::Flags::IsUnusedValue; } // Zero out lo @@ -1305,7 +1329,11 @@ GenTree* DecomposeLongs::DecomposeShift(LIR::Use& use) // feeds the lo operand while there are no side effects) if ((loOp1->gtFlags & GTF_ALL_EFFECT) == 0) { - Range().Remove(loOp1); + Range().Remove(loOp1, true); + } + else + { + loOp1->gtLIRFlags |= LIR::Flags::IsUnusedValue; } if (count < 64) @@ -1737,24 +1765,27 @@ GenTree* DecomposeLongs::DecomposeSimdGetItem(LIR::Use& use) index = simdTree->gtOp.gtOp2->gtIntCon.gtIconVal; } - LIR::Use op1(Range(), &simdTree->gtOp.gtOp1, simdTree); - unsigned simdTmpVarNum = op1.ReplaceWithLclVar(m_compiler, m_blockWeight); + GenTree* simdTmpVar = RepresentOpAsLocalVar(simdTree->gtOp.gtOp1, simdTree, &simdTree->gtOp.gtOp1); + unsigned simdTmpVarNum = simdTmpVar->AsLclVarCommon()->gtLclNum; JITDUMP("[DecomposeSimdGetItem]: Saving op1 tree to a temp var:\n"); - DISPTREERANGE(Range(), op1.Def()); + DISPTREERANGE(Range(), simdTmpVar); + Range().Remove(simdTmpVar); + GenTree* indexTmpVar = nullptr; unsigned indexTmpVarNum = 0; if (!indexIsConst) { - LIR::Use op2(Range(), &simdTree->gtOp.gtOp2, simdTree); - indexTmpVarNum = op2.ReplaceWithLclVar(m_compiler, m_blockWeight); + indexTmpVar = RepresentOpAsLocalVar(simdTree->gtOp.gtOp2, simdTree, &simdTree->gtOp.gtOp2); + indexTmpVarNum = indexTmpVar->AsLclVarCommon()->gtLclNum; JITDUMP("[DecomposeSimdGetItem]: Saving op2 tree to a temp var:\n"); - DISPTREERANGE(Range(), op2.Def()); + DISPTREERANGE(Range(), indexTmpVar); + Range().Remove(indexTmpVar); } // Create: // loResult = GT_SIMD{get_item}[int](tmp_simd_var, index * 2) - GenTree* simdTmpVar1 = m_compiler->gtNewLclLNode(simdTmpVarNum, simdTree->gtOp.gtOp1->gtType); + GenTree* simdTmpVar1 = simdTmpVar; GenTree* indexTimesTwo1; if (indexIsConst) @@ -1768,7 +1799,7 @@ GenTree* DecomposeLongs::DecomposeSimdGetItem(LIR::Use& use) } else { - GenTree* indexTmpVar1 = m_compiler->gtNewLclLNode(indexTmpVarNum, TYP_INT); + GenTree* indexTmpVar1 = indexTmpVar; GenTree* two1 = m_compiler->gtNewIconNode(2, TYP_INT); indexTimesTwo1 = m_compiler->gtNewOperNode(GT_MUL, TYP_INT, indexTmpVar1, two1); Range().InsertBefore(simdTree, simdTmpVar1, indexTmpVar1, two1, indexTimesTwo1); |