• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -mtriple=i686-pc-win32 | FileCheck %s -check-prefix=WIN_X32
2; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s -check-prefix=WIN_X64
3; RUN: llc < %s -mtriple=x86_64-pc-win32 -code-model=large | FileCheck %s -check-prefix=WIN64_LARGE
4; RUN: llc < %s -mtriple=i686-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X32
5; RUN: llc < %s -mtriple=x86_64-pc-mingw32 | FileCheck %s -check-prefix=MINGW_X64
6; RUN: llc < %s -mtriple=i386-pc-linux | FileCheck %s -check-prefix=LINUX
7; RUN: llc < %s -mtriple=x86_64-pc-win32-macho | FileCheck %s -check-prefix=LINUX
8
9; Windows and mingw require a prologue helper routine if more than 4096 bytes area
10; allocated on the stack.  Windows uses __chkstk and mingw uses __alloca.  __alloca
11; and the 32-bit version of __chkstk will probe the stack and adjust the stack pointer.
12; The 64-bit version of __chkstk is only responsible for probing the stack.  The 64-bit
13; prologue is responsible for adjusting the stack pointer.
14
15; Stack allocation >= 4096 bytes will require call to __chkstk in the Windows ABI.
16define i32 @main4k() nounwind {
17entry:
18; WIN_X32:    calll __chkstk
19; WIN_X64:    callq __chkstk
20; WIN64_LARGE: movabsq $__chkstk, %r11
21; WIN64_LARGE: callq *%r11
22; MINGW_X32:  calll __alloca
23; MINGW_X64:  callq ___chkstk_ms
24; LINUX-NOT:  call __chkstk
25  %array4096 = alloca [4096 x i8], align 16       ; <[4096 x i8]*> [#uses=0]
26  ret i32 0
27}
28
29; Make sure we don't call __chkstk or __alloca when we have less than a 4096 stack
30; allocation.
31define i32 @main128() nounwind {
32entry:
33; WIN_X32:       # %bb.0:
34; WIN_X32-NOT:   calll __chkstk
35; WIN_X32:       ret
36
37; WIN_X64:       # %bb.0:
38; WIN_X64-NOT:   callq __chkstk
39; WIN_X64:       ret
40
41; MINGW_X64:     # %bb.0:
42; MINGW_X64-NOT: callq ___chkstk_ms
43; MINGW_X64:     ret
44
45; LINUX:         # %bb.0:
46; LINUX-NOT:     call __chkstk
47; LINUX:         ret
48  %array128 = alloca [128 x i8], align 16         ; <[128 x i8]*> [#uses=0]
49  ret i32 0
50}
51
52; Make sure we don't call __chkstk or __alloca on non-Windows even if the
53; caller has the Win64 calling convention.
54define win64cc i32 @main4k_win64() nounwind {
55entry:
56; WIN_X32:    calll __chkstk
57; WIN_X64:    callq __chkstk
58; WIN64_LARGE: movabsq $__chkstk, %r11
59; WIN64_LARGE: callq *%r11
60; MINGW_X32:  calll __alloca
61; MINGW_X64:  callq ___chkstk_ms
62; LINUX-NOT:  call __chkstk
63  %array4096 = alloca [4096 x i8], align 16       ; <[4096 x i8]*> [#uses=0]
64  ret i32 0
65}
66
67; PR30687: Avoid crashing when inserting a __chkstk call at the end of an MBB.
68define void @dont_crash() {
69entry:
70; WIN_X32:    calll __chkstk
71; WIN_X64:    callq __chkstk
72; WIN64_LARGE: movabsq $__chkstk, %r11
73; WIN64_LARGE: callq *%r11
74; MINGW_X32:  calll __alloca
75; MINGW_X64:  callq ___chkstk_ms
76; LINUX-NOT:  call __chkstk
77  %buffer = alloca [4096 x i8]
78  br label %ret
79
80ret:
81  ret void
82}
83