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