blob: 67088b49d1dc60964c5631a47d1cec06197e4d32 [file] [log] [blame]
David Majnemer3aa0bd82015-02-24 00:11:32 +00001; RUN: llc < %s -O0 -mattr=sse2 -mtriple=x86_64-pc-windows-itanium | FileCheck %s -check-prefix=WIN64 -check-prefix=NORM
2; RUN: llc < %s -O0 -mattr=sse2 -mtriple=x86_64-pc-mingw32 | FileCheck %s -check-prefix=WIN64 -check-prefix=NORM
3; RUN: llc < %s -O0 -mattr=sse2 -mtriple=x86_64-pc-mingw32 -mcpu=atom | FileCheck %s -check-prefix=WIN64 -check-prefix=ATOM
NAKAMURA Takumi1db59952014-06-25 12:41:52 +00004
5; Check function without prolog
6define void @foo0() uwtable {
7entry:
8 ret void
9}
10; WIN64-LABEL: foo0:
Hans Wennborgc4b1d202016-09-22 19:50:05 +000011; WIN64-NOT: .seh_proc foo0
12; WIN64-NOT: .seh_endprologue
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000013; WIN64: ret
Hans Wennborgc4b1d202016-09-22 19:50:05 +000014; WIN64-NOT: .seh_endproc
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000015
16; Checks a small stack allocation
17define void @foo1() uwtable {
18entry:
19 %baz = alloca [2000 x i16], align 2
20 ret void
21}
22; WIN64-LABEL: foo1:
23; WIN64: .seh_proc foo1
David Majnemer3aa0bd82015-02-24 00:11:32 +000024; NORM: subq $4000, %rsp
25; ATOM: leaq -4000(%rsp), %rsp
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000026; WIN64: .seh_stackalloc 4000
27; WIN64: .seh_endprologue
28; WIN64: addq $4000, %rsp
29; WIN64: ret
30; WIN64: .seh_endproc
31
32; Checks a stack allocation requiring call to __chkstk/___chkstk_ms
33define void @foo2() uwtable {
34entry:
35 %baz = alloca [4000 x i16], align 2
36 ret void
37}
38; WIN64-LABEL: foo2:
39; WIN64: .seh_proc foo2
David Majnemer006c4902015-02-23 21:50:30 +000040; WIN64: movl $8000, %eax
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000041; WIN64: callq {{__chkstk|___chkstk_ms}}
42; WIN64: subq %rax, %rsp
43; WIN64: .seh_stackalloc 8000
44; WIN64: .seh_endprologue
45; WIN64: addq $8000, %rsp
46; WIN64: ret
47; WIN64: .seh_endproc
48
49
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000050define i32 @foo3(i32 %f_arg, i32 %e_arg, i32 %d_arg, i32 %c_arg, i32 %b_arg, i32 %a_arg) uwtable {
51entry:
52 %a = alloca i32
53 %b = alloca i32
54 %c = alloca i32
55 %d = alloca i32
56 %e = alloca i32
57 %f = alloca i32
Nikita Popov2f448bf2022-06-22 14:33:12 +020058 store i32 %a_arg, ptr %a
59 store i32 %b_arg, ptr %b
60 store i32 %c_arg, ptr %c
61 store i32 %d_arg, ptr %d
62 store i32 %e_arg, ptr %e
63 store i32 %f_arg, ptr %f
64 %tmp = load i32, ptr %a
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000065 %tmp1 = mul i32 %tmp, 2
Nikita Popov2f448bf2022-06-22 14:33:12 +020066 %tmp2 = load i32, ptr %b
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000067 %tmp3 = mul i32 %tmp2, 3
68 %tmp4 = add i32 %tmp1, %tmp3
Nikita Popov2f448bf2022-06-22 14:33:12 +020069 %tmp5 = load i32, ptr %c
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000070 %tmp6 = mul i32 %tmp5, 5
71 %tmp7 = add i32 %tmp4, %tmp6
Nikita Popov2f448bf2022-06-22 14:33:12 +020072 %tmp8 = load i32, ptr %d
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000073 %tmp9 = mul i32 %tmp8, 7
74 %tmp10 = add i32 %tmp7, %tmp9
Nikita Popov2f448bf2022-06-22 14:33:12 +020075 %tmp11 = load i32, ptr %e
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000076 %tmp12 = mul i32 %tmp11, 11
77 %tmp13 = add i32 %tmp10, %tmp12
Nikita Popov2f448bf2022-06-22 14:33:12 +020078 %tmp14 = load i32, ptr %f
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000079 %tmp15 = mul i32 %tmp14, 13
80 %tmp16 = add i32 %tmp13, %tmp15
81 ret i32 %tmp16
82}
83; WIN64-LABEL: foo3:
84; WIN64: .seh_proc foo3
Matt Arsenault89baeae2020-09-22 08:55:54 -040085; NORM: subq $16, %rsp
86; ATOM: leaq -16(%rsp), %rsp
87; WIN64: .seh_stackalloc 16
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000088; WIN64: .seh_endprologue
Matt Arsenault89baeae2020-09-22 08:55:54 -040089; WIN64: addq $16, %rsp
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000090; WIN64: ret
91; WIN64: .seh_endproc
92
93
94; Check emission of eh handler and handler data
Nikita Popov2f448bf2022-06-22 14:33:12 +020095declare i32 @_d_eh_personality(i32, i32, i64, ptr, ptr)
96declare void @_d_eh_resume_unwind(ptr)
NAKAMURA Takumi1db59952014-06-25 12:41:52 +000097
98declare i32 @bar()
99
Nikita Popov2f448bf2022-06-22 14:33:12 +0200100define i32 @foo4() #0 personality ptr @_d_eh_personality {
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000101entry:
102 %step = alloca i32, align 4
Nikita Popov2f448bf2022-06-22 14:33:12 +0200103 store i32 0, ptr %step
104 %tmp = load i32, ptr %step
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000105
106 %tmp1 = invoke i32 @bar()
107 to label %finally unwind label %landingpad
108
109finally:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200110 store i32 1, ptr %step
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000111 br label %endtryfinally
112
113landingpad:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200114 %landing_pad = landingpad { ptr, i32 }
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000115 cleanup
Nikita Popov2f448bf2022-06-22 14:33:12 +0200116 %tmp3 = extractvalue { ptr, i32 } %landing_pad, 0
117 store i32 2, ptr %step
118 call void @_d_eh_resume_unwind(ptr %tmp3)
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000119 unreachable
120
121endtryfinally:
Nikita Popov2f448bf2022-06-22 14:33:12 +0200122 %tmp10 = load i32, ptr %step
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000123 ret i32 %tmp10
124}
125; WIN64-LABEL: foo4:
126; WIN64: .seh_proc foo4
127; WIN64: .seh_handler _d_eh_personality, @unwind, @except
Reid Klecknerbf023992019-09-09 23:04:25 +0000128; NORM: subq $40, %rsp
129; ATOM: leaq -40(%rsp), %rsp
130; WIN64: .seh_stackalloc 40
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000131; WIN64: .seh_endprologue
Daniel Paoliellob3458fd2025-01-30 13:51:30 -0800132; WIN64: .seh_startepilogue
Reid Klecknerbf023992019-09-09 23:04:25 +0000133; WIN64: addq $40, %rsp
Daniel Paoliellob3458fd2025-01-30 13:51:30 -0800134; WIN64: .seh_endepilogue
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000135; WIN64: ret
136; WIN64: .seh_handlerdata
137; WIN64: .seh_endproc
138
139
140; Check stack re-alignment and xmm spilling
141define void @foo5() uwtable {
142entry:
143 %s = alloca i32, align 64
144 call void asm sideeffect "", "~{rbx},~{rdi},~{xmm6},~{xmm7}"()
145 ret void
146}
147; WIN64-LABEL: foo5:
148; WIN64: .seh_proc foo5
149; WIN64: pushq %rbp
Reid Klecknera33474d2019-08-30 21:23:05 +0000150; WIN64: .seh_pushreg %rbp
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000151; WIN64: pushq %rdi
Reid Klecknera33474d2019-08-30 21:23:05 +0000152; WIN64: .seh_pushreg %rdi
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000153; WIN64: pushq %rbx
Reid Klecknera33474d2019-08-30 21:23:05 +0000154; WIN64: .seh_pushreg %rbx
David Majnemer3aa0bd82015-02-24 00:11:32 +0000155; NORM: subq $96, %rsp
156; ATOM: leaq -96(%rsp), %rsp
David Majnemer89d05642015-02-21 01:04:47 +0000157; WIN64: .seh_stackalloc 96
158; WIN64: leaq 96(%rsp), %rbp
Reid Klecknera33474d2019-08-30 21:23:05 +0000159; WIN64: .seh_setframe %rbp, 96
David Majnemer89d05642015-02-21 01:04:47 +0000160; WIN64: movaps %xmm7, -16(%rbp) # 16-byte Spill
Reid Klecknera33474d2019-08-30 21:23:05 +0000161; WIN64: .seh_savexmm %xmm7, 80
David Majnemer89d05642015-02-21 01:04:47 +0000162; WIN64: movaps %xmm6, -32(%rbp) # 16-byte Spill
Reid Klecknera33474d2019-08-30 21:23:05 +0000163; WIN64: .seh_savexmm %xmm6, 64
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000164; WIN64: .seh_endprologue
David Majnemer93c22a42015-02-10 00:57:42 +0000165; WIN64: andq $-64, %rsp
David Majnemer89d05642015-02-21 01:04:47 +0000166; WIN64: movaps -32(%rbp), %xmm6 # 16-byte Reload
167; WIN64: movaps -16(%rbp), %xmm7 # 16-byte Reload
Daniel Paoliellob3458fd2025-01-30 13:51:30 -0800168; WIN64: .seh_startepilogue
David Majnemere1bbad92015-02-25 21:13:37 +0000169; WIN64: movq %rbp, %rsp
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000170; WIN64: popq %rbx
171; WIN64: popq %rdi
172; WIN64: popq %rbp
Daniel Paoliellob3458fd2025-01-30 13:51:30 -0800173; WIN64: .seh_endepilogue
NAKAMURA Takumi1db59952014-06-25 12:41:52 +0000174; WIN64: retq
175; WIN64: .seh_endproc