David Majnemer | 3aa0bd8 | 2015-02-24 00:11:32 +0000 | [diff] [blame] | 1 | ; 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 Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 4 | |
| 5 | ; Check function without prolog |
| 6 | define void @foo0() uwtable { |
| 7 | entry: |
| 8 | ret void |
| 9 | } |
| 10 | ; WIN64-LABEL: foo0: |
Hans Wennborg | c4b1d20 | 2016-09-22 19:50:05 +0000 | [diff] [blame] | 11 | ; WIN64-NOT: .seh_proc foo0 |
| 12 | ; WIN64-NOT: .seh_endprologue |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 13 | ; WIN64: ret |
Hans Wennborg | c4b1d20 | 2016-09-22 19:50:05 +0000 | [diff] [blame] | 14 | ; WIN64-NOT: .seh_endproc |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 15 | |
| 16 | ; Checks a small stack allocation |
| 17 | define void @foo1() uwtable { |
| 18 | entry: |
| 19 | %baz = alloca [2000 x i16], align 2 |
| 20 | ret void |
| 21 | } |
| 22 | ; WIN64-LABEL: foo1: |
| 23 | ; WIN64: .seh_proc foo1 |
David Majnemer | 3aa0bd8 | 2015-02-24 00:11:32 +0000 | [diff] [blame] | 24 | ; NORM: subq $4000, %rsp |
| 25 | ; ATOM: leaq -4000(%rsp), %rsp |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 26 | ; 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 |
| 33 | define void @foo2() uwtable { |
| 34 | entry: |
| 35 | %baz = alloca [4000 x i16], align 2 |
| 36 | ret void |
| 37 | } |
| 38 | ; WIN64-LABEL: foo2: |
| 39 | ; WIN64: .seh_proc foo2 |
David Majnemer | 006c490 | 2015-02-23 21:50:30 +0000 | [diff] [blame] | 40 | ; WIN64: movl $8000, %eax |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 41 | ; 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 Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 50 | define i32 @foo3(i32 %f_arg, i32 %e_arg, i32 %d_arg, i32 %c_arg, i32 %b_arg, i32 %a_arg) uwtable { |
| 51 | entry: |
| 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 Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 58 | 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 Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 65 | %tmp1 = mul i32 %tmp, 2 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 66 | %tmp2 = load i32, ptr %b |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 67 | %tmp3 = mul i32 %tmp2, 3 |
| 68 | %tmp4 = add i32 %tmp1, %tmp3 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 69 | %tmp5 = load i32, ptr %c |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 70 | %tmp6 = mul i32 %tmp5, 5 |
| 71 | %tmp7 = add i32 %tmp4, %tmp6 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 72 | %tmp8 = load i32, ptr %d |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 73 | %tmp9 = mul i32 %tmp8, 7 |
| 74 | %tmp10 = add i32 %tmp7, %tmp9 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 75 | %tmp11 = load i32, ptr %e |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 76 | %tmp12 = mul i32 %tmp11, 11 |
| 77 | %tmp13 = add i32 %tmp10, %tmp12 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 78 | %tmp14 = load i32, ptr %f |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 79 | %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 Arsenault | 89baeae | 2020-09-22 08:55:54 -0400 | [diff] [blame] | 85 | ; NORM: subq $16, %rsp |
| 86 | ; ATOM: leaq -16(%rsp), %rsp |
| 87 | ; WIN64: .seh_stackalloc 16 |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 88 | ; WIN64: .seh_endprologue |
Matt Arsenault | 89baeae | 2020-09-22 08:55:54 -0400 | [diff] [blame] | 89 | ; WIN64: addq $16, %rsp |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 90 | ; WIN64: ret |
| 91 | ; WIN64: .seh_endproc |
| 92 | |
| 93 | |
| 94 | ; Check emission of eh handler and handler data |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 95 | declare i32 @_d_eh_personality(i32, i32, i64, ptr, ptr) |
| 96 | declare void @_d_eh_resume_unwind(ptr) |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 97 | |
| 98 | declare i32 @bar() |
| 99 | |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 100 | define i32 @foo4() #0 personality ptr @_d_eh_personality { |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 101 | entry: |
| 102 | %step = alloca i32, align 4 |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 103 | store i32 0, ptr %step |
| 104 | %tmp = load i32, ptr %step |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 105 | |
| 106 | %tmp1 = invoke i32 @bar() |
| 107 | to label %finally unwind label %landingpad |
| 108 | |
| 109 | finally: |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 110 | store i32 1, ptr %step |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 111 | br label %endtryfinally |
| 112 | |
| 113 | landingpad: |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 114 | %landing_pad = landingpad { ptr, i32 } |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 115 | cleanup |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 116 | %tmp3 = extractvalue { ptr, i32 } %landing_pad, 0 |
| 117 | store i32 2, ptr %step |
| 118 | call void @_d_eh_resume_unwind(ptr %tmp3) |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 119 | unreachable |
| 120 | |
| 121 | endtryfinally: |
Nikita Popov | 2f448bf | 2022-06-22 14:33:12 +0200 | [diff] [blame] | 122 | %tmp10 = load i32, ptr %step |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 123 | ret i32 %tmp10 |
| 124 | } |
| 125 | ; WIN64-LABEL: foo4: |
| 126 | ; WIN64: .seh_proc foo4 |
| 127 | ; WIN64: .seh_handler _d_eh_personality, @unwind, @except |
Reid Kleckner | bf02399 | 2019-09-09 23:04:25 +0000 | [diff] [blame] | 128 | ; NORM: subq $40, %rsp |
| 129 | ; ATOM: leaq -40(%rsp), %rsp |
| 130 | ; WIN64: .seh_stackalloc 40 |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 131 | ; WIN64: .seh_endprologue |
Daniel Paoliello | b3458fd | 2025-01-30 13:51:30 -0800 | [diff] [blame] | 132 | ; WIN64: .seh_startepilogue |
Reid Kleckner | bf02399 | 2019-09-09 23:04:25 +0000 | [diff] [blame] | 133 | ; WIN64: addq $40, %rsp |
Daniel Paoliello | b3458fd | 2025-01-30 13:51:30 -0800 | [diff] [blame] | 134 | ; WIN64: .seh_endepilogue |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 135 | ; WIN64: ret |
| 136 | ; WIN64: .seh_handlerdata |
| 137 | ; WIN64: .seh_endproc |
| 138 | |
| 139 | |
| 140 | ; Check stack re-alignment and xmm spilling |
| 141 | define void @foo5() uwtable { |
| 142 | entry: |
| 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 Kleckner | a33474d | 2019-08-30 21:23:05 +0000 | [diff] [blame] | 150 | ; WIN64: .seh_pushreg %rbp |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 151 | ; WIN64: pushq %rdi |
Reid Kleckner | a33474d | 2019-08-30 21:23:05 +0000 | [diff] [blame] | 152 | ; WIN64: .seh_pushreg %rdi |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 153 | ; WIN64: pushq %rbx |
Reid Kleckner | a33474d | 2019-08-30 21:23:05 +0000 | [diff] [blame] | 154 | ; WIN64: .seh_pushreg %rbx |
David Majnemer | 3aa0bd8 | 2015-02-24 00:11:32 +0000 | [diff] [blame] | 155 | ; NORM: subq $96, %rsp |
| 156 | ; ATOM: leaq -96(%rsp), %rsp |
David Majnemer | 89d0564 | 2015-02-21 01:04:47 +0000 | [diff] [blame] | 157 | ; WIN64: .seh_stackalloc 96 |
| 158 | ; WIN64: leaq 96(%rsp), %rbp |
Reid Kleckner | a33474d | 2019-08-30 21:23:05 +0000 | [diff] [blame] | 159 | ; WIN64: .seh_setframe %rbp, 96 |
David Majnemer | 89d0564 | 2015-02-21 01:04:47 +0000 | [diff] [blame] | 160 | ; WIN64: movaps %xmm7, -16(%rbp) # 16-byte Spill |
Reid Kleckner | a33474d | 2019-08-30 21:23:05 +0000 | [diff] [blame] | 161 | ; WIN64: .seh_savexmm %xmm7, 80 |
David Majnemer | 89d0564 | 2015-02-21 01:04:47 +0000 | [diff] [blame] | 162 | ; WIN64: movaps %xmm6, -32(%rbp) # 16-byte Spill |
Reid Kleckner | a33474d | 2019-08-30 21:23:05 +0000 | [diff] [blame] | 163 | ; WIN64: .seh_savexmm %xmm6, 64 |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 164 | ; WIN64: .seh_endprologue |
David Majnemer | 93c22a4 | 2015-02-10 00:57:42 +0000 | [diff] [blame] | 165 | ; WIN64: andq $-64, %rsp |
David Majnemer | 89d0564 | 2015-02-21 01:04:47 +0000 | [diff] [blame] | 166 | ; WIN64: movaps -32(%rbp), %xmm6 # 16-byte Reload |
| 167 | ; WIN64: movaps -16(%rbp), %xmm7 # 16-byte Reload |
Daniel Paoliello | b3458fd | 2025-01-30 13:51:30 -0800 | [diff] [blame] | 168 | ; WIN64: .seh_startepilogue |
David Majnemer | e1bbad9 | 2015-02-25 21:13:37 +0000 | [diff] [blame] | 169 | ; WIN64: movq %rbp, %rsp |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 170 | ; WIN64: popq %rbx |
| 171 | ; WIN64: popq %rdi |
| 172 | ; WIN64: popq %rbp |
Daniel Paoliello | b3458fd | 2025-01-30 13:51:30 -0800 | [diff] [blame] | 173 | ; WIN64: .seh_endepilogue |
NAKAMURA Takumi | 1db5995 | 2014-06-25 12:41:52 +0000 | [diff] [blame] | 174 | ; WIN64: retq |
| 175 | ; WIN64: .seh_endproc |