Index: src/IceTargetLoweringARM32.cpp |
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
index 8a0ebec9a50fb3d5f2ef3ec17bd27a09fe9d0d8a..0fe62e44a919a7c1c67f0f8c59fe4709c1174f2f 100644 |
--- a/src/IceTargetLoweringARM32.cpp |
+++ b/src/IceTargetLoweringARM32.cpp |
@@ -528,22 +528,16 @@ void TargetARM32::lowerArguments() { |
if (!CC.I64InRegs(&RegPair)) |
continue; |
Variable *RegisterArg = Func->makeVariable(Ty); |
- Variable *RegisterLo = Func->makeVariable(IceType_i32); |
- Variable *RegisterHi = Func->makeVariable(IceType_i32); |
- if (BuildDefs::dump()) { |
- RegisterArg->setName(Func, "home_reg:" + Arg->getName(Func)); |
- RegisterLo->setName(Func, "home_reg_lo:" + Arg->getName(Func)); |
- RegisterHi->setName(Func, "home_reg_hi:" + Arg->getName(Func)); |
- } |
- RegisterLo->setRegNum(RegPair.first); |
- RegisterLo->setIsArg(); |
- RegisterHi->setRegNum(RegPair.second); |
- RegisterHi->setIsArg(); |
- RegisterArg->setLoHi(RegisterLo, RegisterHi); |
- RegisterArg->setIsArg(); |
+ auto *RegisterArg64On32 = llvm::cast<Variable64On32>(RegisterArg); |
+ if (BuildDefs::dump()) |
+ RegisterArg64On32->setName(Func, "home_reg:" + Arg->getName(Func)); |
+ RegisterArg64On32->initHiLo(Func); |
+ RegisterArg64On32->setIsArg(); |
+ RegisterArg64On32->getLo()->setRegNum(RegPair.first); |
+ RegisterArg64On32->getHi()->setRegNum(RegPair.second); |
Arg->setIsArg(false); |
- Args[I] = RegisterArg; |
+ Args[I] = RegisterArg64On32; |
Context.insert(InstAssign::create(Func, Arg, RegisterArg)); |
continue; |
} else { |
@@ -582,16 +576,14 @@ void TargetARM32::lowerArguments() { |
void TargetARM32::finishArgumentLowering(Variable *Arg, Variable *FramePtr, |
size_t BasicFrameOffset, |
size_t &InArgsSizeBytes) { |
- Variable *Lo = Arg->getLo(); |
- Variable *Hi = Arg->getHi(); |
- Type Ty = Arg->getType(); |
- if (Lo && Hi && Ty == IceType_i64) { |
- assert(Lo->getType() != IceType_i64); // don't want infinite recursion |
- assert(Hi->getType() != IceType_i64); // don't want infinite recursion |
+ if (auto *Arg64On32 = llvm::dyn_cast<Variable64On32>(Arg)) { |
+ Variable *Lo = Arg64On32->getLo(); |
+ Variable *Hi = Arg64On32->getHi(); |
finishArgumentLowering(Lo, FramePtr, BasicFrameOffset, InArgsSizeBytes); |
finishArgumentLowering(Hi, FramePtr, BasicFrameOffset, InArgsSizeBytes); |
return; |
} |
+ Type Ty = Arg->getType(); |
InArgsSizeBytes = applyStackAlignmentTy(InArgsSizeBytes, Ty); |
Arg->setStackOffset(BasicFrameOffset + InArgsSizeBytes); |
InArgsSizeBytes += typeWidthInBytesOnStack(Ty); |
@@ -1052,39 +1044,14 @@ void TargetARM32::legalizeStackSlots() { |
} |
} |
-void TargetARM32::split64(Variable *Var) { |
- assert(Var->getType() == IceType_i64); |
- Variable *Lo = Var->getLo(); |
- Variable *Hi = Var->getHi(); |
- if (Lo) { |
- assert(Hi); |
- return; |
- } |
- assert(Hi == nullptr); |
- Lo = Func->makeVariable(IceType_i32); |
- Hi = Func->makeVariable(IceType_i32); |
- if (BuildDefs::dump()) { |
- Lo->setName(Func, Var->getName(Func) + "__lo"); |
- Hi->setName(Func, Var->getName(Func) + "__hi"); |
- } |
- Var->setLoHi(Lo, Hi); |
- if (Var->getIsArg()) { |
- Lo->setIsArg(); |
- Hi->setIsArg(); |
- } |
-} |
- |
Operand *TargetARM32::loOperand(Operand *Operand) { |
assert(Operand->getType() == IceType_i64); |
if (Operand->getType() != IceType_i64) |
return Operand; |
- if (auto *Var = llvm::dyn_cast<Variable>(Operand)) { |
- split64(Var); |
- return Var->getLo(); |
- } |
- if (auto *Const = llvm::dyn_cast<ConstantInteger64>(Operand)) { |
+ if (auto *Var64On32 = llvm::dyn_cast<Variable64On32>(Operand)) |
+ return Var64On32->getLo(); |
+ if (auto *Const = llvm::dyn_cast<ConstantInteger64>(Operand)) |
return Ctx->getConstantInt32(static_cast<uint32_t>(Const->getValue())); |
- } |
if (auto *Mem = llvm::dyn_cast<OperandARM32Mem>(Operand)) { |
// Conservatively disallow memory operands with side-effects (pre/post |
// increment) in case of duplication. |
@@ -1107,10 +1074,8 @@ Operand *TargetARM32::hiOperand(Operand *Operand) { |
assert(Operand->getType() == IceType_i64); |
if (Operand->getType() != IceType_i64) |
return Operand; |
- if (auto *Var = llvm::dyn_cast<Variable>(Operand)) { |
- split64(Var); |
- return Var->getHi(); |
- } |
+ if (auto *Var64On32 = llvm::dyn_cast<Variable64On32>(Operand)) |
+ return Var64On32->getHi(); |
if (auto *Const = llvm::dyn_cast<ConstantInteger64>(Operand)) { |
return Ctx->getConstantInt32( |
static_cast<uint32_t>(Const->getValue() >> 32)); |
@@ -1935,10 +1900,9 @@ void TargetARM32::lowerCall(const InstCall *Instr) { |
// Assign the result of the call to Dest. |
if (ReturnReg) { |
if (ReturnRegHi) { |
- assert(Dest->getType() == IceType_i64); |
- split64(Dest); |
- Variable *DestLo = Dest->getLo(); |
- Variable *DestHi = Dest->getHi(); |
+ auto *Dest64On32 = llvm::cast<Variable64On32>(Dest); |
+ Variable *DestLo = Dest64On32->getLo(); |
+ Variable *DestHi = Dest64On32->getHi(); |
_mov(DestLo, ReturnReg); |
_mov(DestHi, ReturnRegHi); |
} else { |
@@ -2103,10 +2067,10 @@ void TargetARM32::lowerCast(const InstCast *Inst) { |
if (isVectorType(Dest->getType())) { |
UnimplementedError(Func->getContext()->getFlags()); |
break; |
- } else if (Dest->getType() == IceType_i64) { |
- split64(Dest); |
- Context.insert(InstFakeDef::create(Func, Dest->getLo())); |
- Context.insert(InstFakeDef::create(Func, Dest->getHi())); |
+ } |
+ if (auto *Dest64On32 = llvm::dyn_cast<Variable64On32>(Dest)) { |
+ Context.insert(InstFakeDef::create(Func, Dest64On32->getLo())); |
+ Context.insert(InstFakeDef::create(Func, Dest64On32->getHi())); |
UnimplementedError(Func->getContext()->getFlags()); |
break; |
} |
@@ -2213,10 +2177,10 @@ void TargetARM32::lowerCast(const InstCast *Inst) { |
Variable *T0 = makeReg(IceType_i32); |
Variable *T1 = makeReg(IceType_i32); |
Variable *Src0R = legalizeToReg(Src0); |
- split64(Dest); |
_vmov(InstARM32Vmov::RegisterPair(T0, T1), Src0R); |
- lowerAssign(InstAssign::create(Func, Dest->getLo(), T0)); |
- lowerAssign(InstAssign::create(Func, Dest->getHi(), T1)); |
+ auto *Dest64On32 = llvm::cast<Variable64On32>(Dest); |
+ lowerAssign(InstAssign::create(Func, Dest64On32->getLo(), T0)); |
+ lowerAssign(InstAssign::create(Func, Dest64On32->getHi(), T1)); |
break; |
} |
case IceType_f64: { |