Index: src/IceTargetLoweringARM32.cpp |
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp |
index c7224381b2bede9f4f631be0cb904144257453c7..8bacb4e419074a5b03abee67a0e75ea7d7fe40e6 100644 |
--- a/src/IceTargetLoweringARM32.cpp |
+++ b/src/IceTargetLoweringARM32.cpp |
@@ -2729,7 +2729,7 @@ void TargetARM32::lowerInt64Arithmetic(InstArithmetic::OpKind Op, |
Variable *T2 = makeReg(IceType_i32); |
Variable *TA_Hi = makeReg(IceType_i32); |
Variable *TA_Lo = makeReg(IceType_i32); |
- Variable *Src0RLo = SrcsLo.src0R(this); |
+ Variable *Src0RLo = SrcsLo.unswappedSrc0R(this); |
Variable *Src0RHi = SrcsHi.unswappedSrc0R(this); |
Variable *Src1RLo = SrcsLo.unswappedSrc1R(this); |
_rsb(T0, Src1RLo, _32); |
@@ -6488,7 +6488,7 @@ void TargetARM32::ComputationTracker::recordProducers(CfgNode *Node) { |
TargetARM32::Sandboxer::Sandboxer(TargetARM32 *Target, |
InstBundleLock::Option BundleOption) |
- : Bundler(Target, BundleOption), Target(Target) {} |
+ : Target(Target), BundleOption(BundleOption) {} |
TargetARM32::Sandboxer::~Sandboxer() {} |
@@ -6511,25 +6511,36 @@ static bool baseNeedsBic(Variable *Base) { |
} |
} // end of anonymous namespace |
+void TargetARM32::Sandboxer::createAutoBundle() { |
+ Bundler = makeUnique<AutoBundle>(Target, BundleOption); |
+} |
+ |
void TargetARM32::Sandboxer::add_sp(Operand *AddAmount) { |
Variable *SP = Target->getPhysicalRegister(RegARM32::Reg_sp); |
- Target->_add(SP, SP, AddAmount); |
- if (Target->NeedSandboxing) { |
- Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
+ if (!Target->NeedSandboxing) { |
+ Target->_add(SP, SP, AddAmount); |
+ return; |
} |
+ createAutoBundle(); |
+ Target->_add(SP, SP, AddAmount); |
+ Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
} |
void TargetARM32::Sandboxer::align_sp(size_t Alignment) { |
Variable *SP = Target->getPhysicalRegister(RegARM32::Reg_sp); |
- Target->alignRegisterPow2(SP, Alignment); |
- if (Target->NeedSandboxing) { |
- Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
+ if (!Target->NeedSandboxing) { |
+ Target->alignRegisterPow2(SP, Alignment); |
+ return; |
} |
+ createAutoBundle(); |
+ Target->alignRegisterPow2(SP, Alignment); |
+ Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
} |
InstARM32Call *TargetARM32::Sandboxer::bl(Variable *ReturnReg, |
Operand *CallTarget) { |
if (Target->NeedSandboxing) { |
+ createAutoBundle(); |
if (auto *CallTargetR = llvm::dyn_cast<Variable>(CallTarget)) { |
Target->_bic(CallTargetR, CallTargetR, |
indirectBranchBicMask(Target->Func)); |
@@ -6542,6 +6553,7 @@ void TargetARM32::Sandboxer::ldr(Variable *Dest, OperandARM32Mem *Mem, |
CondARM32::Cond Pred) { |
Variable *MemBase = Mem->getBase(); |
if (Target->NeedSandboxing && baseNeedsBic(MemBase)) { |
+ createAutoBundle(); |
assert(!Mem->isRegReg()); |
Target->_bic(MemBase, MemBase, memOpBicMask(Target->Func), Pred); |
} |
@@ -6552,6 +6564,7 @@ void TargetARM32::Sandboxer::ldrex(Variable *Dest, OperandARM32Mem *Mem, |
CondARM32::Cond Pred) { |
Variable *MemBase = Mem->getBase(); |
if (Target->NeedSandboxing && baseNeedsBic(MemBase)) { |
+ createAutoBundle(); |
assert(!Mem->isRegReg()); |
Target->_bic(MemBase, MemBase, memOpBicMask(Target->Func), Pred); |
} |
@@ -6560,14 +6573,18 @@ void TargetARM32::Sandboxer::ldrex(Variable *Dest, OperandARM32Mem *Mem, |
void TargetARM32::Sandboxer::reset_sp(Variable *Src) { |
Variable *SP = Target->getPhysicalRegister(RegARM32::Reg_sp); |
- Target->_mov_redefined(SP, Src); |
- if (Target->NeedSandboxing) { |
- Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
+ if (!Target->NeedSandboxing) { |
+ Target->_mov_redefined(SP, Src); |
+ return; |
} |
+ createAutoBundle(); |
+ Target->_mov_redefined(SP, Src); |
+ Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
} |
void TargetARM32::Sandboxer::ret(Variable *RetAddr, Variable *RetValue) { |
if (Target->NeedSandboxing) { |
+ createAutoBundle(); |
Target->_bic(RetAddr, RetAddr, indirectBranchBicMask(Target->Func)); |
} |
Target->_ret(RetAddr, RetValue); |
@@ -6577,6 +6594,7 @@ void TargetARM32::Sandboxer::str(Variable *Src, OperandARM32Mem *Mem, |
CondARM32::Cond Pred) { |
Variable *MemBase = Mem->getBase(); |
if (Target->NeedSandboxing && baseNeedsBic(MemBase)) { |
+ createAutoBundle(); |
assert(!Mem->isRegReg()); |
Target->_bic(MemBase, MemBase, memOpBicMask(Target->Func), Pred); |
} |
@@ -6587,6 +6605,7 @@ void TargetARM32::Sandboxer::strex(Variable *Dest, Variable *Src, |
OperandARM32Mem *Mem, CondARM32::Cond Pred) { |
Variable *MemBase = Mem->getBase(); |
if (Target->NeedSandboxing && baseNeedsBic(MemBase)) { |
+ createAutoBundle(); |
assert(!Mem->isRegReg()); |
Target->_bic(MemBase, MemBase, memOpBicMask(Target->Func), Pred); |
} |
@@ -6595,10 +6614,13 @@ void TargetARM32::Sandboxer::strex(Variable *Dest, Variable *Src, |
void TargetARM32::Sandboxer::sub_sp(Operand *SubAmount) { |
Variable *SP = Target->getPhysicalRegister(RegARM32::Reg_sp); |
- Target->_sub(SP, SP, SubAmount); |
- if (Target->NeedSandboxing) { |
- Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
+ if (!Target->NeedSandboxing) { |
+ Target->_sub(SP, SP, SubAmount); |
+ return; |
} |
+ createAutoBundle(); |
+ Target->_sub(SP, SP, SubAmount); |
+ Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
} |
TargetDataARM32::TargetDataARM32(GlobalContext *Ctx) |