1*9880d681SAndroid Build Coastguard Worker; RUN: llc -o - %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-unknown" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; select with and i1/or i1 condition should be implemented as a series of 2 5*9880d681SAndroid Build Coastguard Worker; cmovs, not by producing two conditions and using and on them. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine i32 @select_and(i32 %a0, i32 %a1, float %a2, float %a3, i32 %a4, i32 %a5) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_and 9*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: set 10*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: and[lb] 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test 12*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 13*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 14*9880d681SAndroid Build Coastguard Worker %cmp0 = icmp ult i32 %a0, %a1 15*9880d681SAndroid Build Coastguard Worker %cmp1 = fcmp olt float %a2, %a3 16*9880d681SAndroid Build Coastguard Worker %and = and i1 %cmp0, %cmp1 17*9880d681SAndroid Build Coastguard Worker %res = select i1 %and, i32 %a4, i32 %a5 18*9880d681SAndroid Build Coastguard Worker ret i32 %res 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdefine i32 @select_or(i32 %a0, i32 %a1, float %a2, float %a3, i32 %a4, i32 %a5) { 22*9880d681SAndroid Build Coastguard Worker; select with and i1 condition should be implemented as a series of 2 cmovs, not 23*9880d681SAndroid Build Coastguard Worker; by producing two conditions and using and on them. 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_or 25*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: set 26*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: or[lb] 27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: test 28*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 29*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 30*9880d681SAndroid Build Coastguard Worker %cmp0 = icmp ult i32 %a0, %a1 31*9880d681SAndroid Build Coastguard Worker %cmp1 = fcmp olt float %a2, %a3 32*9880d681SAndroid Build Coastguard Worker %and = or i1 %cmp0, %cmp1 33*9880d681SAndroid Build Coastguard Worker %res = select i1 %and, i32 %a4, i32 %a5 34*9880d681SAndroid Build Coastguard Worker ret i32 %res 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; If one of the conditions is materialized as a 0/1 value anyway, then the 38*9880d681SAndroid Build Coastguard Worker; sequence of 2 cmovs should not be used. 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker@var32 = global i32 0 41*9880d681SAndroid Build Coastguard Workerdefine i32 @select_noopt(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) { 42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_noopt 43*9880d681SAndroid Build Coastguard Worker; CHECK: cmov 44*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: cmov 45*9880d681SAndroid Build Coastguard Worker %cmp0 = icmp ult i32 %a0, %a1 46*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp ult i32 %a1, %a2 47*9880d681SAndroid Build Coastguard Worker %or = or i1 %cmp0, %cmp1 48*9880d681SAndroid Build Coastguard Worker %zero_one = zext i1 %or to i32 49*9880d681SAndroid Build Coastguard Worker store volatile i32 %zero_one, i32* @var32 50*9880d681SAndroid Build Coastguard Worker %res = select i1 %or, i32 %a3, i32 %a4 51*9880d681SAndroid Build Coastguard Worker ret i32 %res 52*9880d681SAndroid Build Coastguard Worker} 53