Skip to content

Commit

Permalink
Fixes register allocation issues on arm32
Browse files Browse the repository at this point in the history
Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
  • Loading branch information
Zoltan Herczeg committed May 23, 2024
1 parent 3341dfe commit 9a7fba6
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions src/jit/RegisterAlloc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ uint8_t RegisterSet::allocateRegisterPair(VariableList::Variable* variable, uint
i = maxRangeIndexSingle1;
maxRangeEnd = maxRangeEndSingle1;
} else {
i = maxRangeEndPair;
i = maxRangeIndexPair;
maxRangeEnd = maxRangeEndPair;
}
} else if (maxRangeEndPair < maxRangeEndSingle1 && maxRangeEndPair < maxRangeEndSingle2) {
Expand All @@ -379,7 +379,6 @@ uint8_t RegisterSet::allocateRegisterPair(VariableList::Variable* variable, uint
VariableList::Variable* prevVariable = m_registers[i].variable;
ASSERT(prevVariable != nullptr);

#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
if (prevVariable->reg2 != prevVariable->reg1) {
size_t other = (i == prevVariable->reg1) ? prevVariable->reg2 : prevVariable->reg1;

Expand All @@ -388,7 +387,6 @@ uint8_t RegisterSet::allocateRegisterPair(VariableList::Variable* variable, uint
m_registers[other].variable = nullptr;
}
prevVariable->reg2 = VariableList::kUnusedReg;
#endif /* SLJIT_32BIT_ARCHITECTURE */
prevVariable->reg1 = VariableList::kUnusedReg;
}

Expand All @@ -402,9 +400,7 @@ uint8_t RegisterSet::allocateRegisterPair(VariableList::Variable* variable, uint

if (variable != nullptr) {
variable->reg1 = freeReg;
#if (defined SLJIT_32BIT_ARCHITECTURE && SLJIT_32BIT_ARCHITECTURE)
variable->reg2 = i;
#endif /* SLJIT_32BIT_ARCHITECTURE */
}

if (i >= m_usedSavedRegisters) {
Expand Down Expand Up @@ -453,7 +449,7 @@ uint8_t RegisterSet::allocateQuadRegister(VariableList::Variable* variable)
maxRangeEnd = m_registers[i].rangeEnd;
maxRangeIndex = i;
}
} else {
} else if (m_registers[i].rangeEnd > kReservedReg && m_registers[i].rangeEnd > kReservedReg) {
size_t averageEnd = ((m_registers[i].rangeEnd + m_registers[i + 1].rangeEnd) + 1) >> 1;

if (averageEnd > maxRangeEnd) {
Expand All @@ -474,17 +470,24 @@ uint8_t RegisterSet::allocateQuadRegister(VariableList::Variable* variable)

// Move variable into memory.
i = maxRangeIndex;
ASSERT(m_registers[i].variable != nullptr);
ASSERT(m_registers[i].rangeEnd > kReservedReg
&& m_registers[i + 1].rangeEnd > kReservedReg
&& (m_registers[i].variable != nullptr || m_registers[i + 1].variable != nullptr));

VariableList::Variable* prevVariable = m_registers[i].variable;
ASSERT(prevVariable->reg2 == prevVariable->reg1 || prevVariable->reg2 == prevVariable->reg1 + 1);
prevVariable->reg1 = VariableList::kUnusedReg;
prevVariable->reg2 = VariableList::kUnusedReg;

if (prevVariable != nullptr) {
ASSERT(prevVariable->reg2 == prevVariable->reg1 || prevVariable->reg2 == prevVariable->reg1 + 1);
prevVariable->reg1 = VariableList::kUnusedReg;
prevVariable->reg2 = VariableList::kUnusedReg;
}

prevVariable = m_registers[i + 1].variable;
ASSERT(prevVariable->reg2 == prevVariable->reg1 || prevVariable->reg2 == prevVariable->reg1 + 1);
prevVariable->reg1 = VariableList::kUnusedReg;
prevVariable->reg2 = VariableList::kUnusedReg;
if (prevVariable != nullptr) {
ASSERT(prevVariable->reg2 == prevVariable->reg1 || prevVariable->reg2 == prevVariable->reg1 + 1);
prevVariable->reg1 = VariableList::kUnusedReg;
prevVariable->reg2 = VariableList::kUnusedReg;
}
}

// Allocated registers are also reserved for the current byte code.
Expand Down

0 comments on commit 9a7fba6

Please sign in to comment.