From ad6622575cea014762be787c4b1d34bc40254415 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 23 Feb 2015 21:50:30 +0000 Subject: [PATCH] X86: Use a smaller 'mov' instruction for stack probe calls Prologue emission, in some cases, requires calls to a stack probe helper function. The amount of stack to probe is passed as a register argument in the Win64 ABI but the instruction sequence used is pessimistic: it assumes that the number of bytes to probe is greater than 4 GB. Instead, select a more appropriate opcode depending on the number of bytes we are going to probe. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230270 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86FrameLowering.cpp | 16 +++++++++++++--- test/CodeGen/X86/win64_alloca_dynalloca.ll | 6 +++--- test/CodeGen/X86/win64_eh.ll | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/Target/X86/X86FrameLowering.cpp b/lib/Target/X86/X86FrameLowering.cpp index 75fd4fdb434..cf7a4ce4bed 100644 --- a/lib/Target/X86/X86FrameLowering.cpp +++ b/lib/Target/X86/X86FrameLowering.cpp @@ -820,9 +820,19 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF) const { if (Is64Bit) { // Handle the 64-bit Windows ABI case where we need to call __chkstk. // Function prologue is responsible for adjusting the stack pointer. - BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64ri), X86::RAX) - .addImm(NumBytes) - .setMIFlag(MachineInstr::FrameSetup); + if (isUInt<32>(NumBytes)) { + BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32ri), X86::EAX) + .addImm(NumBytes) + .setMIFlag(MachineInstr::FrameSetup); + } else if (isInt<32>(NumBytes)) { + BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64ri32), X86::RAX) + .addImm(NumBytes) + .setMIFlag(MachineInstr::FrameSetup); + } else { + BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64ri), X86::RAX) + .addImm(NumBytes) + .setMIFlag(MachineInstr::FrameSetup); + } } else { // Allocate NumBytes-4 bytes on stack in case of isEAXAlive. // We'll also use 4 already allocated bytes for EAX. diff --git a/test/CodeGen/X86/win64_alloca_dynalloca.ll b/test/CodeGen/X86/win64_alloca_dynalloca.ll index 810b23593fd..abda2272c66 100644 --- a/test/CodeGen/X86/win64_alloca_dynalloca.ll +++ b/test/CodeGen/X86/win64_alloca_dynalloca.ll @@ -14,19 +14,19 @@ entry: %buf0 = alloca i8, i64 4096, align 1 ; ___chkstk_ms does not adjust %rsp. -; M64: $4096, %rax +; M64: $4096, %eax ; M64: callq ___chkstk_ms ; M64: subq %rax, %rsp ; M64: leaq 128(%rsp), %rbp ; __chkstk does not adjust %rsp. -; W64: $4096, %rax +; W64: $4096, %eax ; W64: callq __chkstk ; W64: subq %rax, %rsp ; W64: leaq 128(%rsp), %rbp ; Use %r11 for the large model. -; L64: $4096, %rax +; L64: $4096, %eax ; L64: movabsq $__chkstk, %r11 ; L64: callq *%r11 ; L64: subq %rax, %rsp diff --git a/test/CodeGen/X86/win64_eh.ll b/test/CodeGen/X86/win64_eh.ll index 7b11150d988..76d3e86003d 100644 --- a/test/CodeGen/X86/win64_eh.ll +++ b/test/CodeGen/X86/win64_eh.ll @@ -35,7 +35,7 @@ entry: } ; WIN64-LABEL: foo2: ; WIN64: .seh_proc foo2 -; WIN64: movabsq $8000, %rax +; WIN64: movl $8000, %eax ; WIN64: callq {{__chkstk|___chkstk_ms}} ; WIN64: subq %rax, %rsp ; WIN64: .seh_stackalloc 8000 -- 2.34.1