1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2 ; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefixes=RV32,NO-ZBA %s
3 ; RUN: llc -mtriple=riscv32 -mattr=+zba < %s | FileCheck -check-prefixes=RV32,ZBA %s
5 define i32 @add_shl_oneUse(i32 %x, i32 %y) nounwind {
6 ; NO-ZBA-LABEL: add_shl_oneUse:
8 ; NO-ZBA-NEXT: slli a0, a0, 3
9 ; NO-ZBA-NEXT: add a0, a0, a1
10 ; NO-ZBA-NEXT: addi a0, a0, 984
13 ; ZBA-LABEL: add_shl_oneUse:
15 ; ZBA-NEXT: addi a0, a0, 123
16 ; ZBA-NEXT: sh3add a0, a0, a1
18 %add.0 = add i32 %x, 123
19 %shl = shl i32 %add.0, 3
20 %add.1 = add i32 %shl, %y
24 define void @add_shl_moreOneUse_inStore(ptr %array1, i32 %a, i32 %b) {
25 ; NO-ZBA-LABEL: add_shl_moreOneUse_inStore:
26 ; NO-ZBA: # %bb.0: # %entry
27 ; NO-ZBA-NEXT: addi a3, a1, 5
28 ; NO-ZBA-NEXT: slli a1, a1, 2
29 ; NO-ZBA-NEXT: add a0, a0, a1
30 ; NO-ZBA-NEXT: sw a2, 20(a0)
31 ; NO-ZBA-NEXT: sw a2, 24(a0)
32 ; NO-ZBA-NEXT: sw a3, 140(a0)
35 ; ZBA-LABEL: add_shl_moreOneUse_inStore:
36 ; ZBA: # %bb.0: # %entry
37 ; ZBA-NEXT: addi a3, a1, 5
38 ; ZBA-NEXT: sh2add a0, a1, a0
39 ; ZBA-NEXT: sw a2, 20(a0)
40 ; ZBA-NEXT: sw a2, 24(a0)
41 ; ZBA-NEXT: sw a3, 140(a0)
44 %add = add nsw i32 %a, 5
45 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add
46 store i32 %b, ptr %arrayidx
47 %0 = getelementptr i32, ptr %array1, i32 %a
48 %arrayidx3 = getelementptr i8, ptr %0, i32 24
49 store i32 %b, ptr %arrayidx3
50 %arrayidx5 = getelementptr i8, ptr %0, i32 140
51 store i32 %add, ptr %arrayidx5
55 define void @add_shl_moreOneUse_inStore_addexceedsign12(ptr %array1, i32 %a, i32 %b) {
56 ; NO-ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:
57 ; NO-ZBA: # %bb.0: # %entry
58 ; NO-ZBA-NEXT: addi a3, a1, 2047
59 ; NO-ZBA-NEXT: lui a4, 2
60 ; NO-ZBA-NEXT: slli a1, a1, 2
61 ; NO-ZBA-NEXT: addi a3, a3, 1
62 ; NO-ZBA-NEXT: add a0, a0, a1
63 ; NO-ZBA-NEXT: add a0, a0, a4
64 ; NO-ZBA-NEXT: sw a2, 0(a0)
65 ; NO-ZBA-NEXT: sw a3, 4(a0)
66 ; NO-ZBA-NEXT: sw a2, 120(a0)
69 ; ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:
70 ; ZBA: # %bb.0: # %entry
71 ; ZBA-NEXT: addi a3, a1, 2047
73 ; ZBA-NEXT: sh2add a0, a1, a0
74 ; ZBA-NEXT: addi a3, a3, 1
75 ; ZBA-NEXT: add a0, a0, a4
76 ; ZBA-NEXT: sw a2, 0(a0)
77 ; ZBA-NEXT: sw a3, 4(a0)
78 ; ZBA-NEXT: sw a2, 120(a0)
81 %add = add nsw i32 %a, 2048
82 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add
83 store i32 %b, ptr %arrayidx
84 %0 = getelementptr i32, ptr %array1, i32 %a
85 %arrayidx2 = getelementptr i8, ptr %0, i32 8196
86 store i32 %add, ptr %arrayidx2
87 %arrayidx4 = getelementptr i8, ptr %0, i32 8312
88 store i32 %b, ptr %arrayidx4
92 define void @add_shl_moreOneUse_inSelect(ptr %array1, i32 %a, i32 %b, i32 %x) {
93 ; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect:
94 ; NO-ZBA: # %bb.0: # %entry
95 ; NO-ZBA-NEXT: addi a4, a1, 5
96 ; NO-ZBA-NEXT: mv a5, a4
97 ; NO-ZBA-NEXT: bgtz a3, .LBB3_2
98 ; NO-ZBA-NEXT: # %bb.1: # %entry
99 ; NO-ZBA-NEXT: mv a5, a2
100 ; NO-ZBA-NEXT: .LBB3_2: # %entry
101 ; NO-ZBA-NEXT: slli a1, a1, 2
102 ; NO-ZBA-NEXT: add a0, a0, a1
103 ; NO-ZBA-NEXT: sw a5, 20(a0)
104 ; NO-ZBA-NEXT: sw a5, 24(a0)
105 ; NO-ZBA-NEXT: sw a4, 140(a0)
108 ; ZBA-LABEL: add_shl_moreOneUse_inSelect:
109 ; ZBA: # %bb.0: # %entry
110 ; ZBA-NEXT: addi a4, a1, 5
111 ; ZBA-NEXT: mv a5, a4
112 ; ZBA-NEXT: bgtz a3, .LBB3_2
113 ; ZBA-NEXT: # %bb.1: # %entry
114 ; ZBA-NEXT: mv a5, a2
115 ; ZBA-NEXT: .LBB3_2: # %entry
116 ; ZBA-NEXT: sh2add a0, a1, a0
117 ; ZBA-NEXT: sw a5, 20(a0)
118 ; ZBA-NEXT: sw a5, 24(a0)
119 ; ZBA-NEXT: sw a4, 140(a0)
122 %add = add nsw i32 %a, 5
123 %cmp = icmp sgt i32 %x, 0
124 %cond = select i1 %cmp, i32 %add, i32 %b
125 %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add
126 store i32 %cond, ptr %arrayidx
127 %0 = getelementptr i32, ptr %array1, i32 %a
128 %arrayidx2 = getelementptr i32, ptr %0, i32 6
129 store i32 %cond, ptr %arrayidx2
130 %arrayidx4 = getelementptr i32, ptr %0, i32 35
131 store i32 %add, ptr %arrayidx4
135 define void @add_shl_moreOneUse_inSelect_addexceedsign12(ptr %array1, i32 %a, i32 %b, i32 %x) {
136 ; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12:
137 ; NO-ZBA: # %bb.0: # %entry
138 ; NO-ZBA-NEXT: addi a4, a1, 2047
139 ; NO-ZBA-NEXT: addi a4, a4, 1
140 ; NO-ZBA-NEXT: mv a5, a4
141 ; NO-ZBA-NEXT: bgtz a3, .LBB4_2
142 ; NO-ZBA-NEXT: # %bb.1: # %entry
143 ; NO-ZBA-NEXT: mv a5, a2
144 ; NO-ZBA-NEXT: .LBB4_2: # %entry
145 ; NO-ZBA-NEXT: lui a2, 2
146 ; NO-ZBA-NEXT: slli a1, a1, 2
147 ; NO-ZBA-NEXT: add a0, a0, a1
148 ; NO-ZBA-NEXT: add a0, a0, a2
149 ; NO-ZBA-NEXT: sw a5, 0(a0)
150 ; NO-ZBA-NEXT: sw a5, 4(a0)
151 ; NO-ZBA-NEXT: sw a4, 120(a0)
154 ; ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12:
155 ; ZBA: # %bb.0: # %entry
156 ; ZBA-NEXT: addi a4, a1, 2047
157 ; ZBA-NEXT: addi a4, a4, 1
158 ; ZBA-NEXT: mv a5, a4
159 ; ZBA-NEXT: bgtz a3, .LBB4_2
160 ; ZBA-NEXT: # %bb.1: # %entry
161 ; ZBA-NEXT: mv a5, a2
162 ; ZBA-NEXT: .LBB4_2: # %entry
163 ; ZBA-NEXT: lui a2, 2
164 ; ZBA-NEXT: sh2add a0, a1, a0
165 ; ZBA-NEXT: add a0, a0, a2
166 ; ZBA-NEXT: sw a5, 0(a0)
167 ; ZBA-NEXT: sw a5, 4(a0)
168 ; ZBA-NEXT: sw a4, 120(a0)
171 %add = add nsw i32 %a, 2048
172 %cmp = icmp sgt i32 %x, 0
173 %spec.select = select i1 %cmp, i32 %add, i32 %b
174 %0 = getelementptr inbounds i32, ptr %array1, i32 %add
175 store i32 %spec.select, ptr %0, align 4
176 %1 = getelementptr i32, ptr %array1, i32 %a
177 %arrayidx4 = getelementptr i8, ptr %1, i32 8196
178 store i32 %spec.select, ptr %arrayidx4
179 %arrayidx6 = getelementptr i8, ptr %1, i32 8312
180 store i32 %add, ptr %arrayidx6
184 define i32 @add_shl_moreOneUse_sh1add(i32 %x) {
185 ; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add:
187 ; NO-ZBA-NEXT: ori a1, a0, 1
188 ; NO-ZBA-NEXT: slli a0, a0, 1
189 ; NO-ZBA-NEXT: ori a0, a0, 2
190 ; NO-ZBA-NEXT: add a0, a0, a1
193 ; ZBA-LABEL: add_shl_moreOneUse_sh1add:
195 ; ZBA-NEXT: ori a0, a0, 1
196 ; ZBA-NEXT: sh1add a0, a0, a0
199 %mul = shl i32 %or, 1
200 %add = add i32 %mul, %or
204 define i32 @add_shl_moreOneUse_sh2add(i32 %x) {
205 ; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add:
207 ; NO-ZBA-NEXT: ori a1, a0, 1
208 ; NO-ZBA-NEXT: slli a0, a0, 2
209 ; NO-ZBA-NEXT: ori a0, a0, 4
210 ; NO-ZBA-NEXT: add a0, a0, a1
213 ; ZBA-LABEL: add_shl_moreOneUse_sh2add:
215 ; ZBA-NEXT: ori a0, a0, 1
216 ; ZBA-NEXT: sh2add a0, a0, a0
219 %mul = shl i32 %or, 2
220 %add = add i32 %mul, %or
224 define i32 @add_shl_moreOneUse_sh3add(i32 %x) {
225 ; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add:
227 ; NO-ZBA-NEXT: ori a1, a0, 1
228 ; NO-ZBA-NEXT: slli a0, a0, 3
229 ; NO-ZBA-NEXT: ori a0, a0, 8
230 ; NO-ZBA-NEXT: add a0, a0, a1
233 ; ZBA-LABEL: add_shl_moreOneUse_sh3add:
235 ; ZBA-NEXT: ori a0, a0, 1
236 ; ZBA-NEXT: sh3add a0, a0, a0
239 %mul = shl i32 %or, 3
240 %add = add i32 %mul, %or
244 define i32 @add_shl_moreOneUse_sh4add(i32 %x) {
245 ; RV32-LABEL: add_shl_moreOneUse_sh4add:
247 ; RV32-NEXT: ori a1, a0, 1
248 ; RV32-NEXT: slli a0, a0, 4
249 ; RV32-NEXT: ori a0, a0, 16
250 ; RV32-NEXT: add a0, a0, a1
253 %mul = shl i32 %or, 4
254 %add = add i32 %mul, %or