[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / pr32284.ll
blob99536733b4149cf5e45c423364ca71b81b599342
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -O0 -mtriple=x86_64-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefix=X86-O0
3 ; RUN: llc     -mtriple=x86_64-unknown -mcpu=skx -o - %s | FileCheck %s --check-prefix=X64
4 ; RUN: llc -O0 -mtriple=i686-unknown   -mcpu=skx -o - %s | FileCheck %s --check-prefix=686-O0
5 ; RUN: llc     -mtriple=i686-unknown   -mcpu=skx -o - %s | FileCheck %s --check-prefix=686
7 @c = external constant i8, align 1
9 define void @foo() {
10 ; X86-O0-LABEL: foo:
11 ; X86-O0:       # BB#0: # %entry
12 ; X86-O0-NEXT:    xorl %eax, %eax
13 ; X86-O0-NEXT:    movl %eax, %ecx
14 ; X86-O0-NEXT:    xorl %eax, %eax
15 ; X86-O0-NEXT:    movzbl c, %edx
16 ; X86-O0-NEXT:    subl %edx, %eax
17 ; X86-O0-NEXT:    movslq %eax, %rsi
18 ; X86-O0-NEXT:    subq %rsi, %rcx
19 ; X86-O0-NEXT:    movb %cl, %dil
20 ; X86-O0-NEXT:    cmpb $0, %dil
21 ; X86-O0-NEXT:    setne %dil
22 ; X86-O0-NEXT:    andb $1, %dil
23 ; X86-O0-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
24 ; X86-O0-NEXT:    cmpb $0, c
25 ; X86-O0-NEXT:    setne %dil
26 ; X86-O0-NEXT:    xorb $-1, %dil
27 ; X86-O0-NEXT:    xorb $-1, %dil
28 ; X86-O0-NEXT:    andb $1, %dil
29 ; X86-O0-NEXT:    movzbl %dil, %eax
30 ; X86-O0-NEXT:    movzbl c, %edx
31 ; X86-O0-NEXT:    cmpl %edx, %eax
32 ; X86-O0-NEXT:    setle %dil
33 ; X86-O0-NEXT:    andb $1, %dil
34 ; X86-O0-NEXT:    movzbl %dil, %eax
35 ; X86-O0-NEXT:    movl %eax, -{{[0-9]+}}(%rsp)
36 ; X86-O0-NEXT:    retq
38 ; X64-LABEL: foo:
39 ; X64:       # BB#0: # %entry
40 ; X64-NEXT:    movzbl {{.*}}(%rip), %eax
41 ; X64-NEXT:    testb %al, %al
42 ; X64-NEXT:    setne -{{[0-9]+}}(%rsp)
43 ; X64-NEXT:    xorl %ecx, %ecx
44 ; X64-NEXT:    testl %eax, %eax
45 ; X64-NEXT:    setne %cl
46 ; X64-NEXT:    xorl %edx, %edx
47 ; X64-NEXT:    cmpl %eax, %ecx
48 ; X64-NEXT:    setle %dl
49 ; X64-NEXT:    movl %edx, -{{[0-9]+}}(%rsp)
50 ; X64-NEXT:    retq
52 ; 686-O0-LABEL: foo:
53 ; 686-O0:       # BB#0: # %entry
54 ; 686-O0-NEXT:    subl $8, %esp
55 ; 686-O0-NEXT:    .cfi_def_cfa_offset 12
56 ; 686-O0-NEXT:    movb c, %al
57 ; 686-O0-NEXT:    cmpb $0, %al
58 ; 686-O0-NEXT:    setne %al
59 ; 686-O0-NEXT:    andb $1, %al
60 ; 686-O0-NEXT:    movb %al, {{[0-9]+}}(%esp)
61 ; 686-O0-NEXT:    cmpb $0, c
62 ; 686-O0-NEXT:    setne %al
63 ; 686-O0-NEXT:    xorb $-1, %al
64 ; 686-O0-NEXT:    xorb $-1, %al
65 ; 686-O0-NEXT:    andb $1, %al
66 ; 686-O0-NEXT:    movzbl %al, %ecx
67 ; 686-O0-NEXT:    movzbl c, %edx
68 ; 686-O0-NEXT:    cmpl %edx, %ecx
69 ; 686-O0-NEXT:    setle %al
70 ; 686-O0-NEXT:    andb $1, %al
71 ; 686-O0-NEXT:    movzbl %al, %ecx
72 ; 686-O0-NEXT:    movl %ecx, (%esp)
73 ; 686-O0-NEXT:    addl $8, %esp
74 ; 686-O0-NEXT:    retl
76 ; 686-LABEL: foo:
77 ; 686:       # BB#0: # %entry
78 ; 686-NEXT:    subl $8, %esp
79 ; 686-NEXT:    .cfi_def_cfa_offset 12
80 ; 686-NEXT:    movzbl c, %eax
81 ; 686-NEXT:    xorl %ecx, %ecx
82 ; 686-NEXT:    testl %eax, %eax
83 ; 686-NEXT:    setne %cl
84 ; 686-NEXT:    testb %al, %al
85 ; 686-NEXT:    setne {{[0-9]+}}(%esp)
86 ; 686-NEXT:    xorl %edx, %edx
87 ; 686-NEXT:    cmpl %eax, %ecx
88 ; 686-NEXT:    setle %dl
89 ; 686-NEXT:    movl %edx, {{[0-9]+}}(%esp)
90 ; 686-NEXT:    addl $8, %esp
91 ; 686-NEXT:    retl
92 entry:
93   %a = alloca i8, align 1
94   %b = alloca i32, align 4
95   %0 = load i8, i8* @c, align 1
96   %conv = zext i8 %0 to i32
97   %sub = sub nsw i32 0, %conv
98   %conv1 = sext i32 %sub to i64
99   %sub2 = sub nsw i64 0, %conv1
100   %conv3 = trunc i64 %sub2 to i8
101   %tobool = icmp ne i8 %conv3, 0
102   %frombool = zext i1 %tobool to i8
103   store i8 %frombool, i8* %a, align 1
104   %1 = load i8, i8* @c, align 1
105   %tobool4 = icmp ne i8 %1, 0
106   %lnot = xor i1 %tobool4, true
107   %lnot5 = xor i1 %lnot, true
108   %conv6 = zext i1 %lnot5 to i32
109   %2 = load i8, i8* @c, align 1
110   %conv7 = zext i8 %2 to i32
111   %cmp = icmp sle i32 %conv6, %conv7
112   %conv8 = zext i1 %cmp to i32
113   store i32 %conv8, i32* %b, align 4
114   ret void
117 @var_5 = external global i32, align 4
118 @var_57 = external global i64, align 8
119 @_ZN8struct_210member_2_0E = external global i64, align 8
121 define void @f1() {
122 ; X86-O0-LABEL: f1:
123 ; X86-O0:       # BB#0: # %entry
124 ; X86-O0-NEXT:    movabsq $8381627093, %rax # imm = 0x1F3957AD5
125 ; X86-O0-NEXT:    movslq var_5, %rcx
126 ; X86-O0-NEXT:    addq %rax, %rcx
127 ; X86-O0-NEXT:    cmpq $0, %rcx
128 ; X86-O0-NEXT:    setne %dl
129 ; X86-O0-NEXT:    andb $1, %dl
130 ; X86-O0-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
131 ; X86-O0-NEXT:    movl var_5, %esi
132 ; X86-O0-NEXT:    xorl $-1, %esi
133 ; X86-O0-NEXT:    cmpl $0, %esi
134 ; X86-O0-NEXT:    setne %dl
135 ; X86-O0-NEXT:    xorb $-1, %dl
136 ; X86-O0-NEXT:    andb $1, %dl
137 ; X86-O0-NEXT:    movzbl %dl, %esi
138 ; X86-O0-NEXT:    movl %esi, %eax
139 ; X86-O0-NEXT:    movslq var_5, %rcx
140 ; X86-O0-NEXT:    addq $7093, %rcx # imm = 0x1BB5
141 ; X86-O0-NEXT:    cmpq %rcx, %rax
142 ; X86-O0-NEXT:    setg %dl
143 ; X86-O0-NEXT:    andb $1, %dl
144 ; X86-O0-NEXT:    movzbl %dl, %esi
145 ; X86-O0-NEXT:    movl %esi, %eax
146 ; X86-O0-NEXT:    movq %rax, var_57
147 ; X86-O0-NEXT:    movl var_5, %esi
148 ; X86-O0-NEXT:    xorl $-1, %esi
149 ; X86-O0-NEXT:    cmpl $0, %esi
150 ; X86-O0-NEXT:    setne %dl
151 ; X86-O0-NEXT:    xorb $-1, %dl
152 ; X86-O0-NEXT:    andb $1, %dl
153 ; X86-O0-NEXT:    movzbl %dl, %esi
154 ; X86-O0-NEXT:    movl %esi, %eax
155 ; X86-O0-NEXT:    movq %rax, _ZN8struct_210member_2_0E
156 ; X86-O0-NEXT:    retq
158 ; X64-LABEL: f1:
159 ; X64:       # BB#0: # %entry
160 ; X64-NEXT:    movslq {{.*}}(%rip), %rax
161 ; X64-NEXT:    xorl %ecx, %ecx
162 ; X64-NEXT:    cmpq $-1, %rax
163 ; X64-NEXT:    sete %cl
164 ; X64-NEXT:    movabsq $-8381627093, %rdx # imm = 0xFFFFFFFE0C6A852B
165 ; X64-NEXT:    cmpq %rdx, %rax
166 ; X64-NEXT:    setne -{{[0-9]+}}(%rsp)
167 ; X64-NEXT:    xorl %edx, %edx
168 ; X64-NEXT:    cmpl $-1, %eax
169 ; X64-NEXT:    sete %dl
170 ; X64-NEXT:    addq $7093, %rax # imm = 0x1BB5
171 ; X64-NEXT:    xorl %esi, %esi
172 ; X64-NEXT:    cmpq %rax, %rdx
173 ; X64-NEXT:    setg %sil
174 ; X64-NEXT:    movq %rsi, {{.*}}(%rip)
175 ; X64-NEXT:    movq %rcx, {{.*}}(%rip)
176 ; X64-NEXT:    retq
178 ; 686-O0-LABEL: f1:
179 ; 686-O0:       # BB#0: # %entry
180 ; 686-O0-NEXT:    pushl %ebp
181 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
182 ; 686-O0-NEXT:    pushl %ebx
183 ; 686-O0-NEXT:    .cfi_def_cfa_offset 12
184 ; 686-O0-NEXT:    pushl %edi
185 ; 686-O0-NEXT:    .cfi_def_cfa_offset 16
186 ; 686-O0-NEXT:    pushl %esi
187 ; 686-O0-NEXT:    .cfi_def_cfa_offset 20
188 ; 686-O0-NEXT:    subl $24, %esp
189 ; 686-O0-NEXT:    .cfi_def_cfa_offset 44
190 ; 686-O0-NEXT:    .cfi_offset %esi, -20
191 ; 686-O0-NEXT:    .cfi_offset %edi, -16
192 ; 686-O0-NEXT:    .cfi_offset %ebx, -12
193 ; 686-O0-NEXT:    .cfi_offset %ebp, -8
194 ; 686-O0-NEXT:    movl var_5, %eax
195 ; 686-O0-NEXT:    movl %eax, %ecx
196 ; 686-O0-NEXT:    sarl $31, %ecx
197 ; 686-O0-NEXT:    xorl $208307499, %eax # imm = 0xC6A852B
198 ; 686-O0-NEXT:    xorl $-2, %ecx
199 ; 686-O0-NEXT:    orl %ecx, %eax
200 ; 686-O0-NEXT:    setne {{[0-9]+}}(%esp)
201 ; 686-O0-NEXT:    movl var_5, %ecx
202 ; 686-O0-NEXT:    movl %ecx, %edx
203 ; 686-O0-NEXT:    subl $-1, %edx
204 ; 686-O0-NEXT:    sete %bl
205 ; 686-O0-NEXT:    movzbl %bl, %esi
206 ; 686-O0-NEXT:    movl %ecx, %edi
207 ; 686-O0-NEXT:    sarl $31, %edi
208 ; 686-O0-NEXT:    xorl %ebp, %ebp
209 ; 686-O0-NEXT:    addl $7093, %ecx # imm = 0x1BB5
210 ; 686-O0-NEXT:    adcxl %ebp, %edi
211 ; 686-O0-NEXT:    subl %esi, %ecx
212 ; 686-O0-NEXT:    sbbl $0, %edi
213 ; 686-O0-NEXT:    setl %bl
214 ; 686-O0-NEXT:    movzbl %bl, %esi
215 ; 686-O0-NEXT:    movl %esi, var_57
216 ; 686-O0-NEXT:    movl $0, var_57+4
217 ; 686-O0-NEXT:    movl var_5, %esi
218 ; 686-O0-NEXT:    subl $-1, %esi
219 ; 686-O0-NEXT:    sete %bl
220 ; 686-O0-NEXT:    movzbl %bl, %ebp
221 ; 686-O0-NEXT:    movl %ebp, _ZN8struct_210member_2_0E
222 ; 686-O0-NEXT:    movl $0, _ZN8struct_210member_2_0E+4
223 ; 686-O0-NEXT:    movl %eax, {{[0-9]+}}(%esp) # 4-byte Spill
224 ; 686-O0-NEXT:    movl %ecx, {{[0-9]+}}(%esp) # 4-byte Spill
225 ; 686-O0-NEXT:    movl %edx, {{[0-9]+}}(%esp) # 4-byte Spill
226 ; 686-O0-NEXT:    movl %edi, {{[0-9]+}}(%esp) # 4-byte Spill
227 ; 686-O0-NEXT:    movl %esi, (%esp) # 4-byte Spill
228 ; 686-O0-NEXT:    addl $24, %esp
229 ; 686-O0-NEXT:    popl %esi
230 ; 686-O0-NEXT:    popl %edi
231 ; 686-O0-NEXT:    popl %ebx
232 ; 686-O0-NEXT:    popl %ebp
233 ; 686-O0-NEXT:    retl
235 ; 686-LABEL: f1:
236 ; 686:       # BB#0: # %entry
237 ; 686-NEXT:    pushl %edi
238 ; 686-NEXT:    .cfi_def_cfa_offset 8
239 ; 686-NEXT:    pushl %esi
240 ; 686-NEXT:    .cfi_def_cfa_offset 12
241 ; 686-NEXT:    subl $1, %esp
242 ; 686-NEXT:    .cfi_def_cfa_offset 13
243 ; 686-NEXT:    .cfi_offset %esi, -12
244 ; 686-NEXT:    .cfi_offset %edi, -8
245 ; 686-NEXT:    movl var_5, %edx
246 ; 686-NEXT:    movl %edx, %esi
247 ; 686-NEXT:    sarl $31, %esi
248 ; 686-NEXT:    movl %edx, %ecx
249 ; 686-NEXT:    andl %esi, %ecx
250 ; 686-NEXT:    xorl %eax, %eax
251 ; 686-NEXT:    cmpl $-1, %ecx
252 ; 686-NEXT:    sete %al
253 ; 686-NEXT:    movl %edx, %ecx
254 ; 686-NEXT:    xorl $208307499, %ecx # imm = 0xC6A852B
255 ; 686-NEXT:    movl %esi, %edi
256 ; 686-NEXT:    xorl $-2, %edi
257 ; 686-NEXT:    orl %ecx, %edi
258 ; 686-NEXT:    setne (%esp)
259 ; 686-NEXT:    xorl %ecx, %ecx
260 ; 686-NEXT:    cmpl $-1, %edx
261 ; 686-NEXT:    sete %cl
262 ; 686-NEXT:    xorl %edi, %edi
263 ; 686-NEXT:    addl $7093, %edx # imm = 0x1BB5
264 ; 686-NEXT:    adcxl %edi, %esi
265 ; 686-NEXT:    cmpl %ecx, %edx
266 ; 686-NEXT:    sbbl $0, %esi
267 ; 686-NEXT:    setl %cl
268 ; 686-NEXT:    movzbl %cl, %ecx
269 ; 686-NEXT:    movl %ecx, var_57
270 ; 686-NEXT:    movl $0, var_57+4
271 ; 686-NEXT:    movl %eax, _ZN8struct_210member_2_0E
272 ; 686-NEXT:    movl $0, _ZN8struct_210member_2_0E+4
273 ; 686-NEXT:    addl $1, %esp
274 ; 686-NEXT:    popl %esi
275 ; 686-NEXT:    popl %edi
276 ; 686-NEXT:    retl
277 entry:
278   %a = alloca i8, align 1
279   %0 = load i32, i32* @var_5, align 4
280   %conv = sext i32 %0 to i64
281   %add = add nsw i64 %conv, 8381627093
282   %tobool = icmp ne i64 %add, 0
283   %frombool = zext i1 %tobool to i8
284   store i8 %frombool, i8* %a, align 1
285   %1 = load i32, i32* @var_5, align 4
286   %neg = xor i32 %1, -1
287   %tobool1 = icmp ne i32 %neg, 0
288   %lnot = xor i1 %tobool1, true
289   %conv2 = zext i1 %lnot to i64
290   %2 = load i32, i32* @var_5, align 4
291   %conv3 = sext i32 %2 to i64
292   %add4 = add nsw i64 %conv3, 7093
293   %cmp = icmp sgt i64 %conv2, %add4
294   %conv5 = zext i1 %cmp to i64
295   store i64 %conv5, i64* @var_57, align 8
296   %3 = load i32, i32* @var_5, align 4
297   %neg6 = xor i32 %3, -1
298   %tobool7 = icmp ne i32 %neg6, 0
299   %lnot8 = xor i1 %tobool7, true
300   %conv9 = zext i1 %lnot8 to i64
301   store i64 %conv9, i64* @_ZN8struct_210member_2_0E, align 8
302   ret void
306 @var_7 = external global i8, align 1
308 define void @f2() {
309 ; X86-O0-LABEL: f2:
310 ; X86-O0:       # BB#0: # %entry
311 ; X86-O0-NEXT:    # implicit-def: %rax
312 ; X86-O0-NEXT:    movzbl var_7, %ecx
313 ; X86-O0-NEXT:    cmpb $0, var_7
314 ; X86-O0-NEXT:    setne %dl
315 ; X86-O0-NEXT:    xorb $-1, %dl
316 ; X86-O0-NEXT:    andb $1, %dl
317 ; X86-O0-NEXT:    movzbl %dl, %esi
318 ; X86-O0-NEXT:    xorl %esi, %ecx
319 ; X86-O0-NEXT:    movw %cx, %di
320 ; X86-O0-NEXT:    movw %di, -{{[0-9]+}}(%rsp)
321 ; X86-O0-NEXT:    movzbl var_7, %ecx
322 ; X86-O0-NEXT:    movw %cx, %di
323 ; X86-O0-NEXT:    cmpw $0, %di
324 ; X86-O0-NEXT:    setne %dl
325 ; X86-O0-NEXT:    xorb $-1, %dl
326 ; X86-O0-NEXT:    andb $1, %dl
327 ; X86-O0-NEXT:    movzbl %dl, %ecx
328 ; X86-O0-NEXT:    movzbl var_7, %esi
329 ; X86-O0-NEXT:    cmpl %esi, %ecx
330 ; X86-O0-NEXT:    sete %dl
331 ; X86-O0-NEXT:    andb $1, %dl
332 ; X86-O0-NEXT:    movzbl %dl, %ecx
333 ; X86-O0-NEXT:    movw %cx, %di
334 ; X86-O0-NEXT:    movw %di, (%rax)
335 ; X86-O0-NEXT:    retq
337 ; X64-LABEL: f2:
338 ; X64:       # BB#0: # %entry
339 ; X64-NEXT:    movzbl {{.*}}(%rip), %eax
340 ; X64-NEXT:    xorl %ecx, %ecx
341 ; X64-NEXT:    testl %eax, %eax
342 ; X64-NEXT:    sete %cl
343 ; X64-NEXT:    xorl %eax, %ecx
344 ; X64-NEXT:    movw %cx, -{{[0-9]+}}(%rsp)
345 ; X64-NEXT:    xorl %ecx, %ecx
346 ; X64-NEXT:    testb %al, %al
347 ; X64-NEXT:    sete %cl
348 ; X64-NEXT:    xorl %edx, %edx
349 ; X64-NEXT:    cmpl %eax, %ecx
350 ; X64-NEXT:    sete %dl
351 ; X64-NEXT:    movw %dx, (%rax)
352 ; X64-NEXT:    retq
354 ; 686-O0-LABEL: f2:
355 ; 686-O0:       # BB#0: # %entry
356 ; 686-O0-NEXT:    pushl %edi
357 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
358 ; 686-O0-NEXT:    pushl %esi
359 ; 686-O0-NEXT:    .cfi_def_cfa_offset 12
360 ; 686-O0-NEXT:    subl $2, %esp
361 ; 686-O0-NEXT:    .cfi_def_cfa_offset 14
362 ; 686-O0-NEXT:    .cfi_offset %esi, -12
363 ; 686-O0-NEXT:    .cfi_offset %edi, -8
364 ; 686-O0-NEXT:    # implicit-def: %eax
365 ; 686-O0-NEXT:    movzbl var_7, %ecx
366 ; 686-O0-NEXT:    cmpb $0, var_7
367 ; 686-O0-NEXT:    setne %dl
368 ; 686-O0-NEXT:    xorb $-1, %dl
369 ; 686-O0-NEXT:    andb $1, %dl
370 ; 686-O0-NEXT:    movzbl %dl, %esi
371 ; 686-O0-NEXT:    xorl %esi, %ecx
372 ; 686-O0-NEXT:    movw %cx, %di
373 ; 686-O0-NEXT:    movw %di, (%esp)
374 ; 686-O0-NEXT:    movzbl var_7, %ecx
375 ; 686-O0-NEXT:    movw %cx, %di
376 ; 686-O0-NEXT:    cmpw $0, %di
377 ; 686-O0-NEXT:    setne %dl
378 ; 686-O0-NEXT:    xorb $-1, %dl
379 ; 686-O0-NEXT:    andb $1, %dl
380 ; 686-O0-NEXT:    movzbl %dl, %ecx
381 ; 686-O0-NEXT:    movzbl var_7, %esi
382 ; 686-O0-NEXT:    cmpl %esi, %ecx
383 ; 686-O0-NEXT:    sete %dl
384 ; 686-O0-NEXT:    andb $1, %dl
385 ; 686-O0-NEXT:    movzbl %dl, %ecx
386 ; 686-O0-NEXT:    movw %cx, %di
387 ; 686-O0-NEXT:    movw %di, (%eax)
388 ; 686-O0-NEXT:    addl $2, %esp
389 ; 686-O0-NEXT:    popl %esi
390 ; 686-O0-NEXT:    popl %edi
391 ; 686-O0-NEXT:    retl
393 ; 686-LABEL: f2:
394 ; 686:       # BB#0: # %entry
395 ; 686-NEXT:    subl $2, %esp
396 ; 686-NEXT:    .cfi_def_cfa_offset 6
397 ; 686-NEXT:    movzbl var_7, %eax
398 ; 686-NEXT:    xorl %ecx, %ecx
399 ; 686-NEXT:    testl %eax, %eax
400 ; 686-NEXT:    sete %cl
401 ; 686-NEXT:    xorl %eax, %ecx
402 ; 686-NEXT:    movw %cx, (%esp)
403 ; 686-NEXT:    xorl %ecx, %ecx
404 ; 686-NEXT:    testb %al, %al
405 ; 686-NEXT:    sete %cl
406 ; 686-NEXT:    xorl %edx, %edx
407 ; 686-NEXT:    cmpl %eax, %ecx
408 ; 686-NEXT:    sete %dl
409 ; 686-NEXT:    movw %dx, (%eax)
410 ; 686-NEXT:    addl $2, %esp
411 ; 686-NEXT:    retl
412 entry:
413   %a = alloca i16, align 2
414   %0 = load i8, i8* @var_7, align 1
415   %conv = zext i8 %0 to i32
416   %1 = load i8, i8* @var_7, align 1
417   %tobool = icmp ne i8 %1, 0
418   %lnot = xor i1 %tobool, true
419   %conv1 = zext i1 %lnot to i32
420   %xor = xor i32 %conv, %conv1
421   %conv2 = trunc i32 %xor to i16
422   store i16 %conv2, i16* %a, align 2
423   %2 = load i8, i8* @var_7, align 1
424   %conv3 = zext i8 %2 to i16
425   %tobool4 = icmp ne i16 %conv3, 0
426   %lnot5 = xor i1 %tobool4, true
427   %conv6 = zext i1 %lnot5 to i32
428   %3 = load i8, i8* @var_7, align 1
429   %conv7 = zext i8 %3 to i32
430   %cmp = icmp eq i32 %conv6, %conv7
431   %conv8 = zext i1 %cmp to i32
432   %conv9 = trunc i32 %conv8 to i16
433   store i16 %conv9, i16* undef, align 2
434   ret void
438 @var_13 = external global i32, align 4
439 @var_16 = external global i32, align 4
440 @var_46 = external global i32, align 4
442 define void @f3() #0 {
443 ; X86-O0-LABEL: f3:
444 ; X86-O0:       # BB#0: # %entry
445 ; X86-O0-NEXT:    movl var_13, %eax
446 ; X86-O0-NEXT:    xorl $-1, %eax
447 ; X86-O0-NEXT:    movl %eax, %eax
448 ; X86-O0-NEXT:    movl %eax, %ecx
449 ; X86-O0-NEXT:    cmpl $0, var_13
450 ; X86-O0-NEXT:    setne %dl
451 ; X86-O0-NEXT:    xorb $-1, %dl
452 ; X86-O0-NEXT:    andb $1, %dl
453 ; X86-O0-NEXT:    movzbl %dl, %eax
454 ; X86-O0-NEXT:    movl %eax, %esi
455 ; X86-O0-NEXT:    movl var_13, %eax
456 ; X86-O0-NEXT:    xorl $-1, %eax
457 ; X86-O0-NEXT:    xorl var_16, %eax
458 ; X86-O0-NEXT:    movl %eax, %eax
459 ; X86-O0-NEXT:    movl %eax, %edi
460 ; X86-O0-NEXT:    andq %rdi, %rsi
461 ; X86-O0-NEXT:    orq %rsi, %rcx
462 ; X86-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
463 ; X86-O0-NEXT:    movl var_13, %eax
464 ; X86-O0-NEXT:    xorl $-1, %eax
465 ; X86-O0-NEXT:    movl %eax, %eax
466 ; X86-O0-NEXT:    movl %eax, %ecx
467 ; X86-O0-NEXT:    cmpl $0, var_13
468 ; X86-O0-NEXT:    setne %dl
469 ; X86-O0-NEXT:    xorb $-1, %dl
470 ; X86-O0-NEXT:    andb $1, %dl
471 ; X86-O0-NEXT:    movzbl %dl, %eax
472 ; X86-O0-NEXT:    movl %eax, %esi
473 ; X86-O0-NEXT:    andq $0, %rsi
474 ; X86-O0-NEXT:    orq %rsi, %rcx
475 ; X86-O0-NEXT:    movl %ecx, %eax
476 ; X86-O0-NEXT:    movl %eax, var_46
477 ; X86-O0-NEXT:    retq
479 ; X64-LABEL: f3:
480 ; X64:       # BB#0: # %entry
481 ; X64-NEXT:    movl {{.*}}(%rip), %eax
482 ; X64-NEXT:    movl $4294967295, %ecx # imm = 0xFFFFFFFF
483 ; X64-NEXT:    xorq %rax, %rcx
484 ; X64-NEXT:    xorl %edx, %edx
485 ; X64-NEXT:    testq %rax, %rax
486 ; X64-NEXT:    sete %dl
487 ; X64-NEXT:    movl {{.*}}(%rip), %eax
488 ; X64-NEXT:    xorl %ecx, %eax
489 ; X64-NEXT:    andq %rdx, %rax
490 ; X64-NEXT:    orq %rcx, %rax
491 ; X64-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)
492 ; X64-NEXT:    movl %ecx, {{.*}}(%rip)
493 ; X64-NEXT:    retq
495 ; 686-O0-LABEL: f3:
496 ; 686-O0:       # BB#0: # %entry
497 ; 686-O0-NEXT:    pushl %ebp
498 ; 686-O0-NEXT:    .cfi_def_cfa_offset 8
499 ; 686-O0-NEXT:    .cfi_offset %ebp, -8
500 ; 686-O0-NEXT:    movl %esp, %ebp
501 ; 686-O0-NEXT:    .cfi_def_cfa_register %ebp
502 ; 686-O0-NEXT:    pushl %edi
503 ; 686-O0-NEXT:    pushl %esi
504 ; 686-O0-NEXT:    andl $-8, %esp
505 ; 686-O0-NEXT:    subl $8, %esp
506 ; 686-O0-NEXT:    .cfi_offset %esi, -16
507 ; 686-O0-NEXT:    .cfi_offset %edi, -12
508 ; 686-O0-NEXT:    movl var_13, %eax
509 ; 686-O0-NEXT:    movl %eax, %ecx
510 ; 686-O0-NEXT:    notl %ecx
511 ; 686-O0-NEXT:    testl %eax, %eax
512 ; 686-O0-NEXT:    sete %dl
513 ; 686-O0-NEXT:    movzbl %dl, %eax
514 ; 686-O0-NEXT:    movl var_16, %esi
515 ; 686-O0-NEXT:    movl %ecx, %edi
516 ; 686-O0-NEXT:    xorl %esi, %edi
517 ; 686-O0-NEXT:    andl %edi, %eax
518 ; 686-O0-NEXT:    movb %al, %dl
519 ; 686-O0-NEXT:    movzbl %dl, %eax
520 ; 686-O0-NEXT:    orl %eax, %ecx
521 ; 686-O0-NEXT:    movl %ecx, (%esp)
522 ; 686-O0-NEXT:    movl $0, {{[0-9]+}}(%esp)
523 ; 686-O0-NEXT:    movl var_13, %eax
524 ; 686-O0-NEXT:    notl %eax
525 ; 686-O0-NEXT:    movl %eax, var_46
526 ; 686-O0-NEXT:    leal -8(%ebp), %esp
527 ; 686-O0-NEXT:    popl %esi
528 ; 686-O0-NEXT:    popl %edi
529 ; 686-O0-NEXT:    popl %ebp
530 ; 686-O0-NEXT:    retl
532 ; 686-LABEL: f3:
533 ; 686:       # BB#0: # %entry
534 ; 686-NEXT:    pushl %ebp
535 ; 686-NEXT:    .cfi_def_cfa_offset 8
536 ; 686-NEXT:    .cfi_offset %ebp, -8
537 ; 686-NEXT:    movl %esp, %ebp
538 ; 686-NEXT:    .cfi_def_cfa_register %ebp
539 ; 686-NEXT:    andl $-8, %esp
540 ; 686-NEXT:    subl $8, %esp
541 ; 686-NEXT:    movl var_13, %ecx
542 ; 686-NEXT:    xorl %eax, %eax
543 ; 686-NEXT:    testl %ecx, %ecx
544 ; 686-NEXT:    notl %ecx
545 ; 686-NEXT:    sete %al
546 ; 686-NEXT:    movl var_16, %edx
547 ; 686-NEXT:    xorl %ecx, %edx
548 ; 686-NEXT:    andl %eax, %edx
549 ; 686-NEXT:    movzbl %dl, %eax
550 ; 686-NEXT:    orl %ecx, %eax
551 ; 686-NEXT:    movl %eax, (%esp)
552 ; 686-NEXT:    movl $0, {{[0-9]+}}(%esp)
553 ; 686-NEXT:    movl %ecx, var_46
554 ; 686-NEXT:    movl %ebp, %esp
555 ; 686-NEXT:    popl %ebp
556 ; 686-NEXT:    retl
557 entry:
558   %a = alloca i64, align 8
559   %0 = load i32, i32* @var_13, align 4
560   %neg = xor i32 %0, -1
561   %conv = zext i32 %neg to i64
562   %1 = load i32, i32* @var_13, align 4
563   %tobool = icmp ne i32 %1, 0
564   %lnot = xor i1 %tobool, true
565   %conv1 = zext i1 %lnot to i64
566   %2 = load i32, i32* @var_13, align 4
567   %neg2 = xor i32 %2, -1
568   %3 = load i32, i32* @var_16, align 4
569   %xor = xor i32 %neg2, %3
570   %conv3 = zext i32 %xor to i64
571   %and = and i64 %conv1, %conv3
572   %or = or i64 %conv, %and
573   store i64 %or, i64* %a, align 8
574   %4 = load i32, i32* @var_13, align 4
575   %neg4 = xor i32 %4, -1
576   %conv5 = zext i32 %neg4 to i64
577   %5 = load i32, i32* @var_13, align 4
578   %tobool6 = icmp ne i32 %5, 0
579   %lnot7 = xor i1 %tobool6, true
580   %conv8 = zext i1 %lnot7 to i64
581   %and9 = and i64 %conv8, 0
582   %or10 = or i64 %conv5, %and9
583   %conv11 = trunc i64 %or10 to i32
584   store i32 %conv11, i32* @var_46, align 4
585   ret void