Skip to content

Commit deba620

Browse files
committed
Add AArch64 vector comparison test
1 parent 671976f commit deba620

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s | FileCheck %s
3+
4+
target triple = "aarch64-unknown-linux-gnu"
5+
6+
define void @vector_loop_with_icmp(ptr nocapture noundef writeonly %dest) {
7+
; CHECK-LABEL: vector_loop_with_icmp:
8+
; CHECK: // %bb.0: // %entry
9+
; CHECK-NEXT: mov w8, #15 // =0xf
10+
; CHECK-NEXT: mov w10, #4 // =0x4
11+
; CHECK-NEXT: adrp x9, .LCPI0_0
12+
; CHECK-NEXT: adrp x11, .LCPI0_1
13+
; CHECK-NEXT: dup v0.2d, x8
14+
; CHECK-NEXT: dup v1.2d, x10
15+
; CHECK-NEXT: ldr q2, [x9, :lo12:.LCPI0_0]
16+
; CHECK-NEXT: ldr q3, [x11, :lo12:.LCPI0_1]
17+
; CHECK-NEXT: add x9, x0, #8
18+
; CHECK-NEXT: mov w10, #16 // =0x10
19+
; CHECK-NEXT: mov w11, #1 // =0x1
20+
; CHECK-NEXT: b .LBB0_2
21+
; CHECK-NEXT: .LBB0_1: // %pred.store.continue18
22+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
23+
; CHECK-NEXT: add v2.2d, v2.2d, v1.2d
24+
; CHECK-NEXT: add v3.2d, v3.2d, v1.2d
25+
; CHECK-NEXT: subs x10, x10, #4
26+
; CHECK-NEXT: add x9, x9, #16
27+
; CHECK-NEXT: b.eq .LBB0_10
28+
; CHECK-NEXT: .LBB0_2: // %vector.body
29+
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
30+
; CHECK-NEXT: cmhi v4.2d, v0.2d, v3.2d
31+
; CHECK-NEXT: xtn v4.2s, v4.2d
32+
; CHECK-NEXT: uzp1 v4.4h, v4.4h, v0.4h
33+
; CHECK-NEXT: umov w12, v4.h[0]
34+
; CHECK-NEXT: tbz w12, #0, .LBB0_4
35+
; CHECK-NEXT: // %bb.3: // %pred.store.if
36+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
37+
; CHECK-NEXT: stur w11, [x9, #-8]
38+
; CHECK-NEXT: .LBB0_4: // %pred.store.continue
39+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
40+
; CHECK-NEXT: dup v4.2d, x8
41+
; CHECK-NEXT: cmhi v4.2d, v4.2d, v3.2d
42+
; CHECK-NEXT: xtn v4.2s, v4.2d
43+
; CHECK-NEXT: uzp1 v4.4h, v4.4h, v0.4h
44+
; CHECK-NEXT: umov w12, v4.h[1]
45+
; CHECK-NEXT: tbz w12, #0, .LBB0_6
46+
; CHECK-NEXT: // %bb.5: // %pred.store.if5
47+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
48+
; CHECK-NEXT: stur w11, [x9, #-4]
49+
; CHECK-NEXT: .LBB0_6: // %pred.store.continue6
50+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
51+
; CHECK-NEXT: dup v4.2d, x8
52+
; CHECK-NEXT: cmhi v4.2d, v4.2d, v2.2d
53+
; CHECK-NEXT: xtn v4.2s, v4.2d
54+
; CHECK-NEXT: uzp1 v4.4h, v0.4h, v4.4h
55+
; CHECK-NEXT: umov w12, v4.h[2]
56+
; CHECK-NEXT: tbz w12, #0, .LBB0_8
57+
; CHECK-NEXT: // %bb.7: // %pred.store.if7
58+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
59+
; CHECK-NEXT: str w11, [x9]
60+
; CHECK-NEXT: .LBB0_8: // %pred.store.continue8
61+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
62+
; CHECK-NEXT: dup v4.2d, x8
63+
; CHECK-NEXT: cmhi v4.2d, v4.2d, v2.2d
64+
; CHECK-NEXT: xtn v4.2s, v4.2d
65+
; CHECK-NEXT: uzp1 v4.4h, v0.4h, v4.4h
66+
; CHECK-NEXT: umov w12, v4.h[3]
67+
; CHECK-NEXT: tbz w12, #0, .LBB0_1
68+
; CHECK-NEXT: // %bb.9: // %pred.store.if9
69+
; CHECK-NEXT: // in Loop: Header=BB0_2 Depth=1
70+
; CHECK-NEXT: str w11, [x9, #4]
71+
; CHECK-NEXT: b .LBB0_1
72+
; CHECK-NEXT: .LBB0_10: // %for.cond.cleanup
73+
; CHECK-NEXT: ret
74+
entry:
75+
br label %vector.body
76+
77+
vector.body:
78+
%index = phi i64 [ 0, %entry ], [ %index.next, %pred.store.continue18 ]
79+
%vec.ind = phi <4 x i64> [ <i64 0, i64 1, i64 2, i64 3>, %entry ], [ %vec.ind.next, %pred.store.continue18 ]
80+
%0 = icmp ult <4 x i64> %vec.ind, <i64 15, i64 15, i64 15, i64 15>
81+
%1 = extractelement <4 x i1> %0, i64 0
82+
br i1 %1, label %pred.store.if, label %pred.store.continue
83+
84+
pred.store.if:
85+
%2 = getelementptr inbounds i32, ptr %dest, i64 %index
86+
store i32 1, ptr %2, align 4
87+
br label %pred.store.continue
88+
89+
pred.store.continue:
90+
%3 = extractelement <4 x i1> %0, i64 1
91+
br i1 %3, label %pred.store.if5, label %pred.store.continue6
92+
93+
pred.store.if5:
94+
%4 = or disjoint i64 %index, 1
95+
%5 = getelementptr inbounds i32, ptr %dest, i64 %4
96+
store i32 1, ptr %5, align 4
97+
br label %pred.store.continue6
98+
99+
pred.store.continue6:
100+
%6 = extractelement <4 x i1> %0, i64 2
101+
br i1 %6, label %pred.store.if7, label %pred.store.continue8
102+
103+
pred.store.if7:
104+
%7 = or disjoint i64 %index, 2
105+
%8 = getelementptr inbounds i32, ptr %dest, i64 %7
106+
store i32 1, ptr %8, align 4
107+
br label %pred.store.continue8
108+
109+
pred.store.continue8:
110+
%9 = extractelement <4 x i1> %0, i64 3
111+
br i1 %9, label %pred.store.if9, label %pred.store.continue18
112+
113+
pred.store.if9:
114+
%10 = or disjoint i64 %index, 3
115+
%11 = getelementptr inbounds i32, ptr %dest, i64 %10
116+
store i32 1, ptr %11, align 4
117+
br label %pred.store.continue18
118+
119+
pred.store.continue18:
120+
%index.next = add i64 %index, 4
121+
%vec.ind.next = add <4 x i64> %vec.ind, <i64 4, i64 4, i64 4, i64 4>
122+
%24 = icmp eq i64 %index.next, 16
123+
br i1 %24, label %for.cond.cleanup, label %vector.body
124+
125+
for.cond.cleanup:
126+
ret void
127+
}

0 commit comments

Comments
 (0)