Skip to content

Commit 41dd07b

Browse files
committed
[AArch64] Add test coverage for bitreverse(logicalshift(bitreverse(x),y)) -> logicalshift(x,y) fold
DAG already performs this fold (#89897), GISel is currently missing it (patch incoming)
1 parent ab3a9e7 commit 41dd07b

File tree

1 file changed

+164
-0
lines changed

1 file changed

+164
-0
lines changed
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s --check-prefixes=SDAG
3+
; RUN: llc < %s -mtriple=aarch64-unknown-unknown -global-isel | FileCheck %s --check-prefixes=GISEL
4+
5+
; These tests can be optimised
6+
; fold (bitreverse(srl (bitreverse c), x)) -> (shl c, x)
7+
; fold (bitreverse(shl (bitreverse c), x)) -> (srl c, x)
8+
9+
declare i8 @llvm.bitreverse.i8(i8)
10+
declare i16 @llvm.bitreverse.i16(i16)
11+
declare i32 @llvm.bitreverse.i32(i32)
12+
declare i64 @llvm.bitreverse.i64(i64)
13+
14+
define i8 @test_bitreverse_srli_bitreverse_i8(i8 %a) nounwind {
15+
; SDAG-LABEL: test_bitreverse_srli_bitreverse_i8:
16+
; SDAG: // %bb.0:
17+
; SDAG-NEXT: lsl w0, w0, #3
18+
; SDAG-NEXT: ret
19+
;
20+
; GISEL-LABEL: test_bitreverse_srli_bitreverse_i8:
21+
; GISEL: // %bb.0:
22+
; GISEL-NEXT: rbit w8, w0
23+
; GISEL-NEXT: lsr w8, w8, #24
24+
; GISEL-NEXT: lsr w8, w8, #3
25+
; GISEL-NEXT: rbit w8, w8
26+
; GISEL-NEXT: lsr w0, w8, #24
27+
; GISEL-NEXT: ret
28+
%1 = call i8 @llvm.bitreverse.i8(i8 %a)
29+
%2 = lshr i8 %1, 3
30+
%3 = call i8 @llvm.bitreverse.i8(i8 %2)
31+
ret i8 %3
32+
}
33+
34+
define i16 @test_bitreverse_srli_bitreverse_i16(i16 %a) nounwind {
35+
; SDAG-LABEL: test_bitreverse_srli_bitreverse_i16:
36+
; SDAG: // %bb.0:
37+
; SDAG-NEXT: lsl w0, w0, #7
38+
; SDAG-NEXT: ret
39+
;
40+
; GISEL-LABEL: test_bitreverse_srli_bitreverse_i16:
41+
; GISEL: // %bb.0:
42+
; GISEL-NEXT: rbit w8, w0
43+
; GISEL-NEXT: lsr w8, w8, #16
44+
; GISEL-NEXT: lsr w8, w8, #7
45+
; GISEL-NEXT: rbit w8, w8
46+
; GISEL-NEXT: lsr w0, w8, #16
47+
; GISEL-NEXT: ret
48+
%1 = call i16 @llvm.bitreverse.i16(i16 %a)
49+
%2 = lshr i16 %1, 7
50+
%3 = call i16 @llvm.bitreverse.i16(i16 %2)
51+
ret i16 %3
52+
}
53+
54+
define i32 @test_bitreverse_srli_bitreverse_i32(i32 %a) nounwind {
55+
; SDAG-LABEL: test_bitreverse_srli_bitreverse_i32:
56+
; SDAG: // %bb.0:
57+
; SDAG-NEXT: lsl w0, w0, #15
58+
; SDAG-NEXT: ret
59+
;
60+
; GISEL-LABEL: test_bitreverse_srli_bitreverse_i32:
61+
; GISEL: // %bb.0:
62+
; GISEL-NEXT: rbit w8, w0
63+
; GISEL-NEXT: lsr w8, w8, #15
64+
; GISEL-NEXT: rbit w0, w8
65+
; GISEL-NEXT: ret
66+
%1 = call i32 @llvm.bitreverse.i32(i32 %a)
67+
%2 = lshr i32 %1, 15
68+
%3 = call i32 @llvm.bitreverse.i32(i32 %2)
69+
ret i32 %3
70+
}
71+
72+
define i64 @test_bitreverse_srli_bitreverse_i64(i64 %a) nounwind {
73+
; SDAG-LABEL: test_bitreverse_srli_bitreverse_i64:
74+
; SDAG: // %bb.0:
75+
; SDAG-NEXT: lsl x0, x0, #33
76+
; SDAG-NEXT: ret
77+
;
78+
; GISEL-LABEL: test_bitreverse_srli_bitreverse_i64:
79+
; GISEL: // %bb.0:
80+
; GISEL-NEXT: rbit x8, x0
81+
; GISEL-NEXT: lsr x8, x8, #33
82+
; GISEL-NEXT: rbit x0, x8
83+
; GISEL-NEXT: ret
84+
%1 = call i64 @llvm.bitreverse.i64(i64 %a)
85+
%2 = lshr i64 %1, 33
86+
%3 = call i64 @llvm.bitreverse.i64(i64 %2)
87+
ret i64 %3
88+
}
89+
90+
define i8 @test_bitreverse_shli_bitreverse_i8(i8 %a) nounwind {
91+
; SDAG-LABEL: test_bitreverse_shli_bitreverse_i8:
92+
; SDAG: // %bb.0:
93+
; SDAG-NEXT: ubfx w0, w0, #3, #5
94+
; SDAG-NEXT: ret
95+
;
96+
; GISEL-LABEL: test_bitreverse_shli_bitreverse_i8:
97+
; GISEL: // %bb.0:
98+
; GISEL-NEXT: rbit w8, w0
99+
; GISEL-NEXT: lsr w8, w8, #24
100+
; GISEL-NEXT: lsl w8, w8, #3
101+
; GISEL-NEXT: rbit w8, w8
102+
; GISEL-NEXT: lsr w0, w8, #24
103+
; GISEL-NEXT: ret
104+
%1 = call i8 @llvm.bitreverse.i8(i8 %a)
105+
%2 = shl i8 %1, 3
106+
%3 = call i8 @llvm.bitreverse.i8(i8 %2)
107+
ret i8 %3
108+
}
109+
110+
define i16 @test_bitreverse_shli_bitreverse_i16(i16 %a) nounwind {
111+
; SDAG-LABEL: test_bitreverse_shli_bitreverse_i16:
112+
; SDAG: // %bb.0:
113+
; SDAG-NEXT: ubfx w0, w0, #7, #9
114+
; SDAG-NEXT: ret
115+
;
116+
; GISEL-LABEL: test_bitreverse_shli_bitreverse_i16:
117+
; GISEL: // %bb.0:
118+
; GISEL-NEXT: rbit w8, w0
119+
; GISEL-NEXT: lsr w8, w8, #16
120+
; GISEL-NEXT: lsl w8, w8, #7
121+
; GISEL-NEXT: rbit w8, w8
122+
; GISEL-NEXT: lsr w0, w8, #16
123+
; GISEL-NEXT: ret
124+
%1 = call i16 @llvm.bitreverse.i16(i16 %a)
125+
%2 = shl i16 %1, 7
126+
%3 = call i16 @llvm.bitreverse.i16(i16 %2)
127+
ret i16 %3
128+
}
129+
130+
define i32 @test_bitreverse_shli_bitreverse_i32(i32 %a) nounwind {
131+
; SDAG-LABEL: test_bitreverse_shli_bitreverse_i32:
132+
; SDAG: // %bb.0:
133+
; SDAG-NEXT: lsr w0, w0, #15
134+
; SDAG-NEXT: ret
135+
;
136+
; GISEL-LABEL: test_bitreverse_shli_bitreverse_i32:
137+
; GISEL: // %bb.0:
138+
; GISEL-NEXT: rbit w8, w0
139+
; GISEL-NEXT: lsl w8, w8, #15
140+
; GISEL-NEXT: rbit w0, w8
141+
; GISEL-NEXT: ret
142+
%1 = call i32 @llvm.bitreverse.i32(i32 %a)
143+
%2 = shl i32 %1, 15
144+
%3 = call i32 @llvm.bitreverse.i32(i32 %2)
145+
ret i32 %3
146+
}
147+
148+
define i64 @test_bitreverse_shli_bitreverse_i64(i64 %a) nounwind {
149+
; SDAG-LABEL: test_bitreverse_shli_bitreverse_i64:
150+
; SDAG: // %bb.0:
151+
; SDAG-NEXT: lsr x0, x0, #33
152+
; SDAG-NEXT: ret
153+
;
154+
; GISEL-LABEL: test_bitreverse_shli_bitreverse_i64:
155+
; GISEL: // %bb.0:
156+
; GISEL-NEXT: rbit x8, x0
157+
; GISEL-NEXT: lsl x8, x8, #33
158+
; GISEL-NEXT: rbit x0, x8
159+
; GISEL-NEXT: ret
160+
%1 = call i64 @llvm.bitreverse.i64(i64 %a)
161+
%2 = shl i64 %1, 33
162+
%3 = call i64 @llvm.bitreverse.i64(i64 %2)
163+
ret i64 %3
164+
}

0 commit comments

Comments
 (0)