| Index: src/IceTargetLoweringARM32.cpp
|
| diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
|
| index 7e67b71d259fc54a965dfbca3efc23f54c5a9fa3..282fde154364fc3883ac1497e7bb4b01068db8c4 100644
|
| --- a/src/IceTargetLoweringARM32.cpp
|
| +++ b/src/IceTargetLoweringARM32.cpp
|
| @@ -3477,6 +3477,21 @@ Operand *TargetARM32::legalize(Operand *From, LegalMask Allowed,
|
| // legalize() allow a physical register. Legal_Flex converts registers to the
|
| // right type OperandARM32FlexReg as needed.
|
| assert(Allowed & Legal_Reg);
|
| +
|
| + // Copied ipsis literis from TargetX86Base<Machine>.
|
| + if (RegNum == Variable::NoRegister) {
|
| + if (Variable *Subst = getContext().availabilityGet(From)) {
|
| + // At this point we know there is a potential substitution available.
|
| + if (Subst->mustHaveReg() && !Subst->hasReg()) {
|
| + // At this point we know the substitution will have a register.
|
| + if (From->getType() == Subst->getType()) {
|
| + // At this point we know the substitution's register is compatible.
|
| + return Subst;
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| // Go through the various types of operands: OperandARM32Mem,
|
| // OperandARM32Flex, Constant, and Variable. Given the above assertion, if
|
| // type of operand is not legal (e.g., OperandARM32Mem and !Legal_Mem), we
|
| @@ -3734,6 +3749,7 @@ void TargetARM32::postLower() {
|
| if (Ctx->getFlags().getOptLevel() == Opt_m1)
|
| return;
|
| markRedefinitions();
|
| + Context.availabilityUpdate();
|
| }
|
|
|
| void TargetARM32::makeRandomRegisterPermutation(
|
|
|