1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-apple-darwin10               | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
3; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -mcpu=atom    | FileCheck %s --check-prefix=CHECK --check-prefix=ATOM
4; RUN: llc < %s -mtriple=i386-apple-darwin10 -mcpu=athlon    | FileCheck %s --check-prefix=ATHLON
5; RUN: llc < %s -mtriple=i386-intel-elfiamcu                 | FileCheck %s --check-prefix=MCU
6
7; PR5757
8%0 = type { i64, i32 }
9
10define i32 @test1(%0* %p, %0* %q, i1 %r) nounwind {
11; GENERIC-LABEL: test1:
12; GENERIC:       ## %bb.0:
13; GENERIC-NEXT:    testb $1, %dl
14; GENERIC-NEXT:    cmoveq %rsi, %rdi
15; GENERIC-NEXT:    movl 8(%rdi), %eax
16; GENERIC-NEXT:    retq
17;
18; ATOM-LABEL: test1:
19; ATOM:       ## %bb.0:
20; ATOM-NEXT:    testb $1, %dl
21; ATOM-NEXT:    cmoveq %rsi, %rdi
22; ATOM-NEXT:    movl 8(%rdi), %eax
23; ATOM-NEXT:    nop
24; ATOM-NEXT:    nop
25; ATOM-NEXT:    retq
26;
27; ATHLON-LABEL: test1:
28; ATHLON:       ## %bb.0:
29; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
30; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
31; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
32; ATHLON-NEXT:    cmovnel %eax, %ecx
33; ATHLON-NEXT:    movl (%ecx), %eax
34; ATHLON-NEXT:    movl 8(%eax), %eax
35; ATHLON-NEXT:    retl
36;
37; MCU-LABEL: test1:
38; MCU:       # %bb.0:
39; MCU-NEXT:    testb $1, %cl
40; MCU-NEXT:    jne .LBB0_2
41; MCU-NEXT:  # %bb.1:
42; MCU-NEXT:    movl %edx, %eax
43; MCU-NEXT:  .LBB0_2:
44; MCU-NEXT:    movl 8(%eax), %eax
45; MCU-NEXT:    retl
46  %t0 = load %0, %0* %p
47  %t1 = load %0, %0* %q
48  %t4 = select i1 %r, %0 %t0, %0 %t1
49  %t5 = extractvalue %0 %t4, 1
50  ret i32 %t5
51}
52
53; PR2139
54define i32 @test2() nounwind {
55; GENERIC-LABEL: test2:
56; GENERIC:       ## %bb.0: ## %entry
57; GENERIC-NEXT:    pushq %rax
58; GENERIC-NEXT:    callq _return_false
59; GENERIC-NEXT:    xorl %ecx, %ecx
60; GENERIC-NEXT:    testb $1, %al
61; GENERIC-NEXT:    movl $-3840, %eax ## imm = 0xF100
62; GENERIC-NEXT:    cmovnel %ecx, %eax
63; GENERIC-NEXT:    cmpl $32768, %eax ## imm = 0x8000
64; GENERIC-NEXT:    jge LBB1_1
65; GENERIC-NEXT:  ## %bb.2: ## %bb91
66; GENERIC-NEXT:    xorl %eax, %eax
67; GENERIC-NEXT:    popq %rcx
68; GENERIC-NEXT:    retq
69; GENERIC-NEXT:  LBB1_1: ## %bb90
70; GENERIC-NEXT:    ud2
71;
72; ATOM-LABEL: test2:
73; ATOM:       ## %bb.0: ## %entry
74; ATOM-NEXT:    pushq %rax
75; ATOM-NEXT:    callq _return_false
76; ATOM-NEXT:    xorl %ecx, %ecx
77; ATOM-NEXT:    movl $-3840, %edx ## imm = 0xF100
78; ATOM-NEXT:    testb $1, %al
79; ATOM-NEXT:    cmovnel %ecx, %edx
80; ATOM-NEXT:    cmpl $32768, %edx ## imm = 0x8000
81; ATOM-NEXT:    jge LBB1_1
82; ATOM-NEXT:  ## %bb.2: ## %bb91
83; ATOM-NEXT:    xorl %eax, %eax
84; ATOM-NEXT:    popq %rcx
85; ATOM-NEXT:    retq
86; ATOM-NEXT:  LBB1_1: ## %bb90
87; ATOM-NEXT:    ud2
88;
89; ATHLON-LABEL: test2:
90; ATHLON:       ## %bb.0: ## %entry
91; ATHLON-NEXT:    subl $12, %esp
92; ATHLON-NEXT:    calll _return_false
93; ATHLON-NEXT:    xorl %ecx, %ecx
94; ATHLON-NEXT:    testb $1, %al
95; ATHLON-NEXT:    movl $-3840, %eax ## imm = 0xF100
96; ATHLON-NEXT:    cmovnel %ecx, %eax
97; ATHLON-NEXT:    cmpl $32768, %eax ## imm = 0x8000
98; ATHLON-NEXT:    jge LBB1_1
99; ATHLON-NEXT:  ## %bb.2: ## %bb91
100; ATHLON-NEXT:    xorl %eax, %eax
101; ATHLON-NEXT:    addl $12, %esp
102; ATHLON-NEXT:    retl
103; ATHLON-NEXT:  LBB1_1: ## %bb90
104; ATHLON-NEXT:    ud2
105;
106; MCU-LABEL: test2:
107; MCU:       # %bb.0: # %entry
108; MCU-NEXT:    calll return_false@PLT
109; MCU-NEXT:    xorl %ecx, %ecx
110; MCU-NEXT:    testb $1, %al
111; MCU-NEXT:    jne .LBB1_2
112; MCU-NEXT:  # %bb.1: # %entry
113; MCU-NEXT:    movl $-3840, %ecx # imm = 0xF100
114; MCU-NEXT:  .LBB1_2: # %entry
115; MCU-NEXT:    cmpl $32768, %ecx # imm = 0x8000
116; MCU-NEXT:    jge .LBB1_3
117; MCU-NEXT:  # %bb.4: # %bb91
118; MCU-NEXT:    xorl %eax, %eax
119; MCU-NEXT:    retl
120; MCU-NEXT:  .LBB1_3: # %bb90
121entry:
122  %tmp73 = tail call i1 @return_false()
123  %g.0 = select i1 %tmp73, i16 0, i16 -480
124  %tmp7778 = sext i16 %g.0 to i32
125  %tmp80 = shl i32 %tmp7778, 3
126  %tmp87 = icmp sgt i32 %tmp80, 32767
127  br i1 %tmp87, label %bb90, label %bb91
128bb90:
129  unreachable
130bb91:
131  ret i32 0
132}
133
134declare i1 @return_false()
135
136;; Select between two floating point constants.
137define float @test3(i32 %x) nounwind readnone {
138; GENERIC-LABEL: test3:
139; GENERIC:       ## %bb.0: ## %entry
140; GENERIC-NEXT:    xorl %eax, %eax
141; GENERIC-NEXT:    testl %edi, %edi
142; GENERIC-NEXT:    sete %al
143; GENERIC-NEXT:    leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx
144; GENERIC-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
145; GENERIC-NEXT:    retq
146;
147; ATOM-LABEL: test3:
148; ATOM:       ## %bb.0: ## %entry
149; ATOM-NEXT:    xorl %eax, %eax
150; ATOM-NEXT:    leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx
151; ATOM-NEXT:    testl %edi, %edi
152; ATOM-NEXT:    sete %al
153; ATOM-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
154; ATOM-NEXT:    retq
155;
156; ATHLON-LABEL: test3:
157; ATHLON:       ## %bb.0: ## %entry
158; ATHLON-NEXT:    xorl %eax, %eax
159; ATHLON-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
160; ATHLON-NEXT:    sete %al
161; ATHLON-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4)
162; ATHLON-NEXT:    retl
163;
164; MCU-LABEL: test3:
165; MCU:       # %bb.0: # %entry
166; MCU-NEXT:    xorl %ecx, %ecx
167; MCU-NEXT:    testl %eax, %eax
168; MCU-NEXT:    sete %cl
169; MCU-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4)
170; MCU-NEXT:    retl
171entry:
172  %0 = icmp eq i32 %x, 0
173  %iftmp.0.0 = select i1 %0, float 4.200000e+01, float 2.300000e+01
174  ret float %iftmp.0.0
175}
176
177define signext i8 @test4(i8* nocapture %P, double %F) nounwind readonly {
178; CHECK-LABEL: test4:
179; CHECK:       ## %bb.0: ## %entry
180; CHECK-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
181; CHECK-NEXT:    xorl %eax, %eax
182; CHECK-NEXT:    ucomisd %xmm0, %xmm1
183; CHECK-NEXT:    seta %al
184; CHECK-NEXT:    movsbl (%rdi,%rax,4), %eax
185; CHECK-NEXT:    retq
186;
187; ATHLON-LABEL: test4:
188; ATHLON:       ## %bb.0: ## %entry
189; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
190; ATHLON-NEXT:    fldl {{[0-9]+}}(%esp)
191; ATHLON-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
192; ATHLON-NEXT:    xorl %ecx, %ecx
193; ATHLON-NEXT:    fucompi %st(1), %st
194; ATHLON-NEXT:    fstp %st(0)
195; ATHLON-NEXT:    seta %cl
196; ATHLON-NEXT:    movsbl (%eax,%ecx,4), %eax
197; ATHLON-NEXT:    retl
198;
199; MCU-LABEL: test4:
200; MCU:       # %bb.0: # %entry
201; MCU-NEXT:    movl %eax, %ecx
202; MCU-NEXT:    fldl {{[0-9]+}}(%esp)
203; MCU-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
204; MCU-NEXT:    fucompp
205; MCU-NEXT:    fnstsw %ax
206; MCU-NEXT:    xorl %edx, %edx
207; MCU-NEXT:    # kill: def $ah killed $ah killed $ax
208; MCU-NEXT:    sahf
209; MCU-NEXT:    seta %dl
210; MCU-NEXT:    movb (%ecx,%edx,4), %al
211; MCU-NEXT:    retl
212entry:
213  %0 = fcmp olt double %F, 4.200000e+01
214  %iftmp.0.0 = select i1 %0, i32 4, i32 0
215  %1 = getelementptr i8, i8* %P, i32 %iftmp.0.0
216  %2 = load i8, i8* %1, align 1
217  ret i8 %2
218}
219
220define void @test5(i1 %c, <2 x i16> %a, <2 x i16> %b, <2 x i16>* %p) nounwind {
221; GENERIC-LABEL: test5:
222; GENERIC:       ## %bb.0:
223; GENERIC-NEXT:    testb $1, %dil
224; GENERIC-NEXT:    jne LBB4_2
225; GENERIC-NEXT:  ## %bb.1:
226; GENERIC-NEXT:    movaps %xmm1, %xmm0
227; GENERIC-NEXT:  LBB4_2:
228; GENERIC-NEXT:    movss %xmm0, (%rsi)
229; GENERIC-NEXT:    retq
230;
231; ATOM-LABEL: test5:
232; ATOM:       ## %bb.0:
233; ATOM-NEXT:    testb $1, %dil
234; ATOM-NEXT:    jne LBB4_2
235; ATOM-NEXT:  ## %bb.1:
236; ATOM-NEXT:    movaps %xmm1, %xmm0
237; ATOM-NEXT:  LBB4_2:
238; ATOM-NEXT:    movss %xmm0, (%rsi)
239; ATOM-NEXT:    nop
240; ATOM-NEXT:    nop
241; ATOM-NEXT:    retq
242;
243; ATHLON-LABEL: test5:
244; ATHLON:       ## %bb.0:
245; ATHLON-NEXT:    pushl %esi
246; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
247; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
248; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
249; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
250; ATHLON-NEXT:    cmovnel %ecx, %edx
251; ATHLON-NEXT:    movzwl (%edx), %ecx
252; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
253; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %esi
254; ATHLON-NEXT:    cmovnel %edx, %esi
255; ATHLON-NEXT:    movzwl (%esi), %edx
256; ATHLON-NEXT:    movw %dx, 2(%eax)
257; ATHLON-NEXT:    movw %cx, (%eax)
258; ATHLON-NEXT:    popl %esi
259; ATHLON-NEXT:    retl
260;
261; MCU-LABEL: test5:
262; MCU:       # %bb.0:
263; MCU-NEXT:    pushl %esi
264; MCU-NEXT:    movl {{[0-9]+}}(%esp), %esi
265; MCU-NEXT:    testb $1, %al
266; MCU-NEXT:    jne .LBB4_2
267; MCU-NEXT:  # %bb.1:
268; MCU-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
269; MCU-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
270; MCU-NEXT:  .LBB4_2:
271; MCU-NEXT:    movw %cx, 2(%esi)
272; MCU-NEXT:    movw %dx, (%esi)
273; MCU-NEXT:    popl %esi
274; MCU-NEXT:    retl
275  %x = select i1 %c, <2 x i16> %a, <2 x i16> %b
276  store <2 x i16> %x, <2 x i16>* %p
277  ret void
278}
279
280; Verify that the fmul gets sunk into the one part of the diamond where it is needed.
281define void @test6(i32 %C, <4 x float>* %A, <4 x float>* %B) nounwind {
282; CHECK-LABEL: test6:
283; CHECK:       ## %bb.0:
284; CHECK-NEXT:    testl %edi, %edi
285; CHECK-NEXT:    je LBB5_1
286; CHECK-NEXT:  ## %bb.2:
287; CHECK-NEXT:    movaps (%rsi), %xmm0
288; CHECK-NEXT:    movaps %xmm0, (%rsi)
289; CHECK-NEXT:    retq
290; CHECK-NEXT:  LBB5_1:
291; CHECK-NEXT:    movaps (%rdx), %xmm0
292; CHECK-NEXT:    mulps %xmm0, %xmm0
293; CHECK-NEXT:    movaps %xmm0, (%rsi)
294; CHECK-NEXT:    retq
295;
296; ATHLON-LABEL: test6:
297; ATHLON:       ## %bb.0:
298; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
299; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
300; ATHLON-NEXT:    flds 12(%eax)
301; ATHLON-NEXT:    flds 8(%eax)
302; ATHLON-NEXT:    flds 4(%eax)
303; ATHLON-NEXT:    flds (%eax)
304; ATHLON-NEXT:    flds (%ecx)
305; ATHLON-NEXT:    fmul %st, %st(0)
306; ATHLON-NEXT:    cmpl $0, {{[0-9]+}}(%esp)
307; ATHLON-NEXT:    fxch %st(1)
308; ATHLON-NEXT:    fcmove %st(1), %st
309; ATHLON-NEXT:    fstp %st(1)
310; ATHLON-NEXT:    flds 4(%ecx)
311; ATHLON-NEXT:    fmul %st, %st(0)
312; ATHLON-NEXT:    fxch %st(2)
313; ATHLON-NEXT:    fcmove %st(2), %st
314; ATHLON-NEXT:    fstp %st(2)
315; ATHLON-NEXT:    flds 8(%ecx)
316; ATHLON-NEXT:    fmul %st, %st(0)
317; ATHLON-NEXT:    fxch %st(3)
318; ATHLON-NEXT:    fcmove %st(3), %st
319; ATHLON-NEXT:    fstp %st(3)
320; ATHLON-NEXT:    flds 12(%ecx)
321; ATHLON-NEXT:    fmul %st, %st(0)
322; ATHLON-NEXT:    fxch %st(4)
323; ATHLON-NEXT:    fcmove %st(4), %st
324; ATHLON-NEXT:    fstp %st(4)
325; ATHLON-NEXT:    fxch %st(3)
326; ATHLON-NEXT:    fstps 12(%eax)
327; ATHLON-NEXT:    fxch %st(1)
328; ATHLON-NEXT:    fstps 8(%eax)
329; ATHLON-NEXT:    fstps 4(%eax)
330; ATHLON-NEXT:    fstps (%eax)
331; ATHLON-NEXT:    retl
332;
333; MCU-LABEL: test6:
334; MCU:       # %bb.0:
335; MCU-NEXT:    pushl %eax
336; MCU-NEXT:    flds 12(%edx)
337; MCU-NEXT:    fstps (%esp) # 4-byte Folded Spill
338; MCU-NEXT:    flds 8(%edx)
339; MCU-NEXT:    flds 4(%edx)
340; MCU-NEXT:    flds (%ecx)
341; MCU-NEXT:    flds 4(%ecx)
342; MCU-NEXT:    flds 8(%ecx)
343; MCU-NEXT:    flds 12(%ecx)
344; MCU-NEXT:    fmul %st, %st(0)
345; MCU-NEXT:    fxch %st(1)
346; MCU-NEXT:    fmul %st, %st(0)
347; MCU-NEXT:    fxch %st(2)
348; MCU-NEXT:    fmul %st, %st(0)
349; MCU-NEXT:    fxch %st(3)
350; MCU-NEXT:    fmul %st, %st(0)
351; MCU-NEXT:    testl %eax, %eax
352; MCU-NEXT:    flds (%edx)
353; MCU-NEXT:    je .LBB5_2
354; MCU-NEXT:  # %bb.1:
355; MCU-NEXT:    fstp %st(1)
356; MCU-NEXT:    fstp %st(3)
357; MCU-NEXT:    fstp %st(1)
358; MCU-NEXT:    fstp %st(0)
359; MCU-NEXT:    flds (%esp) # 4-byte Folded Reload
360; MCU-NEXT:    fldz
361; MCU-NEXT:    fldz
362; MCU-NEXT:    fldz
363; MCU-NEXT:    fxch %st(1)
364; MCU-NEXT:    fxch %st(6)
365; MCU-NEXT:    fxch %st(1)
366; MCU-NEXT:    fxch %st(5)
367; MCU-NEXT:    fxch %st(4)
368; MCU-NEXT:    fxch %st(1)
369; MCU-NEXT:    fxch %st(3)
370; MCU-NEXT:    fxch %st(2)
371; MCU-NEXT:  .LBB5_2:
372; MCU-NEXT:    fstp %st(0)
373; MCU-NEXT:    fstp %st(5)
374; MCU-NEXT:    fstp %st(3)
375; MCU-NEXT:    fxch %st(2)
376; MCU-NEXT:    fstps 12(%edx)
377; MCU-NEXT:    fxch %st(1)
378; MCU-NEXT:    fstps 8(%edx)
379; MCU-NEXT:    fstps 4(%edx)
380; MCU-NEXT:    fstps (%edx)
381; MCU-NEXT:    popl %eax
382; MCU-NEXT:    retl
383  %tmp = load <4 x float>, <4 x float>* %A
384  %tmp3 = load <4 x float>, <4 x float>* %B
385  %tmp9 = fmul <4 x float> %tmp3, %tmp3
386  %tmp.upgrd.1 = icmp eq i32 %C, 0
387  %iftmp.38.0 = select i1 %tmp.upgrd.1, <4 x float> %tmp9, <4 x float> %tmp
388  store <4 x float> %iftmp.38.0, <4 x float>* %A
389  ret void
390}
391
392; Select with fp80's
393define x86_fp80 @test7(i32 %tmp8) nounwind {
394; GENERIC-LABEL: test7:
395; GENERIC:       ## %bb.0:
396; GENERIC-NEXT:    xorl %eax, %eax
397; GENERIC-NEXT:    testl %edi, %edi
398; GENERIC-NEXT:    setns %al
399; GENERIC-NEXT:    shlq $4, %rax
400; GENERIC-NEXT:    leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx
401; GENERIC-NEXT:    fldt (%rax,%rcx)
402; GENERIC-NEXT:    retq
403;
404; ATOM-LABEL: test7:
405; ATOM:       ## %bb.0:
406; ATOM-NEXT:    xorl %eax, %eax
407; ATOM-NEXT:    leaq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %rcx
408; ATOM-NEXT:    testl %edi, %edi
409; ATOM-NEXT:    setns %al
410; ATOM-NEXT:    shlq $4, %rax
411; ATOM-NEXT:    fldt (%rax,%rcx)
412; ATOM-NEXT:    retq
413;
414; ATHLON-LABEL: test7:
415; ATHLON:       ## %bb.0:
416; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
417; ATHLON-NEXT:    notl %eax
418; ATHLON-NEXT:    shrl $27, %eax
419; ATHLON-NEXT:    andl $-16, %eax
420; ATHLON-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}(%eax)
421; ATHLON-NEXT:    retl
422;
423; MCU-LABEL: test7:
424; MCU:       # %bb.0:
425; MCU-NEXT:    notl %eax
426; MCU-NEXT:    shrl $27, %eax
427; MCU-NEXT:    andl $-16, %eax
428; MCU-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}(%eax)
429; MCU-NEXT:    retl
430  %tmp9 = icmp sgt i32 %tmp8, -1
431  %retval = select i1 %tmp9, x86_fp80 0xK4005B400000000000000, x86_fp80 0xK40078700000000000000
432  ret x86_fp80 %retval
433}
434
435; widening select v6i32 and then a sub
436define void @test8(i1 %c, <6 x i32>* %dst.addr, <6 x i32> %src1,<6 x i32> %src2) nounwind {
437; GENERIC-LABEL: test8:
438; GENERIC:       ## %bb.0:
439; GENERIC-NEXT:    testb $1, %dil
440; GENERIC-NEXT:    jne LBB7_1
441; GENERIC-NEXT:  ## %bb.2:
442; GENERIC-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
443; GENERIC-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
444; GENERIC-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
445; GENERIC-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
446; GENERIC-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
447; GENERIC-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
448; GENERIC-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
449; GENERIC-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
450; GENERIC-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
451; GENERIC-NEXT:    jmp LBB7_3
452; GENERIC-NEXT:  LBB7_1:
453; GENERIC-NEXT:    movd %r9d, %xmm0
454; GENERIC-NEXT:    movd %r8d, %xmm1
455; GENERIC-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
456; GENERIC-NEXT:    movd %ecx, %xmm2
457; GENERIC-NEXT:    movd %edx, %xmm0
458; GENERIC-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
459; GENERIC-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
460; GENERIC-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
461; GENERIC-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
462; GENERIC-NEXT:  LBB7_3:
463; GENERIC-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
464; GENERIC-NEXT:    pcmpeqd %xmm2, %xmm2
465; GENERIC-NEXT:    paddd %xmm2, %xmm0
466; GENERIC-NEXT:    paddd %xmm2, %xmm1
467; GENERIC-NEXT:    movq %xmm1, 16(%rsi)
468; GENERIC-NEXT:    movdqa %xmm0, (%rsi)
469; GENERIC-NEXT:    retq
470;
471; ATOM-LABEL: test8:
472; ATOM:       ## %bb.0:
473; ATOM-NEXT:    testb $1, %dil
474; ATOM-NEXT:    jne LBB7_1
475; ATOM-NEXT:  ## %bb.2:
476; ATOM-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
477; ATOM-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
478; ATOM-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
479; ATOM-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
480; ATOM-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
481; ATOM-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
482; ATOM-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
483; ATOM-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
484; ATOM-NEXT:    jmp LBB7_3
485; ATOM-NEXT:  LBB7_1:
486; ATOM-NEXT:    movd %r9d, %xmm1
487; ATOM-NEXT:    movd %r8d, %xmm2
488; ATOM-NEXT:    movd %ecx, %xmm3
489; ATOM-NEXT:    movd %edx, %xmm0
490; ATOM-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
491; ATOM-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
492; ATOM-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
493; ATOM-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
494; ATOM-NEXT:  LBB7_3:
495; ATOM-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
496; ATOM-NEXT:    pcmpeqd %xmm2, %xmm2
497; ATOM-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
498; ATOM-NEXT:    paddd %xmm2, %xmm0
499; ATOM-NEXT:    paddd %xmm2, %xmm1
500; ATOM-NEXT:    movq %xmm1, 16(%rsi)
501; ATOM-NEXT:    movdqa %xmm0, (%rsi)
502; ATOM-NEXT:    retq
503;
504; ATHLON-LABEL: test8:
505; ATHLON:       ## %bb.0:
506; ATHLON-NEXT:    pushl %ebp
507; ATHLON-NEXT:    pushl %ebx
508; ATHLON-NEXT:    pushl %edi
509; ATHLON-NEXT:    pushl %esi
510; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
511; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
512; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
513; ATHLON-NEXT:    cmovnel %ecx, %eax
514; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
515; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
516; ATHLON-NEXT:    cmovnel %edx, %ecx
517; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
518; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %esi
519; ATHLON-NEXT:    cmovnel %edx, %esi
520; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
521; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edi
522; ATHLON-NEXT:    cmovnel %edx, %edi
523; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
524; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ebx
525; ATHLON-NEXT:    cmovnel %edx, %ebx
526; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
527; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ebp
528; ATHLON-NEXT:    cmovnel %edx, %ebp
529; ATHLON-NEXT:    movl (%eax), %eax
530; ATHLON-NEXT:    movl (%ecx), %ecx
531; ATHLON-NEXT:    movl (%esi), %edx
532; ATHLON-NEXT:    movl (%edi), %esi
533; ATHLON-NEXT:    movl (%ebx), %ebx
534; ATHLON-NEXT:    movl (%ebp), %edi
535; ATHLON-NEXT:    decl %eax
536; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ebp
537; ATHLON-NEXT:    movl %eax, 20(%ebp)
538; ATHLON-NEXT:    decl %ecx
539; ATHLON-NEXT:    movl %ecx, 16(%ebp)
540; ATHLON-NEXT:    decl %edx
541; ATHLON-NEXT:    movl %edx, 12(%ebp)
542; ATHLON-NEXT:    decl %esi
543; ATHLON-NEXT:    movl %esi, 8(%ebp)
544; ATHLON-NEXT:    decl %ebx
545; ATHLON-NEXT:    movl %ebx, 4(%ebp)
546; ATHLON-NEXT:    decl %edi
547; ATHLON-NEXT:    movl %edi, (%ebp)
548; ATHLON-NEXT:    popl %esi
549; ATHLON-NEXT:    popl %edi
550; ATHLON-NEXT:    popl %ebx
551; ATHLON-NEXT:    popl %ebp
552; ATHLON-NEXT:    retl
553;
554; MCU-LABEL: test8:
555; MCU:       # %bb.0:
556; MCU-NEXT:    pushl %ebp
557; MCU-NEXT:    pushl %ebx
558; MCU-NEXT:    pushl %edi
559; MCU-NEXT:    pushl %esi
560; MCU-NEXT:    testb $1, %al
561; MCU-NEXT:    jne .LBB7_1
562; MCU-NEXT:  # %bb.2:
563; MCU-NEXT:    leal {{[0-9]+}}(%esp), %edi
564; MCU-NEXT:    je .LBB7_5
565; MCU-NEXT:  .LBB7_4:
566; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ecx
567; MCU-NEXT:    je .LBB7_8
568; MCU-NEXT:  .LBB7_7:
569; MCU-NEXT:    leal {{[0-9]+}}(%esp), %esi
570; MCU-NEXT:    je .LBB7_11
571; MCU-NEXT:  .LBB7_10:
572; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebp
573; MCU-NEXT:    je .LBB7_14
574; MCU-NEXT:  .LBB7_13:
575; MCU-NEXT:    leal {{[0-9]+}}(%esp), %eax
576; MCU-NEXT:    jmp .LBB7_15
577; MCU-NEXT:  .LBB7_1:
578; MCU-NEXT:    leal {{[0-9]+}}(%esp), %edi
579; MCU-NEXT:    jne .LBB7_4
580; MCU-NEXT:  .LBB7_5:
581; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ecx
582; MCU-NEXT:    jne .LBB7_7
583; MCU-NEXT:  .LBB7_8:
584; MCU-NEXT:    leal {{[0-9]+}}(%esp), %esi
585; MCU-NEXT:    jne .LBB7_10
586; MCU-NEXT:  .LBB7_11:
587; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebp
588; MCU-NEXT:    jne .LBB7_13
589; MCU-NEXT:  .LBB7_14:
590; MCU-NEXT:    leal {{[0-9]+}}(%esp), %eax
591; MCU-NEXT:  .LBB7_15:
592; MCU-NEXT:    movl (%edi), %ebx
593; MCU-NEXT:    movl (%ecx), %edi
594; MCU-NEXT:    movl (%esi), %esi
595; MCU-NEXT:    movl (%ebp), %ecx
596; MCU-NEXT:    movl (%eax), %eax
597; MCU-NEXT:    jne .LBB7_16
598; MCU-NEXT:  # %bb.17:
599; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebp
600; MCU-NEXT:    jmp .LBB7_18
601; MCU-NEXT:  .LBB7_16:
602; MCU-NEXT:    leal {{[0-9]+}}(%esp), %ebp
603; MCU-NEXT:  .LBB7_18:
604; MCU-NEXT:    movl (%ebp), %ebp
605; MCU-NEXT:    decl %ebp
606; MCU-NEXT:    decl %eax
607; MCU-NEXT:    decl %ecx
608; MCU-NEXT:    decl %esi
609; MCU-NEXT:    decl %edi
610; MCU-NEXT:    decl %ebx
611; MCU-NEXT:    movl %ebx, 20(%edx)
612; MCU-NEXT:    movl %edi, 16(%edx)
613; MCU-NEXT:    movl %esi, 12(%edx)
614; MCU-NEXT:    movl %ecx, 8(%edx)
615; MCU-NEXT:    movl %eax, 4(%edx)
616; MCU-NEXT:    movl %ebp, (%edx)
617; MCU-NEXT:    popl %esi
618; MCU-NEXT:    popl %edi
619; MCU-NEXT:    popl %ebx
620; MCU-NEXT:    popl %ebp
621; MCU-NEXT:    retl
622  %x = select i1 %c, <6 x i32> %src1, <6 x i32> %src2
623  %val = sub <6 x i32> %x, < i32 1, i32 1, i32 1, i32 1, i32 1, i32 1 >
624  store <6 x i32> %val, <6 x i32>* %dst.addr
625  ret void
626}
627
628
629;; Test integer select between values and constants.
630
631define i64 @test9(i64 %x, i64 %y) nounwind readnone ssp noredzone {
632; GENERIC-LABEL: test9:
633; GENERIC:       ## %bb.0:
634; GENERIC-NEXT:    cmpq $1, %rdi
635; GENERIC-NEXT:    sbbq %rax, %rax
636; GENERIC-NEXT:    orq %rsi, %rax
637; GENERIC-NEXT:    retq
638;
639; ATOM-LABEL: test9:
640; ATOM:       ## %bb.0:
641; ATOM-NEXT:    cmpq $1, %rdi
642; ATOM-NEXT:    sbbq %rax, %rax
643; ATOM-NEXT:    orq %rsi, %rax
644; ATOM-NEXT:    nop
645; ATOM-NEXT:    nop
646; ATOM-NEXT:    retq
647;
648; ATHLON-LABEL: test9:
649; ATHLON:       ## %bb.0:
650; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
651; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
652; ATHLON-NEXT:    movl $-1, %eax
653; ATHLON-NEXT:    movl $-1, %edx
654; ATHLON-NEXT:    je LBB8_2
655; ATHLON-NEXT:  ## %bb.1:
656; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
657; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
658; ATHLON-NEXT:  LBB8_2:
659; ATHLON-NEXT:    retl
660;
661; MCU-LABEL: test9:
662; MCU:       # %bb.0:
663; MCU-NEXT:    orl %edx, %eax
664; MCU-NEXT:    jne .LBB8_1
665; MCU-NEXT:  # %bb.2:
666; MCU-NEXT:    movl $-1, %eax
667; MCU-NEXT:    movl $-1, %edx
668; MCU-NEXT:    retl
669; MCU-NEXT:  .LBB8_1:
670; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
671; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
672; MCU-NEXT:    retl
673  %cmp = icmp ne i64 %x, 0
674  %cond = select i1 %cmp, i64 %y, i64 -1
675  ret i64 %cond
676}
677
678;; Same as test9
679define i64 @test9a(i64 %x, i64 %y) nounwind readnone ssp noredzone {
680; GENERIC-LABEL: test9a:
681; GENERIC:       ## %bb.0:
682; GENERIC-NEXT:    cmpq $1, %rdi
683; GENERIC-NEXT:    sbbq %rax, %rax
684; GENERIC-NEXT:    orq %rsi, %rax
685; GENERIC-NEXT:    retq
686;
687; ATOM-LABEL: test9a:
688; ATOM:       ## %bb.0:
689; ATOM-NEXT:    cmpq $1, %rdi
690; ATOM-NEXT:    sbbq %rax, %rax
691; ATOM-NEXT:    orq %rsi, %rax
692; ATOM-NEXT:    nop
693; ATOM-NEXT:    nop
694; ATOM-NEXT:    retq
695;
696; ATHLON-LABEL: test9a:
697; ATHLON:       ## %bb.0:
698; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
699; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
700; ATHLON-NEXT:    movl $-1, %eax
701; ATHLON-NEXT:    movl $-1, %edx
702; ATHLON-NEXT:    je LBB9_2
703; ATHLON-NEXT:  ## %bb.1:
704; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
705; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
706; ATHLON-NEXT:  LBB9_2:
707; ATHLON-NEXT:    retl
708;
709; MCU-LABEL: test9a:
710; MCU:       # %bb.0:
711; MCU-NEXT:    orl %edx, %eax
712; MCU-NEXT:    movl $-1, %eax
713; MCU-NEXT:    movl $-1, %edx
714; MCU-NEXT:    je .LBB9_2
715; MCU-NEXT:  # %bb.1:
716; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
717; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
718; MCU-NEXT:  .LBB9_2:
719; MCU-NEXT:    retl
720  %cmp = icmp eq i64 %x, 0
721  %cond = select i1 %cmp, i64 -1, i64 %y
722  ret i64 %cond
723}
724
725define i64 @test9b(i64 %x, i64 %y) nounwind readnone ssp noredzone {
726; GENERIC-LABEL: test9b:
727; GENERIC:       ## %bb.0:
728; GENERIC-NEXT:    cmpq $1, %rdi
729; GENERIC-NEXT:    sbbq %rax, %rax
730; GENERIC-NEXT:    orq %rsi, %rax
731; GENERIC-NEXT:    retq
732;
733; ATOM-LABEL: test9b:
734; ATOM:       ## %bb.0:
735; ATOM-NEXT:    cmpq $1, %rdi
736; ATOM-NEXT:    sbbq %rax, %rax
737; ATOM-NEXT:    orq %rsi, %rax
738; ATOM-NEXT:    nop
739; ATOM-NEXT:    nop
740; ATOM-NEXT:    retq
741;
742; ATHLON-LABEL: test9b:
743; ATHLON:       ## %bb.0:
744; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
745; ATHLON-NEXT:    xorl %edx, %edx
746; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
747; ATHLON-NEXT:    sete %dl
748; ATHLON-NEXT:    negl %edx
749; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
750; ATHLON-NEXT:    orl %edx, %eax
751; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %edx
752; ATHLON-NEXT:    retl
753;
754; MCU-LABEL: test9b:
755; MCU:       # %bb.0:
756; MCU-NEXT:    movl %edx, %ecx
757; MCU-NEXT:    xorl %edx, %edx
758; MCU-NEXT:    orl %ecx, %eax
759; MCU-NEXT:    sete %dl
760; MCU-NEXT:    negl %edx
761; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
762; MCU-NEXT:    orl %edx, %eax
763; MCU-NEXT:    orl {{[0-9]+}}(%esp), %edx
764; MCU-NEXT:    retl
765  %cmp = icmp eq i64 %x, 0
766  %A = sext i1 %cmp to i64
767  %cond = or i64 %y, %A
768  ret i64 %cond
769}
770
771;; Select between -1 and 1.
772define i64 @test10(i64 %x, i64 %y) nounwind readnone ssp noredzone {
773; GENERIC-LABEL: test10:
774; GENERIC:       ## %bb.0:
775; GENERIC-NEXT:    cmpq $1, %rdi
776; GENERIC-NEXT:    sbbq %rax, %rax
777; GENERIC-NEXT:    orq $1, %rax
778; GENERIC-NEXT:    retq
779;
780; ATOM-LABEL: test10:
781; ATOM:       ## %bb.0:
782; ATOM-NEXT:    cmpq $1, %rdi
783; ATOM-NEXT:    sbbq %rax, %rax
784; ATOM-NEXT:    orq $1, %rax
785; ATOM-NEXT:    nop
786; ATOM-NEXT:    nop
787; ATOM-NEXT:    retq
788;
789; ATHLON-LABEL: test10:
790; ATHLON:       ## %bb.0:
791; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
792; ATHLON-NEXT:    xorl %edx, %edx
793; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
794; ATHLON-NEXT:    movl $-1, %ecx
795; ATHLON-NEXT:    movl $1, %eax
796; ATHLON-NEXT:    cmovel %ecx, %eax
797; ATHLON-NEXT:    cmovel %ecx, %edx
798; ATHLON-NEXT:    retl
799;
800; MCU-LABEL: test10:
801; MCU:       # %bb.0:
802; MCU-NEXT:    orl %edx, %eax
803; MCU-NEXT:    movl $-1, %eax
804; MCU-NEXT:    movl $-1, %edx
805; MCU-NEXT:    je .LBB11_2
806; MCU-NEXT:  # %bb.1:
807; MCU-NEXT:    xorl %edx, %edx
808; MCU-NEXT:    movl $1, %eax
809; MCU-NEXT:  .LBB11_2:
810; MCU-NEXT:    retl
811  %cmp = icmp eq i64 %x, 0
812  %cond = select i1 %cmp, i64 -1, i64 1
813  ret i64 %cond
814}
815
816define i64 @test11(i64 %x, i64 %y) nounwind readnone ssp noredzone {
817; GENERIC-LABEL: test11:
818; GENERIC:       ## %bb.0:
819; GENERIC-NEXT:    negq %rdi
820; GENERIC-NEXT:    sbbq %rax, %rax
821; GENERIC-NEXT:    orq %rsi, %rax
822; GENERIC-NEXT:    retq
823;
824; ATOM-LABEL: test11:
825; ATOM:       ## %bb.0:
826; ATOM-NEXT:    negq %rdi
827; ATOM-NEXT:    sbbq %rax, %rax
828; ATOM-NEXT:    orq %rsi, %rax
829; ATOM-NEXT:    nop
830; ATOM-NEXT:    nop
831; ATOM-NEXT:    retq
832;
833; ATHLON-LABEL: test11:
834; ATHLON:       ## %bb.0:
835; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
836; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
837; ATHLON-NEXT:    movl $-1, %eax
838; ATHLON-NEXT:    movl $-1, %edx
839; ATHLON-NEXT:    jne LBB12_2
840; ATHLON-NEXT:  ## %bb.1:
841; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
842; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
843; ATHLON-NEXT:  LBB12_2:
844; ATHLON-NEXT:    retl
845;
846; MCU-LABEL: test11:
847; MCU:       # %bb.0:
848; MCU-NEXT:    orl %edx, %eax
849; MCU-NEXT:    je .LBB12_1
850; MCU-NEXT:  # %bb.2:
851; MCU-NEXT:    movl $-1, %eax
852; MCU-NEXT:    movl $-1, %edx
853; MCU-NEXT:    retl
854; MCU-NEXT:  .LBB12_1:
855; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
856; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
857; MCU-NEXT:    retl
858  %cmp = icmp eq i64 %x, 0
859  %cond = select i1 %cmp, i64 %y, i64 -1
860  ret i64 %cond
861}
862
863define i64 @test11a(i64 %x, i64 %y) nounwind readnone ssp noredzone {
864; GENERIC-LABEL: test11a:
865; GENERIC:       ## %bb.0:
866; GENERIC-NEXT:    negq %rdi
867; GENERIC-NEXT:    sbbq %rax, %rax
868; GENERIC-NEXT:    orq %rsi, %rax
869; GENERIC-NEXT:    retq
870;
871; ATOM-LABEL: test11a:
872; ATOM:       ## %bb.0:
873; ATOM-NEXT:    negq %rdi
874; ATOM-NEXT:    sbbq %rax, %rax
875; ATOM-NEXT:    orq %rsi, %rax
876; ATOM-NEXT:    nop
877; ATOM-NEXT:    nop
878; ATOM-NEXT:    retq
879;
880; ATHLON-LABEL: test11a:
881; ATHLON:       ## %bb.0:
882; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
883; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
884; ATHLON-NEXT:    movl $-1, %eax
885; ATHLON-NEXT:    movl $-1, %edx
886; ATHLON-NEXT:    jne LBB13_2
887; ATHLON-NEXT:  ## %bb.1:
888; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
889; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
890; ATHLON-NEXT:  LBB13_2:
891; ATHLON-NEXT:    retl
892;
893; MCU-LABEL: test11a:
894; MCU:       # %bb.0:
895; MCU-NEXT:    orl %edx, %eax
896; MCU-NEXT:    movl $-1, %eax
897; MCU-NEXT:    movl $-1, %edx
898; MCU-NEXT:    jne .LBB13_2
899; MCU-NEXT:  # %bb.1:
900; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
901; MCU-NEXT:    movl {{[0-9]+}}(%esp), %edx
902; MCU-NEXT:  .LBB13_2:
903; MCU-NEXT:    retl
904  %cmp = icmp ne i64 %x, 0
905  %cond = select i1 %cmp, i64 -1, i64 %y
906  ret i64 %cond
907}
908
909define i32 @eqzero_const_or_all_ones(i32 %x) {
910; GENERIC-LABEL: eqzero_const_or_all_ones:
911; GENERIC:       ## %bb.0:
912; GENERIC-NEXT:    negl %edi
913; GENERIC-NEXT:    sbbl %eax, %eax
914; GENERIC-NEXT:    orl $42, %eax
915; GENERIC-NEXT:    retq
916;
917; ATOM-LABEL: eqzero_const_or_all_ones:
918; ATOM:       ## %bb.0:
919; ATOM-NEXT:    negl %edi
920; ATOM-NEXT:    sbbl %eax, %eax
921; ATOM-NEXT:    orl $42, %eax
922; ATOM-NEXT:    nop
923; ATOM-NEXT:    nop
924; ATOM-NEXT:    retq
925;
926; ATHLON-LABEL: eqzero_const_or_all_ones:
927; ATHLON:       ## %bb.0:
928; ATHLON-NEXT:    xorl %eax, %eax
929; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
930; ATHLON-NEXT:    sbbl %eax, %eax
931; ATHLON-NEXT:    orl $42, %eax
932; ATHLON-NEXT:    retl
933;
934; MCU-LABEL: eqzero_const_or_all_ones:
935; MCU:       # %bb.0:
936; MCU-NEXT:    negl %eax
937; MCU-NEXT:    sbbl %eax, %eax
938; MCU-NEXT:    orl $42, %eax
939; MCU-NEXT:    retl
940  %z = icmp eq i32 %x, 0
941  %r = select i1 %z, i32 42, i32 -1
942  ret i32 %r
943}
944
945define i32 @nezero_const_or_all_ones(i32 %x) {
946; GENERIC-LABEL: nezero_const_or_all_ones:
947; GENERIC:       ## %bb.0:
948; GENERIC-NEXT:    cmpl $1, %edi
949; GENERIC-NEXT:    sbbl %eax, %eax
950; GENERIC-NEXT:    orl $42, %eax
951; GENERIC-NEXT:    retq
952;
953; ATOM-LABEL: nezero_const_or_all_ones:
954; ATOM:       ## %bb.0:
955; ATOM-NEXT:    cmpl $1, %edi
956; ATOM-NEXT:    sbbl %eax, %eax
957; ATOM-NEXT:    orl $42, %eax
958; ATOM-NEXT:    nop
959; ATOM-NEXT:    nop
960; ATOM-NEXT:    retq
961;
962; ATHLON-LABEL: nezero_const_or_all_ones:
963; ATHLON:       ## %bb.0:
964; ATHLON-NEXT:    cmpl $1, {{[0-9]+}}(%esp)
965; ATHLON-NEXT:    sbbl %eax, %eax
966; ATHLON-NEXT:    orl $42, %eax
967; ATHLON-NEXT:    retl
968;
969; MCU-LABEL: nezero_const_or_all_ones:
970; MCU:       # %bb.0:
971; MCU-NEXT:    cmpl $1, %eax
972; MCU-NEXT:    sbbl %eax, %eax
973; MCU-NEXT:    orl $42, %eax
974; MCU-NEXT:    retl
975  %z = icmp ne i32 %x, 0
976  %r = select i1 %z, i32 42, i32 -1
977  ret i32 %r
978}
979
980define i64 @eqzero_all_ones_or_const(i64 %x) {
981; GENERIC-LABEL: eqzero_all_ones_or_const:
982; GENERIC:       ## %bb.0:
983; GENERIC-NEXT:    cmpq $1, %rdi
984; GENERIC-NEXT:    sbbq %rax, %rax
985; GENERIC-NEXT:    orq $42, %rax
986; GENERIC-NEXT:    retq
987;
988; ATOM-LABEL: eqzero_all_ones_or_const:
989; ATOM:       ## %bb.0:
990; ATOM-NEXT:    cmpq $1, %rdi
991; ATOM-NEXT:    sbbq %rax, %rax
992; ATOM-NEXT:    orq $42, %rax
993; ATOM-NEXT:    nop
994; ATOM-NEXT:    nop
995; ATOM-NEXT:    retq
996;
997; ATHLON-LABEL: eqzero_all_ones_or_const:
998; ATHLON:       ## %bb.0:
999; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1000; ATHLON-NEXT:    xorl %edx, %edx
1001; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %eax
1002; ATHLON-NEXT:    movl $-1, %ecx
1003; ATHLON-NEXT:    movl $42, %eax
1004; ATHLON-NEXT:    cmovel %ecx, %eax
1005; ATHLON-NEXT:    cmovel %ecx, %edx
1006; ATHLON-NEXT:    retl
1007;
1008; MCU-LABEL: eqzero_all_ones_or_const:
1009; MCU:       # %bb.0:
1010; MCU-NEXT:    orl %edx, %eax
1011; MCU-NEXT:    movl $-1, %eax
1012; MCU-NEXT:    movl $-1, %edx
1013; MCU-NEXT:    je .LBB16_2
1014; MCU-NEXT:  # %bb.1:
1015; MCU-NEXT:    xorl %edx, %edx
1016; MCU-NEXT:    movl $42, %eax
1017; MCU-NEXT:  .LBB16_2:
1018; MCU-NEXT:    retl
1019  %z = icmp eq i64 %x, 0
1020  %r = select i1 %z, i64 -1, i64 42
1021  ret i64 %r
1022}
1023
1024define i8 @nezero_all_ones_or_const(i8 %x) {
1025; GENERIC-LABEL: nezero_all_ones_or_const:
1026; GENERIC:       ## %bb.0:
1027; GENERIC-NEXT:    negb %dil
1028; GENERIC-NEXT:    sbbl %eax, %eax
1029; GENERIC-NEXT:    orb $42, %al
1030; GENERIC-NEXT:    ## kill: def $al killed $al killed $eax
1031; GENERIC-NEXT:    retq
1032;
1033; ATOM-LABEL: nezero_all_ones_or_const:
1034; ATOM:       ## %bb.0:
1035; ATOM-NEXT:    negb %dil
1036; ATOM-NEXT:    sbbl %eax, %eax
1037; ATOM-NEXT:    orb $42, %al
1038; ATOM-NEXT:    ## kill: def $al killed $al killed $eax
1039; ATOM-NEXT:    nop
1040; ATOM-NEXT:    nop
1041; ATOM-NEXT:    retq
1042;
1043; ATHLON-LABEL: nezero_all_ones_or_const:
1044; ATHLON:       ## %bb.0:
1045; ATHLON-NEXT:    xorl %eax, %eax
1046; ATHLON-NEXT:    cmpb {{[0-9]+}}(%esp), %al
1047; ATHLON-NEXT:    sbbl %eax, %eax
1048; ATHLON-NEXT:    orb $42, %al
1049; ATHLON-NEXT:    ## kill: def $al killed $al killed $eax
1050; ATHLON-NEXT:    retl
1051;
1052; MCU-LABEL: nezero_all_ones_or_const:
1053; MCU:       # %bb.0:
1054; MCU-NEXT:    negb %al
1055; MCU-NEXT:    sbbl %eax, %eax
1056; MCU-NEXT:    orb $42, %al
1057; MCU-NEXT:    # kill: def $al killed $al killed $eax
1058; MCU-NEXT:    retl
1059  %z = icmp ne i8 %x, 0
1060  %r = select i1 %z, i8 -1, i8 42
1061  ret i8 %r
1062}
1063
1064define i32 @PR53006(i32 %x) {
1065; GENERIC-LABEL: PR53006:
1066; GENERIC:       ## %bb.0:
1067; GENERIC-NEXT:    negl %edi
1068; GENERIC-NEXT:    sbbl %eax, %eax
1069; GENERIC-NEXT:    orl $1, %eax
1070; GENERIC-NEXT:    retq
1071;
1072; ATOM-LABEL: PR53006:
1073; ATOM:       ## %bb.0:
1074; ATOM-NEXT:    negl %edi
1075; ATOM-NEXT:    sbbl %eax, %eax
1076; ATOM-NEXT:    orl $1, %eax
1077; ATOM-NEXT:    nop
1078; ATOM-NEXT:    nop
1079; ATOM-NEXT:    retq
1080;
1081; ATHLON-LABEL: PR53006:
1082; ATHLON:       ## %bb.0:
1083; ATHLON-NEXT:    xorl %eax, %eax
1084; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
1085; ATHLON-NEXT:    sbbl %eax, %eax
1086; ATHLON-NEXT:    orl $1, %eax
1087; ATHLON-NEXT:    retl
1088;
1089; MCU-LABEL: PR53006:
1090; MCU:       # %bb.0:
1091; MCU-NEXT:    negl %eax
1092; MCU-NEXT:    sbbl %eax, %eax
1093; MCU-NEXT:    orl $1, %eax
1094; MCU-NEXT:    retl
1095  %z = icmp eq i32 %x, 0
1096  %r = select i1 %z, i32 1, i32 -1
1097  ret i32 %r
1098}
1099
1100define i32 @test13(i32 %a, i32 %b) nounwind {
1101; GENERIC-LABEL: test13:
1102; GENERIC:       ## %bb.0:
1103; GENERIC-NEXT:    cmpl %esi, %edi
1104; GENERIC-NEXT:    sbbl %eax, %eax
1105; GENERIC-NEXT:    retq
1106;
1107; ATOM-LABEL: test13:
1108; ATOM:       ## %bb.0:
1109; ATOM-NEXT:    cmpl %esi, %edi
1110; ATOM-NEXT:    sbbl %eax, %eax
1111; ATOM-NEXT:    nop
1112; ATOM-NEXT:    nop
1113; ATOM-NEXT:    nop
1114; ATOM-NEXT:    nop
1115; ATOM-NEXT:    retq
1116;
1117; ATHLON-LABEL: test13:
1118; ATHLON:       ## %bb.0:
1119; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1120; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
1121; ATHLON-NEXT:    sbbl %eax, %eax
1122; ATHLON-NEXT:    retl
1123;
1124; MCU-LABEL: test13:
1125; MCU:       # %bb.0:
1126; MCU-NEXT:    cmpl %edx, %eax
1127; MCU-NEXT:    sbbl %eax, %eax
1128; MCU-NEXT:    retl
1129  %c = icmp ult i32 %a, %b
1130  %d = sext i1 %c to i32
1131  ret i32 %d
1132}
1133
1134define i32 @test14(i32 %a, i32 %b) nounwind {
1135; GENERIC-LABEL: test14:
1136; GENERIC:       ## %bb.0:
1137; GENERIC-NEXT:    xorl %eax, %eax
1138; GENERIC-NEXT:    cmpl %esi, %edi
1139; GENERIC-NEXT:    adcl $-1, %eax
1140; GENERIC-NEXT:    retq
1141;
1142; ATOM-LABEL: test14:
1143; ATOM:       ## %bb.0:
1144; ATOM-NEXT:    xorl %eax, %eax
1145; ATOM-NEXT:    cmpl %esi, %edi
1146; ATOM-NEXT:    adcl $-1, %eax
1147; ATOM-NEXT:    nop
1148; ATOM-NEXT:    nop
1149; ATOM-NEXT:    retq
1150;
1151; ATHLON-LABEL: test14:
1152; ATHLON:       ## %bb.0:
1153; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1154; ATHLON-NEXT:    xorl %eax, %eax
1155; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %ecx
1156; ATHLON-NEXT:    adcl $-1, %eax
1157; ATHLON-NEXT:    retl
1158;
1159; MCU-LABEL: test14:
1160; MCU:       # %bb.0:
1161; MCU-NEXT:    xorl %ecx, %ecx
1162; MCU-NEXT:    cmpl %edx, %eax
1163; MCU-NEXT:    adcl $-1, %ecx
1164; MCU-NEXT:    movl %ecx, %eax
1165; MCU-NEXT:    retl
1166  %c = icmp uge i32 %a, %b
1167  %d = sext i1 %c to i32
1168  ret i32 %d
1169}
1170
1171; rdar://10961709
1172define i32 @test15(i32 %x) nounwind {
1173; GENERIC-LABEL: test15:
1174; GENERIC:       ## %bb.0: ## %entry
1175; GENERIC-NEXT:    negl %edi
1176; GENERIC-NEXT:    sbbl %eax, %eax
1177; GENERIC-NEXT:    retq
1178;
1179; ATOM-LABEL: test15:
1180; ATOM:       ## %bb.0: ## %entry
1181; ATOM-NEXT:    negl %edi
1182; ATOM-NEXT:    sbbl %eax, %eax
1183; ATOM-NEXT:    nop
1184; ATOM-NEXT:    nop
1185; ATOM-NEXT:    nop
1186; ATOM-NEXT:    nop
1187; ATOM-NEXT:    retq
1188;
1189; ATHLON-LABEL: test15:
1190; ATHLON:       ## %bb.0: ## %entry
1191; ATHLON-NEXT:    xorl %eax, %eax
1192; ATHLON-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
1193; ATHLON-NEXT:    sbbl %eax, %eax
1194; ATHLON-NEXT:    retl
1195;
1196; MCU-LABEL: test15:
1197; MCU:       # %bb.0: # %entry
1198; MCU-NEXT:    negl %eax
1199; MCU-NEXT:    sbbl %eax, %eax
1200; MCU-NEXT:    retl
1201entry:
1202  %cmp = icmp ne i32 %x, 0
1203  %sub = sext i1 %cmp to i32
1204  ret i32 %sub
1205}
1206
1207define i64 @test16(i64 %x) nounwind uwtable readnone ssp {
1208; GENERIC-LABEL: test16:
1209; GENERIC:       ## %bb.0: ## %entry
1210; GENERIC-NEXT:    negq %rdi
1211; GENERIC-NEXT:    sbbq %rax, %rax
1212; GENERIC-NEXT:    retq
1213;
1214; ATOM-LABEL: test16:
1215; ATOM:       ## %bb.0: ## %entry
1216; ATOM-NEXT:    negq %rdi
1217; ATOM-NEXT:    sbbq %rax, %rax
1218; ATOM-NEXT:    nop
1219; ATOM-NEXT:    nop
1220; ATOM-NEXT:    nop
1221; ATOM-NEXT:    nop
1222; ATOM-NEXT:    retq
1223;
1224; ATHLON-LABEL: test16:
1225; ATHLON:       ## %bb.0: ## %entry
1226; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1227; ATHLON-NEXT:    xorl %eax, %eax
1228; ATHLON-NEXT:    orl {{[0-9]+}}(%esp), %ecx
1229; ATHLON-NEXT:    setne %al
1230; ATHLON-NEXT:    negl %eax
1231; ATHLON-NEXT:    movl %eax, %edx
1232; ATHLON-NEXT:    retl
1233;
1234; MCU-LABEL: test16:
1235; MCU:       # %bb.0: # %entry
1236; MCU-NEXT:    movl %eax, %ecx
1237; MCU-NEXT:    xorl %eax, %eax
1238; MCU-NEXT:    orl %edx, %ecx
1239; MCU-NEXT:    setne %al
1240; MCU-NEXT:    negl %eax
1241; MCU-NEXT:    movl %eax, %edx
1242; MCU-NEXT:    retl
1243entry:
1244  %cmp = icmp ne i64 %x, 0
1245  %conv1 = sext i1 %cmp to i64
1246  ret i64 %conv1
1247}
1248
1249define i16 @test17(i16 %x) nounwind {
1250; GENERIC-LABEL: test17:
1251; GENERIC:       ## %bb.0: ## %entry
1252; GENERIC-NEXT:    negw %di
1253; GENERIC-NEXT:    sbbl %eax, %eax
1254; GENERIC-NEXT:    ## kill: def $ax killed $ax killed $eax
1255; GENERIC-NEXT:    retq
1256;
1257; ATOM-LABEL: test17:
1258; ATOM:       ## %bb.0: ## %entry
1259; ATOM-NEXT:    negw %di
1260; ATOM-NEXT:    sbbl %eax, %eax
1261; ATOM-NEXT:    ## kill: def $ax killed $ax killed $eax
1262; ATOM-NEXT:    nop
1263; ATOM-NEXT:    nop
1264; ATOM-NEXT:    nop
1265; ATOM-NEXT:    nop
1266; ATOM-NEXT:    retq
1267;
1268; ATHLON-LABEL: test17:
1269; ATHLON:       ## %bb.0: ## %entry
1270; ATHLON-NEXT:    xorl %eax, %eax
1271; ATHLON-NEXT:    cmpw {{[0-9]+}}(%esp), %ax
1272; ATHLON-NEXT:    sbbl %eax, %eax
1273; ATHLON-NEXT:    ## kill: def $ax killed $ax killed $eax
1274; ATHLON-NEXT:    retl
1275;
1276; MCU-LABEL: test17:
1277; MCU:       # %bb.0: # %entry
1278; MCU-NEXT:    negw %ax
1279; MCU-NEXT:    sbbl %eax, %eax
1280; MCU-NEXT:    # kill: def $ax killed $ax killed $eax
1281; MCU-NEXT:    retl
1282entry:
1283  %cmp = icmp ne i16 %x, 0
1284  %sub = sext i1 %cmp to i16
1285  ret i16 %sub
1286}
1287
1288define i8 @test18(i32 %x, i8 zeroext %a, i8 zeroext %b) nounwind {
1289; GENERIC-LABEL: test18:
1290; GENERIC:       ## %bb.0:
1291; GENERIC-NEXT:    movl %esi, %eax
1292; GENERIC-NEXT:    cmpl $15, %edi
1293; GENERIC-NEXT:    cmovgel %edx, %eax
1294; GENERIC-NEXT:    ## kill: def $al killed $al killed $eax
1295; GENERIC-NEXT:    retq
1296;
1297; ATOM-LABEL: test18:
1298; ATOM:       ## %bb.0:
1299; ATOM-NEXT:    movl %esi, %eax
1300; ATOM-NEXT:    cmpl $15, %edi
1301; ATOM-NEXT:    cmovgel %edx, %eax
1302; ATOM-NEXT:    ## kill: def $al killed $al killed $eax
1303; ATOM-NEXT:    nop
1304; ATOM-NEXT:    nop
1305; ATOM-NEXT:    retq
1306;
1307; ATHLON-LABEL: test18:
1308; ATHLON:       ## %bb.0:
1309; ATHLON-NEXT:    cmpl $15, {{[0-9]+}}(%esp)
1310; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
1311; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
1312; ATHLON-NEXT:    cmovll %eax, %ecx
1313; ATHLON-NEXT:    movb (%ecx), %al
1314; ATHLON-NEXT:    retl
1315;
1316; MCU-LABEL: test18:
1317; MCU:       # %bb.0:
1318; MCU-NEXT:    cmpl $15, %eax
1319; MCU-NEXT:    jl .LBB24_2
1320; MCU-NEXT:  # %bb.1:
1321; MCU-NEXT:    movl %ecx, %edx
1322; MCU-NEXT:  .LBB24_2:
1323; MCU-NEXT:    movl %edx, %eax
1324; MCU-NEXT:    retl
1325  %cmp = icmp slt i32 %x, 15
1326  %sel = select i1 %cmp, i8 %a, i8 %b
1327  ret i8 %sel
1328}
1329
1330define i32 @trunc_select_miscompile(i32 %a, i1 zeroext %cc) {
1331; GENERIC-LABEL: trunc_select_miscompile:
1332; GENERIC:       ## %bb.0:
1333; GENERIC-NEXT:    ## kill: def $esi killed $esi def $rsi
1334; GENERIC-NEXT:    movl %edi, %eax
1335; GENERIC-NEXT:    leal 2(%rsi), %ecx
1336; GENERIC-NEXT:    ## kill: def $cl killed $cl killed $ecx
1337; GENERIC-NEXT:    shll %cl, %eax
1338; GENERIC-NEXT:    retq
1339;
1340; ATOM-LABEL: trunc_select_miscompile:
1341; ATOM:       ## %bb.0:
1342; ATOM-NEXT:    ## kill: def $esi killed $esi def $rsi
1343; ATOM-NEXT:    leal 2(%rsi), %ecx
1344; ATOM-NEXT:    movl %edi, %eax
1345; ATOM-NEXT:    ## kill: def $cl killed $cl killed $ecx
1346; ATOM-NEXT:    shll %cl, %eax
1347; ATOM-NEXT:    nop
1348; ATOM-NEXT:    nop
1349; ATOM-NEXT:    retq
1350;
1351; ATHLON-LABEL: trunc_select_miscompile:
1352; ATHLON:       ## %bb.0:
1353; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1354; ATHLON-NEXT:    movb {{[0-9]+}}(%esp), %cl
1355; ATHLON-NEXT:    orb $2, %cl
1356; ATHLON-NEXT:    shll %cl, %eax
1357; ATHLON-NEXT:    retl
1358;
1359; MCU-LABEL: trunc_select_miscompile:
1360; MCU:       # %bb.0:
1361; MCU-NEXT:    movl %edx, %ecx
1362; MCU-NEXT:    orb $2, %cl
1363; MCU-NEXT:    # kill: def $cl killed $cl killed $ecx
1364; MCU-NEXT:    shll %cl, %eax
1365; MCU-NEXT:    retl
1366  %tmp1 = select i1 %cc, i32 3, i32 2
1367  %tmp2 = shl i32 %a, %tmp1
1368  ret i32 %tmp2
1369}
1370
1371; reproducer for pr29002
1372define void @clamp_i8(i32 %src, i8* %dst) {
1373; GENERIC-LABEL: clamp_i8:
1374; GENERIC:       ## %bb.0:
1375; GENERIC-NEXT:    cmpl $127, %edi
1376; GENERIC-NEXT:    movl $127, %eax
1377; GENERIC-NEXT:    cmovlel %edi, %eax
1378; GENERIC-NEXT:    cmpl $-128, %eax
1379; GENERIC-NEXT:    movl $128, %ecx
1380; GENERIC-NEXT:    cmovgel %eax, %ecx
1381; GENERIC-NEXT:    movb %cl, (%rsi)
1382; GENERIC-NEXT:    retq
1383;
1384; ATOM-LABEL: clamp_i8:
1385; ATOM:       ## %bb.0:
1386; ATOM-NEXT:    cmpl $127, %edi
1387; ATOM-NEXT:    movl $127, %eax
1388; ATOM-NEXT:    movl $128, %ecx
1389; ATOM-NEXT:    cmovlel %edi, %eax
1390; ATOM-NEXT:    cmpl $-128, %eax
1391; ATOM-NEXT:    cmovgel %eax, %ecx
1392; ATOM-NEXT:    movb %cl, (%rsi)
1393; ATOM-NEXT:    retq
1394;
1395; ATHLON-LABEL: clamp_i8:
1396; ATHLON:       ## %bb.0:
1397; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1398; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1399; ATHLON-NEXT:    cmpl $127, %ecx
1400; ATHLON-NEXT:    movl $127, %edx
1401; ATHLON-NEXT:    cmovlel %ecx, %edx
1402; ATHLON-NEXT:    cmpl $-128, %edx
1403; ATHLON-NEXT:    movl $128, %ecx
1404; ATHLON-NEXT:    cmovgel %edx, %ecx
1405; ATHLON-NEXT:    movb %cl, (%eax)
1406; ATHLON-NEXT:    retl
1407;
1408; MCU-LABEL: clamp_i8:
1409; MCU:       # %bb.0:
1410; MCU-NEXT:    cmpl $127, %eax
1411; MCU-NEXT:    movl $127, %ecx
1412; MCU-NEXT:    jg .LBB26_2
1413; MCU-NEXT:  # %bb.1:
1414; MCU-NEXT:    movl %eax, %ecx
1415; MCU-NEXT:  .LBB26_2:
1416; MCU-NEXT:    cmpl $-128, %ecx
1417; MCU-NEXT:    movb $-128, %al
1418; MCU-NEXT:    jl .LBB26_4
1419; MCU-NEXT:  # %bb.3:
1420; MCU-NEXT:    movl %ecx, %eax
1421; MCU-NEXT:  .LBB26_4:
1422; MCU-NEXT:    movb %al, (%edx)
1423; MCU-NEXT:    retl
1424  %cmp = icmp sgt i32 %src, 127
1425  %sel1 = select i1 %cmp, i32 127, i32 %src
1426  %cmp1 = icmp slt i32 %sel1, -128
1427  %sel2 = select i1 %cmp1, i32 -128, i32 %sel1
1428  %conv = trunc i32 %sel2 to i8
1429  store i8 %conv, i8* %dst, align 2
1430  ret void
1431}
1432
1433; reproducer for pr29002
1434define void @clamp(i32 %src, i16* %dst) {
1435; GENERIC-LABEL: clamp:
1436; GENERIC:       ## %bb.0:
1437; GENERIC-NEXT:    cmpl $32768, %edi ## imm = 0x8000
1438; GENERIC-NEXT:    movl $32767, %eax ## imm = 0x7FFF
1439; GENERIC-NEXT:    cmovll %edi, %eax
1440; GENERIC-NEXT:    cmpl $-32768, %eax ## imm = 0x8000
1441; GENERIC-NEXT:    movl $32768, %ecx ## imm = 0x8000
1442; GENERIC-NEXT:    cmovgel %eax, %ecx
1443; GENERIC-NEXT:    movw %cx, (%rsi)
1444; GENERIC-NEXT:    retq
1445;
1446; ATOM-LABEL: clamp:
1447; ATOM:       ## %bb.0:
1448; ATOM-NEXT:    cmpl $32768, %edi ## imm = 0x8000
1449; ATOM-NEXT:    movl $32767, %eax ## imm = 0x7FFF
1450; ATOM-NEXT:    movl $32768, %ecx ## imm = 0x8000
1451; ATOM-NEXT:    cmovll %edi, %eax
1452; ATOM-NEXT:    cmpl $-32768, %eax ## imm = 0x8000
1453; ATOM-NEXT:    cmovgel %eax, %ecx
1454; ATOM-NEXT:    movw %cx, (%rsi)
1455; ATOM-NEXT:    retq
1456;
1457; ATHLON-LABEL: clamp:
1458; ATHLON:       ## %bb.0:
1459; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1460; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1461; ATHLON-NEXT:    cmpl $32768, %ecx ## imm = 0x8000
1462; ATHLON-NEXT:    movl $32767, %edx ## imm = 0x7FFF
1463; ATHLON-NEXT:    cmovll %ecx, %edx
1464; ATHLON-NEXT:    cmpl $-32768, %edx ## imm = 0x8000
1465; ATHLON-NEXT:    movl $32768, %ecx ## imm = 0x8000
1466; ATHLON-NEXT:    cmovgel %edx, %ecx
1467; ATHLON-NEXT:    movw %cx, (%eax)
1468; ATHLON-NEXT:    retl
1469;
1470; MCU-LABEL: clamp:
1471; MCU:       # %bb.0:
1472; MCU-NEXT:    cmpl $32768, %eax # imm = 0x8000
1473; MCU-NEXT:    movl $32767, %ecx # imm = 0x7FFF
1474; MCU-NEXT:    jge .LBB27_2
1475; MCU-NEXT:  # %bb.1:
1476; MCU-NEXT:    movl %eax, %ecx
1477; MCU-NEXT:  .LBB27_2:
1478; MCU-NEXT:    cmpl $-32768, %ecx # imm = 0x8000
1479; MCU-NEXT:    movl $32768, %eax # imm = 0x8000
1480; MCU-NEXT:    jl .LBB27_4
1481; MCU-NEXT:  # %bb.3:
1482; MCU-NEXT:    movl %ecx, %eax
1483; MCU-NEXT:  .LBB27_4:
1484; MCU-NEXT:    movw %ax, (%edx)
1485; MCU-NEXT:    retl
1486  %cmp = icmp sgt i32 %src, 32767
1487  %sel1 = select i1 %cmp, i32 32767, i32 %src
1488  %cmp1 = icmp slt i32 %sel1, -32768
1489  %sel2 = select i1 %cmp1, i32 -32768, i32 %sel1
1490  %conv = trunc i32 %sel2 to i16
1491  store i16 %conv, i16* %dst, align 2
1492  ret void
1493}
1494
1495define i16 @select_xor_1(i16 %A, i8 %cond) {
1496; CHECK-LABEL: select_xor_1:
1497; CHECK:       ## %bb.0: ## %entry
1498; CHECK-NEXT:    movl %edi, %eax
1499; CHECK-NEXT:    xorl $43, %eax
1500; CHECK-NEXT:    testb $1, %sil
1501; CHECK-NEXT:    cmovel %edi, %eax
1502; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
1503; CHECK-NEXT:    retq
1504;
1505; ATHLON-LABEL: select_xor_1:
1506; ATHLON:       ## %bb.0: ## %entry
1507; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1508; ATHLON-NEXT:    movl %ecx, %eax
1509; ATHLON-NEXT:    xorl $43, %eax
1510; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1511; ATHLON-NEXT:    cmovel %ecx, %eax
1512; ATHLON-NEXT:    ## kill: def $ax killed $ax killed $eax
1513; ATHLON-NEXT:    retl
1514;
1515; MCU-LABEL: select_xor_1:
1516; MCU:       # %bb.0: # %entry
1517; MCU-NEXT:    andl $1, %edx
1518; MCU-NEXT:    negl %edx
1519; MCU-NEXT:    andl $43, %edx
1520; MCU-NEXT:    xorl %edx, %eax
1521; MCU-NEXT:    # kill: def $ax killed $ax killed $eax
1522; MCU-NEXT:    retl
1523entry:
1524 %and = and i8 %cond, 1
1525 %cmp10 = icmp eq i8 %and, 0
1526 %0 = xor i16 %A, 43
1527 %1 = select i1 %cmp10, i16 %A, i16 %0
1528 ret i16 %1
1529}
1530
1531; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1532; icmp eq (and %cond, 1), 0
1533define i16 @select_xor_1b(i16 %A, i8 %cond) {
1534; CHECK-LABEL: select_xor_1b:
1535; CHECK:       ## %bb.0: ## %entry
1536; CHECK-NEXT:    movl %edi, %eax
1537; CHECK-NEXT:    xorl $43, %eax
1538; CHECK-NEXT:    testb $1, %sil
1539; CHECK-NEXT:    cmovel %edi, %eax
1540; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
1541; CHECK-NEXT:    retq
1542;
1543; ATHLON-LABEL: select_xor_1b:
1544; ATHLON:       ## %bb.0: ## %entry
1545; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1546; ATHLON-NEXT:    movl %ecx, %eax
1547; ATHLON-NEXT:    xorl $43, %eax
1548; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1549; ATHLON-NEXT:    cmovel %ecx, %eax
1550; ATHLON-NEXT:    ## kill: def $ax killed $ax killed $eax
1551; ATHLON-NEXT:    retl
1552;
1553; MCU-LABEL: select_xor_1b:
1554; MCU:       # %bb.0: # %entry
1555; MCU-NEXT:    testb $1, %dl
1556; MCU-NEXT:    je .LBB29_2
1557; MCU-NEXT:  # %bb.1:
1558; MCU-NEXT:    xorl $43, %eax
1559; MCU-NEXT:  .LBB29_2: # %entry
1560; MCU-NEXT:    # kill: def $ax killed $ax killed $eax
1561; MCU-NEXT:    retl
1562entry:
1563 %and = and i8 %cond, 1
1564 %cmp10 = icmp ne i8 %and, 1
1565 %0 = xor i16 %A, 43
1566 %1 = select i1 %cmp10, i16 %A, i16 %0
1567 ret i16 %1
1568}
1569
1570define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {
1571; CHECK-LABEL: select_xor_2:
1572; CHECK:       ## %bb.0: ## %entry
1573; CHECK-NEXT:    movl %esi, %eax
1574; CHECK-NEXT:    xorl %edi, %eax
1575; CHECK-NEXT:    testb $1, %dl
1576; CHECK-NEXT:    cmovel %edi, %eax
1577; CHECK-NEXT:    retq
1578;
1579; ATHLON-LABEL: select_xor_2:
1580; ATHLON:       ## %bb.0: ## %entry
1581; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1582; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1583; ATHLON-NEXT:    xorl %ecx, %eax
1584; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1585; ATHLON-NEXT:    cmovel %ecx, %eax
1586; ATHLON-NEXT:    retl
1587;
1588; MCU-LABEL: select_xor_2:
1589; MCU:       # %bb.0: # %entry
1590; MCU-NEXT:    andl $1, %ecx
1591; MCU-NEXT:    negl %ecx
1592; MCU-NEXT:    andl %edx, %ecx
1593; MCU-NEXT:    xorl %ecx, %eax
1594; MCU-NEXT:    retl
1595entry:
1596 %and = and i8 %cond, 1
1597 %cmp10 = icmp eq i8 %and, 0
1598 %0 = xor i32 %B, %A
1599 %1 = select i1 %cmp10, i32 %A, i32 %0
1600 ret i32 %1
1601}
1602
1603; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1604; icmp eq (and %cond, 1), 0
1605define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {
1606; CHECK-LABEL: select_xor_2b:
1607; CHECK:       ## %bb.0: ## %entry
1608; CHECK-NEXT:    movl %esi, %eax
1609; CHECK-NEXT:    xorl %edi, %eax
1610; CHECK-NEXT:    testb $1, %dl
1611; CHECK-NEXT:    cmovel %edi, %eax
1612; CHECK-NEXT:    retq
1613;
1614; ATHLON-LABEL: select_xor_2b:
1615; ATHLON:       ## %bb.0: ## %entry
1616; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1617; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1618; ATHLON-NEXT:    xorl %ecx, %eax
1619; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1620; ATHLON-NEXT:    cmovel %ecx, %eax
1621; ATHLON-NEXT:    retl
1622;
1623; MCU-LABEL: select_xor_2b:
1624; MCU:       # %bb.0: # %entry
1625; MCU-NEXT:    testb $1, %cl
1626; MCU-NEXT:    je .LBB31_2
1627; MCU-NEXT:  # %bb.1:
1628; MCU-NEXT:    xorl %edx, %eax
1629; MCU-NEXT:  .LBB31_2: # %entry
1630; MCU-NEXT:    retl
1631entry:
1632 %and = and i8 %cond, 1
1633 %cmp10 = icmp ne i8 %and, 1
1634 %0 = xor i32 %B, %A
1635 %1 = select i1 %cmp10, i32 %A, i32 %0
1636 ret i32 %1
1637}
1638
1639define i32 @select_or(i32 %A, i32 %B, i8 %cond) {
1640; CHECK-LABEL: select_or:
1641; CHECK:       ## %bb.0: ## %entry
1642; CHECK-NEXT:    movl %esi, %eax
1643; CHECK-NEXT:    orl %edi, %eax
1644; CHECK-NEXT:    testb $1, %dl
1645; CHECK-NEXT:    cmovel %edi, %eax
1646; CHECK-NEXT:    retq
1647;
1648; ATHLON-LABEL: select_or:
1649; ATHLON:       ## %bb.0: ## %entry
1650; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1651; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1652; ATHLON-NEXT:    orl %ecx, %eax
1653; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1654; ATHLON-NEXT:    cmovel %ecx, %eax
1655; ATHLON-NEXT:    retl
1656;
1657; MCU-LABEL: select_or:
1658; MCU:       # %bb.0: # %entry
1659; MCU-NEXT:    andl $1, %ecx
1660; MCU-NEXT:    negl %ecx
1661; MCU-NEXT:    andl %edx, %ecx
1662; MCU-NEXT:    orl %ecx, %eax
1663; MCU-NEXT:    retl
1664entry:
1665 %and = and i8 %cond, 1
1666 %cmp10 = icmp eq i8 %and, 0
1667 %0 = or i32 %B, %A
1668 %1 = select i1 %cmp10, i32 %A, i32 %0
1669 ret i32 %1
1670}
1671
1672; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1673; icmp eq (and %cond, 1), 0
1674define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {
1675; CHECK-LABEL: select_or_b:
1676; CHECK:       ## %bb.0: ## %entry
1677; CHECK-NEXT:    movl %esi, %eax
1678; CHECK-NEXT:    orl %edi, %eax
1679; CHECK-NEXT:    testb $1, %dl
1680; CHECK-NEXT:    cmovel %edi, %eax
1681; CHECK-NEXT:    retq
1682;
1683; ATHLON-LABEL: select_or_b:
1684; ATHLON:       ## %bb.0: ## %entry
1685; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1686; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1687; ATHLON-NEXT:    orl %ecx, %eax
1688; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1689; ATHLON-NEXT:    cmovel %ecx, %eax
1690; ATHLON-NEXT:    retl
1691;
1692; MCU-LABEL: select_or_b:
1693; MCU:       # %bb.0: # %entry
1694; MCU-NEXT:    testb $1, %cl
1695; MCU-NEXT:    je .LBB33_2
1696; MCU-NEXT:  # %bb.1:
1697; MCU-NEXT:    orl %edx, %eax
1698; MCU-NEXT:  .LBB33_2: # %entry
1699; MCU-NEXT:    retl
1700entry:
1701 %and = and i8 %cond, 1
1702 %cmp10 = icmp ne i8 %and, 1
1703 %0 = or i32 %B, %A
1704 %1 = select i1 %cmp10, i32 %A, i32 %0
1705 ret i32 %1
1706}
1707
1708define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {
1709; CHECK-LABEL: select_or_1:
1710; CHECK:       ## %bb.0: ## %entry
1711; CHECK-NEXT:    movl %esi, %eax
1712; CHECK-NEXT:    orl %edi, %eax
1713; CHECK-NEXT:    testb $1, %dl
1714; CHECK-NEXT:    cmovel %edi, %eax
1715; CHECK-NEXT:    retq
1716;
1717; ATHLON-LABEL: select_or_1:
1718; ATHLON:       ## %bb.0: ## %entry
1719; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1720; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1721; ATHLON-NEXT:    orl %ecx, %eax
1722; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1723; ATHLON-NEXT:    cmovel %ecx, %eax
1724; ATHLON-NEXT:    retl
1725;
1726; MCU-LABEL: select_or_1:
1727; MCU:       # %bb.0: # %entry
1728; MCU-NEXT:    andl $1, %ecx
1729; MCU-NEXT:    negl %ecx
1730; MCU-NEXT:    andl %edx, %ecx
1731; MCU-NEXT:    orl %ecx, %eax
1732; MCU-NEXT:    retl
1733entry:
1734 %and = and i32 %cond, 1
1735 %cmp10 = icmp eq i32 %and, 0
1736 %0 = or i32 %B, %A
1737 %1 = select i1 %cmp10, i32 %A, i32 %0
1738 ret i32 %1
1739}
1740
1741; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
1742; icmp eq (and %cond, 1), 0
1743define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {
1744; CHECK-LABEL: select_or_1b:
1745; CHECK:       ## %bb.0: ## %entry
1746; CHECK-NEXT:    movl %esi, %eax
1747; CHECK-NEXT:    orl %edi, %eax
1748; CHECK-NEXT:    testb $1, %dl
1749; CHECK-NEXT:    cmovel %edi, %eax
1750; CHECK-NEXT:    retq
1751;
1752; ATHLON-LABEL: select_or_1b:
1753; ATHLON:       ## %bb.0: ## %entry
1754; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1755; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1756; ATHLON-NEXT:    orl %ecx, %eax
1757; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1758; ATHLON-NEXT:    cmovel %ecx, %eax
1759; ATHLON-NEXT:    retl
1760;
1761; MCU-LABEL: select_or_1b:
1762; MCU:       # %bb.0: # %entry
1763; MCU-NEXT:    testb $1, %cl
1764; MCU-NEXT:    je .LBB35_2
1765; MCU-NEXT:  # %bb.1:
1766; MCU-NEXT:    orl %edx, %eax
1767; MCU-NEXT:  .LBB35_2: # %entry
1768; MCU-NEXT:    retl
1769entry:
1770 %and = and i32 %cond, 1
1771 %cmp10 = icmp ne i32 %and, 1
1772 %0 = or i32 %B, %A
1773 %1 = select i1 %cmp10, i32 %A, i32 %0
1774 ret i32 %1
1775}
1776
1777define i64 @PR51612(i64 %x, i64 %y) {
1778; CHECK-LABEL: PR51612:
1779; CHECK:       ## %bb.0:
1780; CHECK-NEXT:    leal 1(%rsi), %eax
1781; CHECK-NEXT:    incq %rdi
1782; CHECK-NEXT:    cmovnel %edi, %eax
1783; CHECK-NEXT:    andl 10, %eax
1784; CHECK-NEXT:    retq
1785;
1786; ATHLON-LABEL: PR51612:
1787; ATHLON:       ## %bb.0:
1788; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %eax
1789; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1790; ATHLON-NEXT:    movl {{[0-9]+}}(%esp), %edx
1791; ATHLON-NEXT:    incl %edx
1792; ATHLON-NEXT:    addl $1, %eax
1793; ATHLON-NEXT:    adcl $0, %ecx
1794; ATHLON-NEXT:    cmovbl %edx, %eax
1795; ATHLON-NEXT:    andl 10, %eax
1796; ATHLON-NEXT:    xorl %edx, %edx
1797; ATHLON-NEXT:    retl
1798;
1799; MCU-LABEL: PR51612:
1800; MCU:       # %bb.0:
1801; MCU-NEXT:    addl $1, %eax
1802; MCU-NEXT:    adcl $0, %edx
1803; MCU-NEXT:    jae .LBB36_2
1804; MCU-NEXT:  # %bb.1:
1805; MCU-NEXT:    movl {{[0-9]+}}(%esp), %eax
1806; MCU-NEXT:    incl %eax
1807; MCU-NEXT:  .LBB36_2:
1808; MCU-NEXT:    andl 10, %eax
1809; MCU-NEXT:    xorl %edx, %edx
1810; MCU-NEXT:    retl
1811  %add = add i64 %x, 1
1812  %inc = add i64 %y, 1
1813  %tobool = icmp eq i64 %add, 0
1814  %sel = select i1 %tobool, i64 %inc, i64 %add
1815  %i = load i32, i32* inttoptr (i32 10 to i32*), align 4
1816  %conv = zext i32 %i to i64
1817  %and = and i64 %sel, %conv
1818  ret i64 %and
1819}
1820
1821; The next 2 tests are for additional bugs based on PR51612.
1822
1823declare { i8, i1 } @llvm.uadd.with.overflow.i8(i8, i8) nounwind readnone
1824declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) nounwind readnone
1825
1826define i8 @select_uaddo_common_op0(i8 %a, i8 %b, i8 %c, i1 %cond) {
1827; GENERIC-LABEL: select_uaddo_common_op0:
1828; GENERIC:       ## %bb.0:
1829; GENERIC-NEXT:    ## kill: def $esi killed $esi def $rsi
1830; GENERIC-NEXT:    ## kill: def $edi killed $edi def $rdi
1831; GENERIC-NEXT:    testb $1, %cl
1832; GENERIC-NEXT:    cmovel %edx, %esi
1833; GENERIC-NEXT:    leal (%rsi,%rdi), %eax
1834; GENERIC-NEXT:    ## kill: def $al killed $al killed $eax
1835; GENERIC-NEXT:    retq
1836;
1837; ATOM-LABEL: select_uaddo_common_op0:
1838; ATOM:       ## %bb.0:
1839; ATOM-NEXT:    ## kill: def $esi killed $esi def $rsi
1840; ATOM-NEXT:    testb $1, %cl
1841; ATOM-NEXT:    ## kill: def $edi killed $edi def $rdi
1842; ATOM-NEXT:    cmovel %edx, %esi
1843; ATOM-NEXT:    leal (%rsi,%rdi), %eax
1844; ATOM-NEXT:    ## kill: def $al killed $al killed $eax
1845; ATOM-NEXT:    nop
1846; ATOM-NEXT:    nop
1847; ATOM-NEXT:    retq
1848;
1849; ATHLON-LABEL: select_uaddo_common_op0:
1850; ATHLON:       ## %bb.0:
1851; ATHLON-NEXT:    movb {{[0-9]+}}(%esp), %al
1852; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1853; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
1854; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %edx
1855; ATHLON-NEXT:    cmovnel %ecx, %edx
1856; ATHLON-NEXT:    addb (%edx), %al
1857; ATHLON-NEXT:    retl
1858;
1859; MCU-LABEL: select_uaddo_common_op0:
1860; MCU:       # %bb.0:
1861; MCU-NEXT:    testb $1, {{[0-9]+}}(%esp)
1862; MCU-NEXT:    jne .LBB37_2
1863; MCU-NEXT:  # %bb.1:
1864; MCU-NEXT:    movl %ecx, %edx
1865; MCU-NEXT:  .LBB37_2:
1866; MCU-NEXT:    addb %dl, %al
1867; MCU-NEXT:    # kill: def $al killed $al killed $eax
1868; MCU-NEXT:    retl
1869  %ab = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %a, i8 %b)
1870  %ac = call { i8, i1 } @llvm.uadd.with.overflow.i8(i8 %a, i8 %c)
1871  %ab0 = extractvalue { i8, i1 } %ab, 0
1872  %ac0 = extractvalue { i8, i1 } %ac, 0
1873  %sel = select i1 %cond, i8 %ab0, i8 %ac0
1874  ret i8 %sel
1875}
1876
1877define i32 @select_uaddo_common_op1(i32 %a, i32 %b, i32 %c, i1 %cond) {
1878; GENERIC-LABEL: select_uaddo_common_op1:
1879; GENERIC:       ## %bb.0:
1880; GENERIC-NEXT:    ## kill: def $esi killed $esi def $rsi
1881; GENERIC-NEXT:    ## kill: def $edi killed $edi def $rdi
1882; GENERIC-NEXT:    testb $1, %cl
1883; GENERIC-NEXT:    cmovel %edx, %edi
1884; GENERIC-NEXT:    leal (%rdi,%rsi), %eax
1885; GENERIC-NEXT:    retq
1886;
1887; ATOM-LABEL: select_uaddo_common_op1:
1888; ATOM:       ## %bb.0:
1889; ATOM-NEXT:    ## kill: def $edi killed $edi def $rdi
1890; ATOM-NEXT:    testb $1, %cl
1891; ATOM-NEXT:    ## kill: def $esi killed $esi def $rsi
1892; ATOM-NEXT:    cmovel %edx, %edi
1893; ATOM-NEXT:    leal (%rdi,%rsi), %eax
1894; ATOM-NEXT:    nop
1895; ATOM-NEXT:    nop
1896; ATOM-NEXT:    retq
1897;
1898; ATHLON-LABEL: select_uaddo_common_op1:
1899; ATHLON:       ## %bb.0:
1900; ATHLON-NEXT:    testb $1, {{[0-9]+}}(%esp)
1901; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %eax
1902; ATHLON-NEXT:    leal {{[0-9]+}}(%esp), %ecx
1903; ATHLON-NEXT:    cmovnel %eax, %ecx
1904; ATHLON-NEXT:    movl (%ecx), %eax
1905; ATHLON-NEXT:    addl {{[0-9]+}}(%esp), %eax
1906; ATHLON-NEXT:    retl
1907;
1908; MCU-LABEL: select_uaddo_common_op1:
1909; MCU:       # %bb.0:
1910; MCU-NEXT:    testb $1, {{[0-9]+}}(%esp)
1911; MCU-NEXT:    jne .LBB38_2
1912; MCU-NEXT:  # %bb.1:
1913; MCU-NEXT:    movl %ecx, %eax
1914; MCU-NEXT:  .LBB38_2:
1915; MCU-NEXT:    addl %edx, %eax
1916; MCU-NEXT:    retl
1917  %ab = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 %b)
1918  %cb = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %c, i32 %b)
1919  %ab0 = extractvalue { i32, i1 } %ab, 0
1920  %cb0 = extractvalue { i32, i1 } %cb, 0
1921  %sel = select i1 %cond, i32 %ab0, i32 %cb0
1922  ret i32 %sel
1923}
1924