Index: llvm/lib/Target/X86/X86FrameLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86FrameLowering.cpp +++ llvm/lib/Target/X86/X86FrameLowering.cpp @@ -686,10 +686,12 @@ MBB.addSuccessor(testMBB); // handle tail - if (Offset % StackProbeSize) { - BuildMI(*tailMBB, tailMBB->begin(), DL, TII.get(TargetOpcode::COPY), - StackPtr) - .addReg(FinalStackPtr) + unsigned TailOffset = Offset % StackProbeSize; + if (TailOffset) { + const unsigned Opc = getSUBriOpcode(Uses64BitFramePtr, TailOffset); + BuildMI(*tailMBB, tailMBB->begin(), DL, TII.get(Opc), StackPtr) + .addReg(StackPtr) + .addImm(TailOffset) .setMIFlag(MachineInstr::FrameSetup); } Index: llvm/test/CodeGen/X86/stack-clash-large.ll =================================================================== --- llvm/test/CodeGen/X86/stack-clash-large.ll +++ llvm/test/CodeGen/X86/stack-clash-large.ll @@ -24,7 +24,7 @@ ; CHECK-X86-64-NEXT: cmpq %r11, %rsp ; CHECK-X86-64-NEXT: jl .LBB0_1 ; CHECK-X86-64-NEXT:# %bb.2: -; CHECK-X86-64-NEXT: movq %r11, %rsp +; CHECK-X86-64-NEXT: subq $2248, %rsp ; CHECK-X86-64-NEXT: .cfi_def_cfa_offset 71888 ; CHECK-X86-64-NEXT: movl $1, 264(%rsp) ; CHECK-X86-64-NEXT: movl $1, 28664(%rsp) @@ -43,7 +43,7 @@ ; CHECK-X86-32-NEXT: cmpl %r11d, %esp ; CHECK-X86-32-NEXT: jl .LBB0_1 ; CHECK-X86-32-NEXT:# %bb.2: -; CHECK-X86-32-NEXT: movl %r11d, %esp +; CHECK-X86-32-NEXT: subl $2380, %esp ; CHECK-X86-32-NEXT: .cfi_def_cfa_offset 72016 ; CHECK-X86-32-NEXT: movl $1, 392(%esp) ; CHECK-X86-32-NEXT: movl $1, 28792(%esp)