| Index: src/IceTargetLoweringARM32.cpp
|
| diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
|
| index f92160b47f0b7eb9ee3516f598bf24edb6b4b157..b5495017c01eff52db765ab404e26490c1432381 100644
|
| --- a/src/IceTargetLoweringARM32.cpp
|
| +++ b/src/IceTargetLoweringARM32.cpp
|
| @@ -1504,7 +1504,7 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
|
| _sub(T2, Src1RLo, _32);
|
| _cmp(T2, _0);
|
| _lsl(TA_Hi, Src0RLo, T2, CondARM32::GE);
|
| - _set_dest_nonkillable();
|
| + _set_dest_redefined();
|
| _lsl(TA_Lo, Src0RLo, Src1RLo);
|
| _mov(DestLo, TA_Lo);
|
| _mov(DestHi, TA_Hi);
|
| @@ -1555,11 +1555,11 @@ void TargetARM32::lowerArithmetic(const InstArithmetic *Inst) {
|
| _cmp(T2, _0);
|
| if (IsAshr) {
|
| _asr(TA_Lo, Src0RHi, T2, CondARM32::GE);
|
| - _set_dest_nonkillable();
|
| + _set_dest_redefined();
|
| _asr(TA_Hi, Src0RHi, Src1RLo);
|
| } else {
|
| _lsr(TA_Lo, Src0RHi, T2, CondARM32::GE);
|
| - _set_dest_nonkillable();
|
| + _set_dest_redefined();
|
| _lsr(TA_Hi, Src0RHi, Src1RLo);
|
| }
|
| _mov(DestLo, TA_Lo);
|
| @@ -2304,7 +2304,7 @@ void TargetARM32::lowerCast(const InstCast *Inst) {
|
| case IceType_v16i8:
|
| case IceType_v4f32:
|
| case IceType_v4i32: {
|
| - // avoid cryptic liveness errors
|
| + // avoid liveness errors
|
| Variable *T = makeReg(DestType);
|
| Context.insert(InstFakeDef::create(Func, T, legalizeToReg(Src0)));
|
| _mov(Dest, T);
|
| @@ -2388,15 +2388,17 @@ void TargetARM32::lowerFcmp(const InstFcmp *Inst) {
|
| if (CC0 != CondARM32::kNone) {
|
| _mov(T, One, CC0);
|
| // If this mov is not a maybe mov, but an actual mov (i.e., CC0 == AL), we
|
| - // don't want to set_dest_nonkillable so that liveness + dead-code
|
| + // don't want to _set_dest_redefined so that liveness + dead-code
|
| // elimination will get rid of the previous assignment (i.e., T = 0) above.
|
| + // TODO(stichnot,jpp): We should be able to conditionally create the "T=0"
|
| + // instruction based on CC0, instead of relying on DCE to remove it.
|
| if (CC0 != CondARM32::AL)
|
| - _set_dest_nonkillable();
|
| + _set_dest_redefined();
|
| }
|
| if (CC1 != CondARM32::kNone) {
|
| assert(CC0 != CondARM32::kNone);
|
| assert(CC1 != CondARM32::AL);
|
| - _mov_nonkillable(T, One, CC1);
|
| + _mov_redefined(T, One, CC1);
|
| }
|
| _mov(Dest, T);
|
| }
|
| @@ -2475,7 +2477,7 @@ void TargetARM32::lowerIcmp(const InstIcmp *Inst) {
|
| _cmp(Src0Lo, Src1LoRF, CondARM32::EQ);
|
| }
|
| _mov(T, One, TableIcmp64[Index].C1);
|
| - _mov_nonkillable(T, Zero, TableIcmp64[Index].C2);
|
| + _mov_redefined(T, Zero, TableIcmp64[Index].C2);
|
| _mov(Dest, T);
|
| return;
|
| }
|
| @@ -2531,7 +2533,7 @@ void TargetARM32::lowerIcmp(const InstIcmp *Inst) {
|
| Operand *Src1RF = legalize(Src1, Legal_Reg | Legal_Flex);
|
| _cmp(Src0R, Src1RF);
|
| }
|
| - _mov_nonkillable(T, One, getIcmp32Mapping(Inst->getCondition()));
|
| + _mov_redefined(T, One, getIcmp32Mapping(Inst->getCondition()));
|
| _mov(Dest, T);
|
| return;
|
| }
|
| @@ -2753,7 +2755,7 @@ void TargetARM32::lowerIntrinsicCall(const InstIntrinsicCall *Instr) {
|
| case Intrinsics::Stackrestore: {
|
| Variable *SP = getPhysicalRegister(RegARM32::Reg_sp);
|
| Operand *Val = legalize(Instr->getArg(0), Legal_Reg | Legal_Flex);
|
| - _mov_nonkillable(SP, Val);
|
| + _mov_redefined(SP, Val);
|
| return;
|
| }
|
| case Intrinsics::Trap:
|
| @@ -2783,9 +2785,9 @@ void TargetARM32::lowerCLZ(Variable *Dest, Variable *ValLoR, Variable *ValHiR) {
|
| _add(T2, T, ThirtyTwo);
|
| _clz(T2, ValHiR, CondARM32::NE);
|
| // T2 is actually a source as well when the predicate is not AL (since it
|
| - // may leave T2 alone). We use set_dest_nonkillable to prolong the liveness
|
| + // may leave T2 alone). We use _set_dest_redefined to prolong the liveness
|
| // of T2 as if it was used as a source.
|
| - _set_dest_nonkillable();
|
| + _set_dest_redefined();
|
| _mov(DestLo, T2);
|
| Variable *T3 = makeReg(Zero->getType());
|
| _mov(T3, Zero);
|
| @@ -2893,7 +2895,7 @@ void TargetARM32::lowerSelect(const InstSelect *Inst) {
|
| Variable *TLo = makeReg(SrcFLo->getType());
|
| _mov(TLo, SrcFLo);
|
| Operand *SrcTLo = legalize(loOperand(SrcT), Legal_Reg | Legal_Flex);
|
| - _mov_nonkillable(TLo, SrcTLo, Cond);
|
| + _mov_redefined(TLo, SrcTLo, Cond);
|
| _mov(DestLo, TLo);
|
| // Set the high portion.
|
| Variable *DestHi = llvm::cast<Variable>(hiOperand(Dest));
|
| @@ -2901,7 +2903,7 @@ void TargetARM32::lowerSelect(const InstSelect *Inst) {
|
| Variable *THi = makeReg(SrcFHi->getType());
|
| _mov(THi, SrcFHi);
|
| Operand *SrcTHi = legalize(hiOperand(SrcT), Legal_Reg | Legal_Flex);
|
| - _mov_nonkillable(THi, SrcTHi, Cond);
|
| + _mov_redefined(THi, SrcTHi, Cond);
|
| _mov(DestHi, THi);
|
| return;
|
| }
|
| @@ -2914,7 +2916,7 @@ void TargetARM32::lowerSelect(const InstSelect *Inst) {
|
| SrcT = legalizeToReg(SrcT);
|
| assert(DestTy == SrcT->getType());
|
| _mov(T, SrcT, Cond);
|
| - _set_dest_nonkillable();
|
| + _set_dest_redefined();
|
| _mov(Dest, T);
|
| return;
|
| }
|
| @@ -2923,7 +2925,7 @@ void TargetARM32::lowerSelect(const InstSelect *Inst) {
|
| Variable *T = makeReg(SrcF->getType());
|
| _mov(T, SrcF);
|
| SrcT = legalize(SrcT, Legal_Reg | Legal_Flex);
|
| - _mov_nonkillable(T, SrcT, Cond);
|
| + _mov_redefined(T, SrcT, Cond);
|
| _mov(Dest, T);
|
| }
|
|
|
| @@ -3259,7 +3261,7 @@ void TargetARM32::alignRegisterPow2(Variable *Reg, uint32_t Align) {
|
| void TargetARM32::postLower() {
|
| if (Ctx->getFlags().getOptLevel() == Opt_m1)
|
| return;
|
| - inferTwoAddress();
|
| + markRedefinitions();
|
| }
|
|
|
| void TargetARM32::makeRandomRegisterPermutation(
|
|
|