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