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