xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/cmovcmov.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -mtriple=x86_64-unknown-linux | FileCheck %s --check-prefix=CHECK --check-prefix=CMOV
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -mtriple=i686-unknown-linux | FileCheck %s --check-prefix=CHECK --check-prefix=NOCMOV
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Test 2xCMOV patterns exposed after legalization.
7*9880d681SAndroid Build Coastguard Worker; One way to do that is with (select (fcmp une/oeq)), which gets
8*9880d681SAndroid Build Coastguard Worker; legalized to setp/setne.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_fcmp_oeq_i32:
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: ucomiss  %xmm1, %xmm0
13*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: cmovnel  %esi, %edi
14*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: cmovpl  %esi, %edi
15*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: movl  %edi, %eax
16*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: retq
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  flds  8(%esp)
19*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  flds  4(%esp)
20*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  fucompp
21*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  fnstsw  %ax
22*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  sahf
23*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  leal  16(%esp), %eax
24*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  jne  [[TBB:.LBB[0-9_]+]]
25*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  jp  [[TBB]]
26*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  leal  12(%esp), %eax
27*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:[[TBB]]:
28*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  movl  (%eax), %eax
29*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:  retl
30*9880d681SAndroid Build Coastguard Workerdefine i32 @test_select_fcmp_oeq_i32(float %a, float %b, i32 %c, i32 %d) #0 {
31*9880d681SAndroid Build Coastguard Workerentry:
32*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, %b
33*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cmp, i32 %c, i32 %d
34*9880d681SAndroid Build Coastguard Worker  ret i32 %r
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_fcmp_oeq_i64:
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   ucomiss  %xmm1, %xmm0
40*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   cmovneq  %rsi, %rdi
41*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   cmovpq  %rsi, %rdi
42*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movq  %rdi, %rax
43*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   retq
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  8(%esp)
46*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  4(%esp)
47*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fucompp
48*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fnstsw  %ax
49*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   sahf
50*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  20(%esp), %ecx
51*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
52*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp  [[TBB]]
53*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  12(%esp), %ecx
54*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT: [[TBB]]:
55*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%ecx), %eax
56*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   orl  $4, %ecx
57*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%ecx), %edx
58*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   retl
59*9880d681SAndroid Build Coastguard Workerdefine i64 @test_select_fcmp_oeq_i64(float %a, float %b, i64 %c, i64 %d) #0 {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, %b
62*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cmp, i64 %c, i64 %d
63*9880d681SAndroid Build Coastguard Worker  ret i64 %r
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_fcmp_une_i64:
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   ucomiss  %xmm1, %xmm0
69*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   cmovneq  %rdi, %rsi
70*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   cmovpq  %rdi, %rsi
71*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movq  %rsi, %rax
72*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   retq
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  8(%esp)
75*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  4(%esp)
76*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fucompp
77*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fnstsw  %ax
78*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   sahf
79*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  12(%esp), %ecx
80*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
81*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp  [[TBB]]
82*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  20(%esp), %ecx
83*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT: [[TBB]]:
84*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%ecx), %eax
85*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   orl  $4, %ecx
86*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%ecx), %edx
87*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   retl
88*9880d681SAndroid Build Coastguard Workerdefine i64 @test_select_fcmp_une_i64(float %a, float %b, i64 %c, i64 %d) #0 {
89*9880d681SAndroid Build Coastguard Workerentry:
90*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %a, %b
91*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cmp, i64 %c, i64 %d
92*9880d681SAndroid Build Coastguard Worker  ret i64 %r
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_fcmp_oeq_f64:
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   ucomiss  %xmm1, %xmm0
98*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
99*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jp  [[TBB]]
100*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movaps  %xmm2, %xmm3
101*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: [[TBB]]:
102*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movaps  %xmm3, %xmm0
103*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   retq
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  8(%esp)
106*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  4(%esp)
107*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fucompp
108*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fnstsw  %ax
109*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   sahf
110*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  20(%esp), %eax
111*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
112*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp  [[TBB]]
113*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  12(%esp), %eax
114*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT: [[TBB]]:
115*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fldl  (%eax)
116*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   retl
117*9880d681SAndroid Build Coastguard Workerdefine double @test_select_fcmp_oeq_f64(float %a, float %b, double %c, double %d) #0 {
118*9880d681SAndroid Build Coastguard Workerentry:
119*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, %b
120*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cmp, double %c, double %d
121*9880d681SAndroid Build Coastguard Worker  ret double %r
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_select_fcmp_oeq_v4i32:
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   ucomiss  %xmm1, %xmm0
127*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
128*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jp  [[TBB]]
129*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movaps  %xmm2, %xmm3
130*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: [[TBB]]:
131*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movaps  %xmm3, %xmm0
132*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   retq
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   pushl  %edi
135*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   pushl  %esi
136*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  20(%esp)
137*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   flds  16(%esp)
138*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fucompp
139*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   fnstsw  %ax
140*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   sahf
141*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  40(%esp), %eax
142*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
143*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp  [[TBB]]
144*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  24(%esp), %eax
145*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT: [[TBB]]:
146*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%eax), %ecx
147*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  44(%esp), %edx
148*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
149*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp  [[TBB]]
150*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  28(%esp), %edx
151*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT: [[TBB]]:
152*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  12(%esp), %eax
153*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%edx), %edx
154*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  48(%esp), %esi
155*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
156*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp  [[TBB]]
157*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  32(%esp), %esi
158*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT: [[TBB]]:
159*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%esi), %esi
160*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  52(%esp), %edi
161*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
162*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp  [[TBB]]
163*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   leal  36(%esp), %edi
164*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT: [[TBB]]:
165*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  (%edi), %edi
166*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  %edi, 12(%eax)
167*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  %esi, 8(%eax)
168*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  %edx, 4(%eax)
169*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   movl  %ecx, (%eax)
170*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   popl  %esi
171*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   popl  %edi
172*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   retl  $4
173*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_select_fcmp_oeq_v4i32(float %a, float %b, <4 x i32> %c, <4 x i32> %d) #0 {
174*9880d681SAndroid Build Coastguard Workerentry:
175*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, %b
176*9880d681SAndroid Build Coastguard Worker  %r = select i1 %cmp, <4 x i32> %c, <4 x i32> %d
177*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %r
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker; Also make sure we catch the original code-sequence of interest:
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker; CMOV: [[ONE_F32_LCPI:.LCPI.*]]:
183*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   .long  1065353216
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_zext_fcmp_une:
186*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   ucomiss  %xmm1, %xmm0
187*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movss  [[ONE_F32_LCPI]](%rip), %xmm0
188*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
189*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jp  [[TBB]]
190*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   xorps  %xmm0, %xmm0
191*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: [[TBB]]:
192*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   retq
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker; NOCMOV:        jne
195*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp
196*9880d681SAndroid Build Coastguard Workerdefine float @test_zext_fcmp_une(float %a, float %b) #0 {
197*9880d681SAndroid Build Coastguard Workerentry:
198*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp une float %a, %b
199*9880d681SAndroid Build Coastguard Worker  %conv1 = zext i1 %cmp to i32
200*9880d681SAndroid Build Coastguard Worker  %conv2 = sitofp i32 %conv1 to float
201*9880d681SAndroid Build Coastguard Worker  ret float %conv2
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; CMOV: [[ONE_F32_LCPI:.LCPI.*]]:
205*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   .long  1065353216
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_zext_fcmp_oeq:
208*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   ucomiss  %xmm1, %xmm0
209*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   xorps  %xmm0, %xmm0
210*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jne  [[TBB:.LBB[0-9_]+]]
211*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   jp  [[TBB]]
212*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   movss  [[ONE_F32_LCPI]](%rip), %xmm0
213*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT: [[TBB]]:
214*9880d681SAndroid Build Coastguard Worker; CMOV-NEXT:   retq
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Worker; NOCMOV:        jne
217*9880d681SAndroid Build Coastguard Worker; NOCMOV-NEXT:   jp
218*9880d681SAndroid Build Coastguard Workerdefine float @test_zext_fcmp_oeq(float %a, float %b) #0 {
219*9880d681SAndroid Build Coastguard Workerentry:
220*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %a, %b
221*9880d681SAndroid Build Coastguard Worker  %conv1 = zext i1 %cmp to i32
222*9880d681SAndroid Build Coastguard Worker  %conv2 = sitofp i32 %conv1 to float
223*9880d681SAndroid Build Coastguard Worker  ret float %conv2
224*9880d681SAndroid Build Coastguard Worker}
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker@g8 = global i8 0
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker; The following test failed because llvm had a bug where a structure like:
231*9880d681SAndroid Build Coastguard Worker;
232*9880d681SAndroid Build Coastguard Worker; %vreg12<def> = CMOV_GR8 %vreg7, %vreg11 ... (lt)
233*9880d681SAndroid Build Coastguard Worker; %vreg13<def> = CMOV_GR8 %vreg12, %vreg11 ... (gt)
234*9880d681SAndroid Build Coastguard Worker;
235*9880d681SAndroid Build Coastguard Worker; was lowered to:
236*9880d681SAndroid Build Coastguard Worker;
237*9880d681SAndroid Build Coastguard Worker; The first two cmovs got expanded to:
238*9880d681SAndroid Build Coastguard Worker; BB#0:
239*9880d681SAndroid Build Coastguard Worker;   JL_1 BB#9
240*9880d681SAndroid Build Coastguard Worker; BB#7:
241*9880d681SAndroid Build Coastguard Worker;   JG_1 BB#9
242*9880d681SAndroid Build Coastguard Worker; BB#8:
243*9880d681SAndroid Build Coastguard Worker; BB#9:
244*9880d681SAndroid Build Coastguard Worker;   vreg12 = phi(vreg7, BB#8, vreg11, BB#0, vreg12, BB#7)
245*9880d681SAndroid Build Coastguard Worker;   vreg13 = COPY vreg12
246*9880d681SAndroid Build Coastguard Worker; Which was invalid as %vreg12 is not the same value as %vreg13
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: no_cascade_opt:
249*9880d681SAndroid Build Coastguard Worker; CMOV-DAG: cmpl %edx, %esi
250*9880d681SAndroid Build Coastguard Worker; CMOV-DAG: movb $20, %al
251*9880d681SAndroid Build Coastguard Worker; CMOV-DAG: movb $20, %dl
252*9880d681SAndroid Build Coastguard Worker; CMOV:   jl [[BB0:.LBB[0-9_]+]]
253*9880d681SAndroid Build Coastguard Worker; CMOV:   movl %ecx, %edx
254*9880d681SAndroid Build Coastguard Worker; CMOV: [[BB0]]:
255*9880d681SAndroid Build Coastguard Worker; CMOV:   jg [[BB1:.LBB[0-9_]+]]
256*9880d681SAndroid Build Coastguard Worker; CMOV:   movl %edx, %eax
257*9880d681SAndroid Build Coastguard Worker; CMOV: [[BB1]]:
258*9880d681SAndroid Build Coastguard Worker; CMOV:   testl %edi, %edi
259*9880d681SAndroid Build Coastguard Worker; CMOV:   je [[BB2:.LBB[0-9_]+]]
260*9880d681SAndroid Build Coastguard Worker; CMOV:   movl %edx, %eax
261*9880d681SAndroid Build Coastguard Worker; CMOV: [[BB2]]:
262*9880d681SAndroid Build Coastguard Worker; CMOV:   movb %al, g8(%rip)
263*9880d681SAndroid Build Coastguard Worker; CMOV:   retq
264*9880d681SAndroid Build Coastguard Workerdefine void @no_cascade_opt(i32 %v0, i32 %v1, i32 %v2, i32 %v3) {
265*9880d681SAndroid Build Coastguard Workerentry:
266*9880d681SAndroid Build Coastguard Worker  %c0 = icmp eq i32 %v0, 0
267*9880d681SAndroid Build Coastguard Worker  %c1 = icmp slt i32 %v1, %v2
268*9880d681SAndroid Build Coastguard Worker  %c2 = icmp sgt i32 %v1, %v2
269*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i32 %v3 to i8
270*9880d681SAndroid Build Coastguard Worker  %sel0 = select i1 %c1, i8 20, i8 %trunc
271*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %c2, i8 20, i8 %sel0
272*9880d681SAndroid Build Coastguard Worker  %sel2 = select i1 %c0, i8 %sel1, i8 %sel0
273*9880d681SAndroid Build Coastguard Worker  store volatile i8 %sel2, i8* @g8
274*9880d681SAndroid Build Coastguard Worker  ret void
275*9880d681SAndroid Build Coastguard Worker}
276