Skip to content

Commit 8c18de4

Browse files
committed
[PreCommit] Unaligned load/store realigned after offset
1 parent 7a3e555 commit 8c18de4

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3+
; RUN: | FileCheck %s
4+
5+
define void @store_b32_basealign2_offset1(ptr align 2 %p, i32 %v) {
6+
; CHECK-LABEL: store_b32_basealign2_offset1:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: srli a2, a1, 24
9+
; CHECK-NEXT: srli a3, a1, 16
10+
; CHECK-NEXT: srli a4, a1, 8
11+
; CHECK-NEXT: sb a1, 1(a0)
12+
; CHECK-NEXT: sb a4, 2(a0)
13+
; CHECK-NEXT: sb a3, 3(a0)
14+
; CHECK-NEXT: sb a2, 4(a0)
15+
; CHECK-NEXT: ret
16+
entry:
17+
%len = getelementptr inbounds nuw i8, ptr %p, i32 1
18+
store i32 %v, ptr %len, align 1
19+
ret void
20+
}
21+
22+
define void @store_b32_basealign2_offset3(ptr align 2 %p, i32 %v) {
23+
; CHECK-LABEL: store_b32_basealign2_offset3:
24+
; CHECK: # %bb.0: # %entry
25+
; CHECK-NEXT: srli a2, a1, 24
26+
; CHECK-NEXT: srli a3, a1, 16
27+
; CHECK-NEXT: srli a4, a1, 8
28+
; CHECK-NEXT: sb a1, 3(a0)
29+
; CHECK-NEXT: sb a4, 4(a0)
30+
; CHECK-NEXT: sb a3, 5(a0)
31+
; CHECK-NEXT: sb a2, 6(a0)
32+
; CHECK-NEXT: ret
33+
entry:
34+
%len = getelementptr inbounds nuw i8, ptr %p, i32 3
35+
store i32 %v, ptr %len, align 1
36+
ret void
37+
}
38+
39+
define void @store_b64_basealign4_offset1(ptr align 4 %p) {
40+
; CHECK-LABEL: store_b64_basealign4_offset1:
41+
; CHECK: # %bb.0: # %entry
42+
; CHECK-NEXT: sb zero, 5(a0)
43+
; CHECK-NEXT: sb zero, 6(a0)
44+
; CHECK-NEXT: sb zero, 7(a0)
45+
; CHECK-NEXT: sb zero, 8(a0)
46+
; CHECK-NEXT: sb zero, 1(a0)
47+
; CHECK-NEXT: sb zero, 2(a0)
48+
; CHECK-NEXT: sb zero, 3(a0)
49+
; CHECK-NEXT: sb zero, 4(a0)
50+
; CHECK-NEXT: ret
51+
entry:
52+
%len = getelementptr inbounds nuw i8, ptr %p, i32 1
53+
store i64 0, ptr %len, align 1
54+
ret void
55+
}
56+
57+
define void @store_b64_basealign4_offset2(ptr align 4 %p) {
58+
; CHECK-LABEL: store_b64_basealign4_offset2:
59+
; CHECK: # %bb.0: # %entry
60+
; CHECK-NEXT: sh zero, 2(a0)
61+
; CHECK-NEXT: sh zero, 4(a0)
62+
; CHECK-NEXT: sh zero, 6(a0)
63+
; CHECK-NEXT: sh zero, 8(a0)
64+
; CHECK-NEXT: ret
65+
entry:
66+
%len = getelementptr inbounds nuw i8, ptr %p, i32 2
67+
store i64 0, ptr %len, align 2
68+
ret void
69+
}
70+
71+
define i32 @load_b32_base_align2_offset1(ptr align 2 %p) {
72+
; CHECK-LABEL: load_b32_base_align2_offset1:
73+
; CHECK: # %bb.0: # %entry
74+
; CHECK-NEXT: lbu a1, 2(a0)
75+
; CHECK-NEXT: lbu a2, 1(a0)
76+
; CHECK-NEXT: lbu a3, 3(a0)
77+
; CHECK-NEXT: lbu a0, 4(a0)
78+
; CHECK-NEXT: slli a1, a1, 8
79+
; CHECK-NEXT: or a1, a1, a2
80+
; CHECK-NEXT: slli a3, a3, 16
81+
; CHECK-NEXT: slli a0, a0, 24
82+
; CHECK-NEXT: or a0, a0, a3
83+
; CHECK-NEXT: or a0, a0, a1
84+
; CHECK-NEXT: ret
85+
entry:
86+
%len = getelementptr inbounds nuw i8, ptr %p, i32 1
87+
%v = load i32, ptr %len, align 1
88+
ret i32 %v
89+
}
90+
91+
define i32 @load_b32_base_align2_offset3(ptr align 2 %p) {
92+
; CHECK-LABEL: load_b32_base_align2_offset3:
93+
; CHECK: # %bb.0: # %entry
94+
; CHECK-NEXT: lbu a1, 4(a0)
95+
; CHECK-NEXT: lbu a2, 3(a0)
96+
; CHECK-NEXT: lbu a3, 5(a0)
97+
; CHECK-NEXT: lbu a0, 6(a0)
98+
; CHECK-NEXT: slli a1, a1, 8
99+
; CHECK-NEXT: or a1, a1, a2
100+
; CHECK-NEXT: slli a3, a3, 16
101+
; CHECK-NEXT: slli a0, a0, 24
102+
; CHECK-NEXT: or a0, a0, a3
103+
; CHECK-NEXT: or a0, a0, a1
104+
; CHECK-NEXT: ret
105+
entry:
106+
%len = getelementptr inbounds nuw i8, ptr %p, i32 3
107+
%v = load i32, ptr %len, align 1
108+
ret i32 %v
109+
}
110+
111+
define i64 @load_b64_base_align2_offset1(ptr align 4 %p) {
112+
; CHECK-LABEL: load_b64_base_align2_offset1:
113+
; CHECK: # %bb.0: # %entry
114+
; CHECK-NEXT: lbu a1, 3(a0)
115+
; CHECK-NEXT: lbu a2, 4(a0)
116+
; CHECK-NEXT: lbu a3, 5(a0)
117+
; CHECK-NEXT: lbu a4, 2(a0)
118+
; CHECK-NEXT: slli a1, a1, 8
119+
; CHECK-NEXT: slli a2, a2, 16
120+
; CHECK-NEXT: slli a3, a3, 24
121+
; CHECK-NEXT: or a1, a1, a4
122+
; CHECK-NEXT: or a2, a3, a2
123+
; CHECK-NEXT: lbu a3, 7(a0)
124+
; CHECK-NEXT: lbu a4, 6(a0)
125+
; CHECK-NEXT: lbu a5, 8(a0)
126+
; CHECK-NEXT: lbu a0, 9(a0)
127+
; CHECK-NEXT: slli a3, a3, 8
128+
; CHECK-NEXT: or a3, a3, a4
129+
; CHECK-NEXT: slli a5, a5, 16
130+
; CHECK-NEXT: slli a0, a0, 24
131+
; CHECK-NEXT: or a5, a0, a5
132+
; CHECK-NEXT: or a0, a2, a1
133+
; CHECK-NEXT: or a1, a5, a3
134+
; CHECK-NEXT: ret
135+
entry:
136+
%len = getelementptr inbounds nuw i8, ptr %p, i32 2
137+
%v = load i64, ptr %len, align 1
138+
ret i64 %v
139+
}
140+
141+
define i64 @load_b64_base_align2_offset2(ptr align 4 %p) {
142+
; CHECK-LABEL: load_b64_base_align2_offset2:
143+
; CHECK: # %bb.0: # %entry
144+
; CHECK-NEXT: lhu a1, 4(a0)
145+
; CHECK-NEXT: lhu a2, 2(a0)
146+
; CHECK-NEXT: lhu a3, 8(a0)
147+
; CHECK-NEXT: lhu a4, 6(a0)
148+
; CHECK-NEXT: slli a0, a1, 16
149+
; CHECK-NEXT: or a0, a0, a2
150+
; CHECK-NEXT: slli a1, a3, 16
151+
; CHECK-NEXT: or a1, a1, a4
152+
; CHECK-NEXT: ret
153+
entry:
154+
%len = getelementptr inbounds nuw i8, ptr %p, i32 2
155+
%v = load i64, ptr %len, align 2
156+
ret i64 %v
157+
}

0 commit comments

Comments
 (0)