1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s 3 4; Ensure chains of comparisons produce chains of `ccmp` 5 6; (x0 < x1) && (x2 > x3) 7define i32 @cmp_and2(i32 %0, i32 %1, i32 %2, i32 %3) { 8; CHECK-LABEL: cmp_and2: 9; CHECK: // %bb.0: 10; CHECK-NEXT: cmp w0, w1 11; CHECK-NEXT: ccmp w2, w3, #0, lo 12; CHECK-NEXT: cset w0, hi 13; CHECK-NEXT: ret 14 %5 = icmp ult i32 %0, %1 15 %6 = icmp ugt i32 %2, %3 16 %7 = select i1 %5, i1 %6, i1 false 17 %8 = zext i1 %7 to i32 18 ret i32 %8 19} 20 21; (x0 < x1) && (x2 > x3) && (x4 != x5) 22define i32 @cmp_and3(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) { 23; CHECK-LABEL: cmp_and3: 24; CHECK: // %bb.0: 25; CHECK-NEXT: cmp w0, w1 26; CHECK-NEXT: ccmp w2, w3, #0, lo 27; CHECK-NEXT: ccmp w4, w5, #4, hi 28; CHECK-NEXT: cset w0, ne 29; CHECK-NEXT: ret 30 %7 = icmp ult i32 %0, %1 31 %8 = icmp ugt i32 %2, %3 32 %9 = select i1 %7, i1 %8, i1 false 33 %10 = icmp ne i32 %4, %5 34 %11 = select i1 %9, i1 %10, i1 false 35 %12 = zext i1 %11 to i32 36 ret i32 %12 37} 38 39; (x0 < x1) && (x2 > x3) && (x4 != x5) && (x6 == x7) 40define i32 @cmp_and4(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7) { 41; CHECK-LABEL: cmp_and4: 42; CHECK: // %bb.0: 43; CHECK-NEXT: cmp w2, w3 44; CHECK-NEXT: ccmp w0, w1, #2, hi 45; CHECK-NEXT: ccmp w4, w5, #4, lo 46; CHECK-NEXT: ccmp w6, w7, #0, ne 47; CHECK-NEXT: cset w0, eq 48; CHECK-NEXT: ret 49 %9 = icmp ugt i32 %2, %3 50 %10 = icmp ult i32 %0, %1 51 %11 = select i1 %9, i1 %10, i1 false 52 %12 = icmp ne i32 %4, %5 53 %13 = select i1 %11, i1 %12, i1 false 54 %14 = icmp eq i32 %6, %7 55 %15 = select i1 %13, i1 %14, i1 false 56 %16 = zext i1 %15 to i32 57 ret i32 %16 58} 59 60; (x0 < x1) || (x2 > x3) 61define i32 @cmp_or2(i32 %0, i32 %1, i32 %2, i32 %3) { 62; CHECK-LABEL: cmp_or2: 63; CHECK: // %bb.0: 64; CHECK-NEXT: cmp w0, w1 65; CHECK-NEXT: ccmp w2, w3, #0, hs 66; CHECK-NEXT: cset w0, ne 67; CHECK-NEXT: ret 68 %5 = icmp ult i32 %0, %1 69 %6 = icmp ne i32 %2, %3 70 %7 = select i1 %5, i1 true, i1 %6 71 %8 = zext i1 %7 to i32 72 ret i32 %8 73} 74 75; (x0 < x1) || (x2 > x3) || (x4 != x5) 76define i32 @cmp_or3(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5) { 77; CHECK-LABEL: cmp_or3: 78; CHECK: // %bb.0: 79; CHECK-NEXT: cmp w0, w1 80; CHECK-NEXT: ccmp w2, w3, #2, hs 81; CHECK-NEXT: ccmp w4, w5, #0, ls 82; CHECK-NEXT: cset w0, ne 83; CHECK-NEXT: ret 84 %7 = icmp ult i32 %0, %1 85 %8 = icmp ugt i32 %2, %3 86 %9 = select i1 %7, i1 true, i1 %8 87 %10 = icmp ne i32 %4, %5 88 %11 = select i1 %9, i1 true, i1 %10 89 %12 = zext i1 %11 to i32 90 ret i32 %12 91} 92 93; (x0 < x1) || (x2 > x3) || (x4 != x5) || (x6 == x7) 94define i32 @cmp_or4(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7) { 95; CHECK-LABEL: cmp_or4: 96; CHECK: // %bb.0: 97; CHECK-NEXT: cmp w0, w1 98; CHECK-NEXT: ccmp w2, w3, #2, hs 99; CHECK-NEXT: ccmp w4, w5, #0, ls 100; CHECK-NEXT: ccmp w6, w7, #4, eq 101; CHECK-NEXT: cset w0, eq 102; CHECK-NEXT: ret 103 %9 = icmp ult i32 %0, %1 104 %10 = icmp ugt i32 %2, %3 105 %11 = select i1 %9, i1 true, i1 %10 106 %12 = icmp ne i32 %4, %5 107 %13 = select i1 %11, i1 true, i1 %12 108 %14 = icmp eq i32 %6, %7 109 %15 = select i1 %13, i1 true, i1 %14 110 %16 = zext i1 %15 to i32 111 ret i32 %16 112} 113 114; (x0 != 0) || (x1 != 0) 115define i32 @true_or2(i32 %0, i32 %1) { 116; CHECK-LABEL: true_or2: 117; CHECK: // %bb.0: 118; CHECK-NEXT: orr w8, w0, w1 119; CHECK-NEXT: cmp w8, #0 120; CHECK-NEXT: cset w0, ne 121; CHECK-NEXT: ret 122 %3 = icmp ne i32 %0, 0 123 %4 = icmp ne i32 %1, 0 124 %5 = select i1 %3, i1 true, i1 %4 125 %6 = zext i1 %5 to i32 126 ret i32 %6 127} 128 129; (x0 != 0) || (x1 != 0) || (x2 != 0) 130define i32 @true_or3(i32 %0, i32 %1, i32 %2) { 131; CHECK-LABEL: true_or3: 132; CHECK: // %bb.0: 133; CHECK-NEXT: orr w8, w0, w1 134; CHECK-NEXT: orr w8, w8, w2 135; CHECK-NEXT: cmp w8, #0 136; CHECK-NEXT: cset w0, ne 137; CHECK-NEXT: ret 138 %4 = icmp ne i32 %0, 0 139 %5 = icmp ne i32 %1, 0 140 %6 = select i1 %4, i1 true, i1 %5 141 %7 = icmp ne i32 %2, 0 142 %8 = select i1 %6, i1 true, i1 %7 143 %9 = zext i1 %8 to i32 144 ret i32 %9 145} 146