Skip to content

Commit f49c243

Browse files
committed
Pre-commit test (NFC)
1 parent b9adc4a commit f49c243

File tree

1 file changed

+161
-0
lines changed

1 file changed

+161
-0
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2+
; RUN: llc -mtriple=aarch64 %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+
; RUN: llc -mtriple=aarch64 -global-isel %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-GI
4+
5+
define i32 @test_lshr(ptr nocapture %x, ptr nocapture readonly %y, i32 %n) {
6+
; CHECK-SD-LABEL: test_lshr:
7+
; CHECK-SD: // %bb.0: // %entry
8+
; CHECK-SD-NEXT: lsr w8, w2, #2
9+
; CHECK-SD-NEXT: cbz w8, .LBB0_2
10+
; CHECK-SD-NEXT: .LBB0_1: // %while.body
11+
; CHECK-SD-NEXT: // =>This Inner Loop Header: Depth=1
12+
; CHECK-SD-NEXT: ldr w9, [x1], #4
13+
; CHECK-SD-NEXT: subs w8, w8, #1
14+
; CHECK-SD-NEXT: lsl w9, w9, #1
15+
; CHECK-SD-NEXT: str w9, [x0], #4
16+
; CHECK-SD-NEXT: b.ne .LBB0_1
17+
; CHECK-SD-NEXT: .LBB0_2: // %while.end
18+
; CHECK-SD-NEXT: mov w0, wzr
19+
; CHECK-SD-NEXT: ret
20+
;
21+
; CHECK-GI-LABEL: test_lshr:
22+
; CHECK-GI: // %bb.0: // %entry
23+
; CHECK-GI-NEXT: lsr w8, w2, #2
24+
; CHECK-GI-NEXT: cbz w8, .LBB0_2
25+
; CHECK-GI-NEXT: .LBB0_1: // %while.body
26+
; CHECK-GI-NEXT: // =>This Inner Loop Header: Depth=1
27+
; CHECK-GI-NEXT: ldr w9, [x1], #4
28+
; CHECK-GI-NEXT: add x10, x0, #4
29+
; CHECK-GI-NEXT: subs w8, w8, #1
30+
; CHECK-GI-NEXT: lsl w9, w9, #1
31+
; CHECK-GI-NEXT: str w9, [x0]
32+
; CHECK-GI-NEXT: mov x0, x10
33+
; CHECK-GI-NEXT: b.ne .LBB0_1
34+
; CHECK-GI-NEXT: .LBB0_2: // %while.end
35+
; CHECK-GI-NEXT: mov w0, wzr
36+
; CHECK-GI-NEXT: ret
37+
entry:
38+
%shr = lshr i32 %n, 2
39+
%tobool.not4 = icmp eq i32 %shr, 0
40+
br i1 %tobool.not4, label %while.end, label %while.body
41+
42+
while.body: ; preds = %entry, %while.body
43+
%c.07 = phi i32 [ %dec, %while.body ], [ %shr, %entry ]
44+
%x.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %x, %entry ]
45+
%y.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %y, %entry ]
46+
%incdec.ptr = getelementptr inbounds i32, ptr %y.addr.05, i32 1
47+
%0 = load i32, ptr %y.addr.05, align 4
48+
%mul = shl nsw i32 %0, 1
49+
%incdec.ptr1 = getelementptr inbounds i32, ptr %x.addr.06, i32 1
50+
store i32 %mul, ptr %x.addr.06, align 4
51+
%dec = add nsw i32 %c.07, -1
52+
%tobool.not = icmp eq i32 %dec, 0
53+
br i1 %tobool.not, label %while.end, label %while.body
54+
55+
while.end: ; preds = %while.body, %entry
56+
ret i32 0
57+
}
58+
59+
define i32 @test_lshr2(ptr nocapture %x, ptr nocapture readonly %y, i32 %n) {
60+
; CHECK-SD-LABEL: test_lshr2:
61+
; CHECK-SD: // %bb.0: // %entry
62+
; CHECK-SD-NEXT: cmp w2, #4
63+
; CHECK-SD-NEXT: b.lo .LBB1_3
64+
; CHECK-SD-NEXT: // %bb.1: // %while.body.preheader
65+
; CHECK-SD-NEXT: lsr w8, w2, #2
66+
; CHECK-SD-NEXT: .LBB1_2: // %while.body
67+
; CHECK-SD-NEXT: // =>This Inner Loop Header: Depth=1
68+
; CHECK-SD-NEXT: ldr w9, [x1], #4
69+
; CHECK-SD-NEXT: subs w8, w8, #1
70+
; CHECK-SD-NEXT: lsl w9, w9, #1
71+
; CHECK-SD-NEXT: str w9, [x0], #4
72+
; CHECK-SD-NEXT: b.ne .LBB1_2
73+
; CHECK-SD-NEXT: .LBB1_3: // %while.end
74+
; CHECK-SD-NEXT: mov w0, wzr
75+
; CHECK-SD-NEXT: ret
76+
;
77+
; CHECK-GI-LABEL: test_lshr2:
78+
; CHECK-GI: // %bb.0: // %entry
79+
; CHECK-GI-NEXT: cmp w2, #4
80+
; CHECK-GI-NEXT: b.lo .LBB1_3
81+
; CHECK-GI-NEXT: // %bb.1: // %while.body.preheader
82+
; CHECK-GI-NEXT: lsr w8, w2, #2
83+
; CHECK-GI-NEXT: .LBB1_2: // %while.body
84+
; CHECK-GI-NEXT: // =>This Inner Loop Header: Depth=1
85+
; CHECK-GI-NEXT: ldr w9, [x1], #4
86+
; CHECK-GI-NEXT: add x10, x0, #4
87+
; CHECK-GI-NEXT: subs w8, w8, #1
88+
; CHECK-GI-NEXT: lsl w9, w9, #1
89+
; CHECK-GI-NEXT: str w9, [x0]
90+
; CHECK-GI-NEXT: mov x0, x10
91+
; CHECK-GI-NEXT: b.ne .LBB1_2
92+
; CHECK-GI-NEXT: .LBB1_3: // %while.end
93+
; CHECK-GI-NEXT: mov w0, wzr
94+
; CHECK-GI-NEXT: ret
95+
entry:
96+
%tobool.not4 = icmp ult i32 %n, 4
97+
br i1 %tobool.not4, label %while.end, label %while.body.preheader
98+
99+
while.body.preheader: ; preds = %entry
100+
%shr = lshr i32 %n, 2
101+
br label %while.body
102+
103+
while.body: ; preds = %while.body.preheader, %while.body
104+
%c.07 = phi i32 [ %dec, %while.body ], [ %shr, %while.body.preheader ]
105+
%x.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %x, %while.body.preheader ]
106+
%y.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %y, %while.body.preheader ]
107+
%incdec.ptr = getelementptr inbounds i32, ptr %y.addr.05, i32 1
108+
%0 = load i32, ptr %y.addr.05, align 4
109+
%mul = shl nsw i32 %0, 1
110+
%incdec.ptr1 = getelementptr inbounds i32, ptr %x.addr.06, i32 1
111+
store i32 %mul, ptr %x.addr.06, align 4
112+
%dec = add nsw i32 %c.07, -1
113+
%tobool.not = icmp eq i32 %dec, 0
114+
br i1 %tobool.not, label %while.end, label %while.body
115+
116+
while.end: ; preds = %while.body, %entry
117+
ret i32 0
118+
}
119+
120+
121+
define i32 @lshr(i32 %u) {
122+
; CHECK-LABEL: lshr:
123+
; CHECK: // %bb.0: // %entry
124+
; CHECK-NEXT: stp x30, x19, [sp, #-16]! // 16-byte Folded Spill
125+
; CHECK-NEXT: .cfi_def_cfa_offset 16
126+
; CHECK-NEXT: .cfi_offset w19, -8
127+
; CHECK-NEXT: .cfi_offset w30, -16
128+
; CHECK-NEXT: mov w19, w0
129+
; CHECK-NEXT: cmp w0, #16
130+
; CHECK-NEXT: mov w8, w0
131+
; CHECK-NEXT: b.lo .LBB2_2
132+
; CHECK-NEXT: // %bb.1: // %if.then
133+
; CHECK-NEXT: lsr w0, w19, #4
134+
; CHECK-NEXT: bl use
135+
; CHECK-NEXT: add w8, w19, w19, lsl #1
136+
; CHECK-NEXT: .LBB2_2: // %if.end
137+
; CHECK-NEXT: sub w9, w19, #7
138+
; CHECK-NEXT: cmp w8, w9
139+
; CHECK-NEXT: cset w0, hi
140+
; CHECK-NEXT: ldp x30, x19, [sp], #16 // 16-byte Folded Reload
141+
; CHECK-NEXT: ret
142+
entry:
143+
%cmp.not = icmp ult i32 %u, 16
144+
br i1 %cmp.not, label %if.end, label %if.then
145+
146+
if.then: ; preds = %entry
147+
%shr = lshr i32 %u, 4
148+
tail call void @use(i32 noundef %shr)
149+
%mul = mul i32 %u, 3
150+
br label %if.end
151+
152+
if.end: ; preds = %if.then, %entry
153+
%u.addr.0 = phi i32 [ %mul, %if.then ], [ %u, %entry ]
154+
%sub = add i32 %u, -7
155+
%cmp1 = icmp ugt i32 %u.addr.0, %sub
156+
%conv = zext i1 %cmp1 to i32
157+
ret i32 %conv
158+
}
159+
160+
declare void @use(i32)
161+

0 commit comments

Comments
 (0)