brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · c04e779 Raw
51 lines · plain
1; RUN: llc -o - %s | FileCheck %s2target triple = "arm-unknown-unknown"3 4; select with and i1/or i1 condition should be implemented as a series of 25; cmovs, not by producing two conditions and using and on them.6 7define i32 @select_and(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5) {8; CHECK-LABEL: select_and9; CHECK-NOT: tst10; CHECK-NOT: movne11; CHECK: mov{{lo|hs}}12; CHECK: mov{{lo|hs}}13  %cmp0 = icmp ult i32 %a0, %a114  %cmp1 = icmp ult i32 %a2, %a315  %and = and i1 %cmp0, %cmp116  %res = select i1 %and, i32 %a4, i32 %a517  ret i32 %res18}19 20define i32 @select_or(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5) {21; select with and i1 condition should be implemented as a series of 2 cmovs, not22; by producing two conditions and using and on them.23; CHECK-LABEL: select_or24; CHECK-NOT: orss25; CHECK-NOT: tst26; CHECK: mov{{lo|hs}}27; CHECK: mov{{lo|hs}}28  %cmp0 = icmp ult i32 %a0, %a129  %cmp1 = icmp ult i32 %a2, %a330  %and = or i1 %cmp0, %cmp131  %res = select i1 %and, i32 %a4, i32 %a532  ret i32 %res33}34 35; If one of the conditions is materialized as a 0/1 value anyway, then the36; sequence of 2 cmovs should not be used.37 38@var32 = global i32 039define i32 @select_noopt(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) {40; CHECK-LABEL: select_noopt41; CHECK: orrs42; CHECK: movne43  %cmp0 = icmp ult i32 %a0, %a144  %cmp1 = icmp ult i32 %a1, %a245  %or = or i1 %cmp0, %cmp146  %zero_one = zext i1 %or to i3247  store volatile i32 %zero_one, ptr @var3248  %res = select i1 %or, i32 %a3, i32 %a449  ret i32 %res50}51