From 1a25dcceb8257212710f8cc8d896933f5fabf989 Mon Sep 17 00:00:00 2001 From: Hyung-Kyu Choi Date: Wed, 21 Jun 2017 12:06:19 +0900 Subject: [PATCH] Enable and use updateAssginedInterval() for all targets Signed-off-by: Hyung-Kyu Choi Commit migrated from https://github.com/dotnet/coreclr/commit/6dd3d4c991544d02ac88817d745125b84e69598c --- src/coreclr/src/jit/lsra.cpp | 40 +++++++++++----------------------------- src/coreclr/src/jit/lsra.h | 2 +- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/coreclr/src/jit/lsra.cpp b/src/coreclr/src/jit/lsra.cpp index 16672cc..b6117d2 100644 --- a/src/coreclr/src/jit/lsra.cpp +++ b/src/coreclr/src/jit/lsra.cpp @@ -7031,12 +7031,8 @@ void LinearScan::processBlockStartLocations(BasicBlock* currentBlock, bool alloc } else { -// This interval is no longer assigned to this register. -#ifdef _TARGET_ARM_ + // This interval is no longer assigned to this register. updateAssignedInterval(targetRegRecord, nullptr, assignedInterval->registerType); -#else - targetRegRecord->assignedInterval = nullptr; -#endif } } assignPhysReg(targetRegRecord, interval); @@ -8027,11 +8023,8 @@ void LinearScan::allocateRegisters() #endif // DEBUG } -#ifdef _TARGET_ARM_ //----------------------------------------------------------------------------- -// updateAssignedInterval: Update assigned interval of register for ARM32 -// considering register type. When register type is TYP_DOUBLE, update -// two float registers consisting a double register. +// updateAssignedInterval: Update assigned interval of register. // // Arguments: // reg - register to be updated @@ -8042,13 +8035,18 @@ void LinearScan::allocateRegisters() // None // // Assumptions: -// When "regType" is TYP_DOUBLE, "reg" should be a even-numbered float register, -// i.e. lower half of double register. +// For ARM32, when "regType" is TYP_DOUBLE, "reg" should be a even-numbered +// float register, i.e. lower half of double register. +// +// Note: +// For ARM32, two float registers consisting a double register are updated +// together when "regType" is TYP_DOUBLE. // void LinearScan::updateAssignedInterval(RegRecord* reg, Interval* interval, RegisterType regType) { reg->assignedInterval = interval; +#ifdef _TARGET_ARM_ // Update overlapping floating point register for TYP_DOUBLE if (regType == TYP_DOUBLE) { @@ -8058,8 +8056,8 @@ void LinearScan::updateAssignedInterval(RegRecord* reg, Interval* interval, Regi anotherHalfReg->assignedInterval = interval; } -} #endif +} // LinearScan::resolveLocalRef // Description: @@ -8136,11 +8134,7 @@ void LinearScan::resolveLocalRef(BasicBlock* block, GenTreePtr treeNode, RefPosi varDsc->lvRegNum = REG_STK; if (interval->assignedReg != nullptr && interval->assignedReg->assignedInterval == interval) { -#ifdef _TARGET_ARM_ updateAssignedInterval(interval->assignedReg, nullptr, interval->registerType); -#else - interval->assignedReg->assignedInterval = nullptr; -#endif } interval->assignedReg = nullptr; interval->physReg = REG_NA; @@ -8168,11 +8162,7 @@ void LinearScan::resolveLocalRef(BasicBlock* block, GenTreePtr treeNode, RefPosi RegRecord* oldRegRecord = getRegisterRecord(oldAssignedReg); if (oldRegRecord->assignedInterval == interval) { -#ifdef _TARGET_ARM_ updateAssignedInterval(oldRegRecord, nullptr, interval->registerType); -#else - oldRegRecord->assignedInterval = nullptr; -#endif } } } @@ -8327,22 +8317,14 @@ void LinearScan::resolveLocalRef(BasicBlock* block, GenTreePtr treeNode, RefPosi interval->assignedReg = nullptr; interval->physReg = REG_NA; -#ifdef _TARGET_ARM_ updateAssignedInterval(physRegRecord, nullptr, interval->registerType); -#else - physRegRecord->assignedInterval = nullptr; -#endif } else { interval->isActive = true; interval->assignedReg = physRegRecord; -#ifdef _TARGET_ARM_ updateAssignedInterval(physRegRecord, interval, interval->registerType); -#else - physRegRecord->assignedInterval = interval; -#endif } } @@ -10107,7 +10089,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock, tempRegFlt = getTempRegForResolution(fromBlock, toBlock, TYP_FLOAT); } #else - tempRegFlt = getTempRegForResolution(fromBlock, toBlock, TYP_FLOAT); + tempRegFlt = getTempRegForResolution(fromBlock, toBlock, TYP_FLOAT); #endif } diff --git a/src/coreclr/src/jit/lsra.h b/src/coreclr/src/jit/lsra.h index bb7b52f..870ddaa 100644 --- a/src/coreclr/src/jit/lsra.h +++ b/src/coreclr/src/jit/lsra.h @@ -697,8 +697,8 @@ private: #ifdef _TARGET_ARM_ bool isSecondHalfReg(RegRecord* regRec, Interval* interval); RegRecord* findAnotherHalfRegRec(RegRecord* regRec); - void updateAssignedInterval(RegRecord* reg, Interval* interval, RegisterType regType); #endif + void updateAssignedInterval(RegRecord* reg, Interval* interval, RegisterType regType); bool canRestorePreviousInterval(RegRecord* regRec, Interval* assignedInterval); bool isAssignedToInterval(Interval* interval, RegRecord* regRec); -- 2.7.4