| Index: src/IceTargetLoweringX86BaseImpl.h
|
| diff --git a/src/IceTargetLoweringX86BaseImpl.h b/src/IceTargetLoweringX86BaseImpl.h
|
| index 245819a5344c1caee049dae16090179334944796..04bead8d5770d9fe4da7e51e0610d1ef43985d22 100644
|
| --- a/src/IceTargetLoweringX86BaseImpl.h
|
| +++ b/src/IceTargetLoweringX86BaseImpl.h
|
| @@ -791,13 +791,16 @@ template <class Machine>
|
| void TargetX86Base<Machine>::finishArgumentLowering(Variable *Arg,
|
| Variable *FramePtr,
|
| size_t BasicFrameOffset,
|
| + size_t StackAdjBytes,
|
| size_t &InArgsSizeBytes) {
|
| if (!Traits::Is64Bit) {
|
| 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);
|
| + finishArgumentLowering(Lo, FramePtr, BasicFrameOffset, StackAdjBytes,
|
| + InArgsSizeBytes);
|
| + finishArgumentLowering(Hi, FramePtr, BasicFrameOffset, StackAdjBytes,
|
| + InArgsSizeBytes);
|
| return;
|
| }
|
| }
|
| @@ -810,7 +813,8 @@ void TargetX86Base<Machine>::finishArgumentLowering(Variable *Arg,
|
| if (Arg->hasReg()) {
|
| assert(Ty != IceType_i64 || Traits::Is64Bit);
|
| typename Traits::X86OperandMem *Mem = Traits::X86OperandMem::create(
|
| - Func, Ty, FramePtr, Ctx->getConstantInt32(Arg->getStackOffset()));
|
| + Func, Ty, FramePtr,
|
| + Ctx->getConstantInt32(Arg->getStackOffset() + StackAdjBytes));
|
| if (isVectorType(Arg->getType())) {
|
| _movp(Arg, Mem);
|
| } else {
|
| @@ -905,7 +909,8 @@ TargetX86Base<Machine>::getRegisterSet(RegSetMask Include,
|
|
|
| template <class Machine>
|
| void TargetX86Base<Machine>::lowerAlloca(const InstAlloca *Inst) {
|
| - IsEbpBasedFrame = true;
|
| + if (!Inst->getKnownFrameOffset())
|
| + IsEbpBasedFrame = true;
|
| // Conservatively require the stack to be aligned. Some stack adjustment
|
| // operations implemented below assume that the stack is aligned before the
|
| // alloca. All the alloca code ensures that the stack alignment is preserved
|
| @@ -935,7 +940,12 @@ void TargetX86Base<Machine>::lowerAlloca(const InstAlloca *Inst) {
|
| llvm::dyn_cast<ConstantInteger32>(TotalSize)) {
|
| uint32_t Value = ConstantTotalSize->getValue();
|
| Value = Utils::applyAlignment(Value, Alignment);
|
| - _sub(esp, Ctx->getConstantInt32(Value));
|
| + if (Inst->getKnownFrameOffset()) {
|
| + _adjust_stack(Value);
|
| + FixedAllocaSizeBytes += Value;
|
| + } else {
|
| + _sub(esp, Ctx->getConstantInt32(Value));
|
| + }
|
| } else {
|
| // Non-constant sizes need to be adjusted to the next highest multiple of
|
| // the required alignment at runtime.
|
|
|