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