xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/win_chkstk.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=WIN_X32
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s -check-prefix=WIN_X64
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-win32 -code-model=large | FileCheck %s -check-prefix=WIN64_LARGE
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X32
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X64
6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i386-pc-linux | FileCheck %s -check-prefix=LINUX
7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-win32-macho | FileCheck %s -check-prefix=LINUX
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; Windows and mingw require a prologue helper routine if more than 4096 bytes area
10*9880d681SAndroid Build Coastguard Worker; allocated on the stack.  Windows uses __chkstk and mingw uses __alloca.  __alloca
11*9880d681SAndroid Build Coastguard Worker; and the 32-bit version of __chkstk will probe the stack and adjust the stack pointer.
12*9880d681SAndroid Build Coastguard Worker; The 64-bit version of __chkstk is only responsible for probing the stack.  The 64-bit
13*9880d681SAndroid Build Coastguard Worker; prologue is responsible for adjusting the stack pointer.
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; Stack allocation >= 4096 bytes will require call to __chkstk in the Windows ABI.
16*9880d681SAndroid Build Coastguard Workerdefine i32 @main4k() nounwind {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker; WIN_X32:    calll __chkstk
19*9880d681SAndroid Build Coastguard Worker; WIN_X64:    callq __chkstk
20*9880d681SAndroid Build Coastguard Worker; WIN64_LARGE: movabsq $__chkstk, %r11
21*9880d681SAndroid Build Coastguard Worker; WIN64_LARGE: callq *%r11
22*9880d681SAndroid Build Coastguard Worker; MINGW_X32:  calll __alloca
23*9880d681SAndroid Build Coastguard Worker; MINGW_X64:  callq ___chkstk_ms
24*9880d681SAndroid Build Coastguard Worker; LINUX-NOT:  call __chkstk
25*9880d681SAndroid Build Coastguard Worker  %array4096 = alloca [4096 x i8], align 16       ; <[4096 x i8]*> [#uses=0]
26*9880d681SAndroid Build Coastguard Worker  ret i32 0
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; Make sure we don't call __chkstk or __alloca when we have less than a 4096 stack
30*9880d681SAndroid Build Coastguard Worker; allocation.
31*9880d681SAndroid Build Coastguard Workerdefine i32 @main128() nounwind {
32*9880d681SAndroid Build Coastguard Workerentry:
33*9880d681SAndroid Build Coastguard Worker; WIN_X32:       # BB#0:
34*9880d681SAndroid Build Coastguard Worker; WIN_X32-NOT:   calll __chkstk
35*9880d681SAndroid Build Coastguard Worker; WIN_X32:       ret
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; WIN_X64:       # BB#0:
38*9880d681SAndroid Build Coastguard Worker; WIN_X64-NOT:   callq __chkstk
39*9880d681SAndroid Build Coastguard Worker; WIN_X64:       ret
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; MINGW_X64:     # BB#0:
42*9880d681SAndroid Build Coastguard Worker; MINGW_X64-NOT: callq ___chkstk_ms
43*9880d681SAndroid Build Coastguard Worker; MINGW_X64:     ret
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; LINUX:         # BB#0:
46*9880d681SAndroid Build Coastguard Worker; LINUX-NOT:     call __chkstk
47*9880d681SAndroid Build Coastguard Worker; LINUX:         ret
48*9880d681SAndroid Build Coastguard Worker  %array128 = alloca [128 x i8], align 16         ; <[128 x i8]*> [#uses=0]
49*9880d681SAndroid Build Coastguard Worker  ret i32 0
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; Make sure we don't call __chkstk or __alloca on non-Windows even if the
53*9880d681SAndroid Build Coastguard Worker; caller has the Win64 calling convention.
54*9880d681SAndroid Build Coastguard Workerdefine x86_64_win64cc i32 @main4k_win64() nounwind {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker; WIN_X32:    calll __chkstk
57*9880d681SAndroid Build Coastguard Worker; WIN_X64:    callq __chkstk
58*9880d681SAndroid Build Coastguard Worker; WIN64_LARGE: movabsq $__chkstk, %r11
59*9880d681SAndroid Build Coastguard Worker; WIN64_LARGE: callq *%r11
60*9880d681SAndroid Build Coastguard Worker; MINGW_X32:  calll __alloca
61*9880d681SAndroid Build Coastguard Worker; MINGW_X64:  callq ___chkstk_ms
62*9880d681SAndroid Build Coastguard Worker; LINUX-NOT:  call __chkstk
63*9880d681SAndroid Build Coastguard Worker  %array4096 = alloca [4096 x i8], align 16       ; <[4096 x i8]*> [#uses=0]
64*9880d681SAndroid Build Coastguard Worker  ret i32 0
65*9880d681SAndroid Build Coastguard Worker}
66