xref: /llvm-project/llvm/test/CodeGen/RISCV/add_shl_constant.ll (revision b359c84f3ad68457048740b3d259258d3722eeed)
13083acc2SLiqinWeng; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2*b359c84fSLuke Lau; RUN: llc -mtriple=riscv32  < %s | FileCheck -check-prefixes=RV32,NO-ZBA %s
3*b359c84fSLuke Lau; RUN: llc -mtriple=riscv32 -mattr=+zba  < %s | FileCheck -check-prefixes=RV32,ZBA %s
43083acc2SLiqinWeng
53083acc2SLiqinWengdefine i32 @add_shl_oneUse(i32 %x, i32 %y) nounwind {
6*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_oneUse:
7*b359c84fSLuke Lau; NO-ZBA:       # %bb.0:
8*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a0, a0, 3
9*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
10*b359c84fSLuke Lau; NO-ZBA-NEXT:    addi a0, a0, 984
11*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
12*b359c84fSLuke Lau;
13*b359c84fSLuke Lau; ZBA-LABEL: add_shl_oneUse:
14*b359c84fSLuke Lau; ZBA:       # %bb.0:
15*b359c84fSLuke Lau; ZBA-NEXT:    addi a0, a0, 123
16*b359c84fSLuke Lau; ZBA-NEXT:    sh3add a0, a0, a1
17*b359c84fSLuke Lau; ZBA-NEXT:    ret
183083acc2SLiqinWeng  %add.0 = add i32 %x, 123
193083acc2SLiqinWeng  %shl = shl i32 %add.0, 3
203083acc2SLiqinWeng  %add.1 = add i32 %shl, %y
213083acc2SLiqinWeng  ret i32 %add.1
223083acc2SLiqinWeng}
233083acc2SLiqinWeng
243083acc2SLiqinWengdefine void @add_shl_moreOneUse_inStore(ptr %array1, i32 %a, i32 %b)  {
25*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inStore:
26*b359c84fSLuke Lau; NO-ZBA:       # %bb.0: # %entry
27*b359c84fSLuke Lau; NO-ZBA-NEXT:    addi a3, a1, 5
28*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a1, a1, 2
29*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
30*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a2, 20(a0)
31*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a2, 24(a0)
32*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a3, 140(a0)
33*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
34*b359c84fSLuke Lau;
35*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inStore:
36*b359c84fSLuke Lau; ZBA:       # %bb.0: # %entry
37*b359c84fSLuke Lau; ZBA-NEXT:    addi a3, a1, 5
38*b359c84fSLuke Lau; ZBA-NEXT:    sh2add a0, a1, a0
39*b359c84fSLuke Lau; ZBA-NEXT:    sw a2, 20(a0)
40*b359c84fSLuke Lau; ZBA-NEXT:    sw a2, 24(a0)
41*b359c84fSLuke Lau; ZBA-NEXT:    sw a3, 140(a0)
42*b359c84fSLuke Lau; ZBA-NEXT:    ret
433083acc2SLiqinWengentry:
443083acc2SLiqinWeng  %add = add nsw i32 %a, 5
453083acc2SLiqinWeng  %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add
463083acc2SLiqinWeng  store i32 %b, ptr %arrayidx
473083acc2SLiqinWeng  %0 = getelementptr i32, ptr %array1, i32 %a
483083acc2SLiqinWeng  %arrayidx3 = getelementptr i8, ptr %0, i32 24
493083acc2SLiqinWeng  store i32 %b, ptr %arrayidx3
503083acc2SLiqinWeng  %arrayidx5 = getelementptr i8, ptr %0, i32 140
513083acc2SLiqinWeng  store i32 %add, ptr %arrayidx5
523083acc2SLiqinWeng  ret void
533083acc2SLiqinWeng}
543083acc2SLiqinWeng
553083acc2SLiqinWengdefine void @add_shl_moreOneUse_inStore_addexceedsign12(ptr %array1, i32 %a, i32 %b)  {
56*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:
57*b359c84fSLuke Lau; NO-ZBA:       # %bb.0: # %entry
58*b359c84fSLuke Lau; NO-ZBA-NEXT:    addi a3, a1, 2047
59*b359c84fSLuke Lau; NO-ZBA-NEXT:    lui a4, 2
60*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a1, a1, 2
61*b359c84fSLuke Lau; NO-ZBA-NEXT:    addi a3, a3, 1
62*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
63*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a4
64*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a2, 0(a0)
65*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a3, 4(a0)
66*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a2, 120(a0)
67*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
68*b359c84fSLuke Lau;
69*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:
70*b359c84fSLuke Lau; ZBA:       # %bb.0: # %entry
71*b359c84fSLuke Lau; ZBA-NEXT:    addi a3, a1, 2047
72*b359c84fSLuke Lau; ZBA-NEXT:    lui a4, 2
73*b359c84fSLuke Lau; ZBA-NEXT:    sh2add a0, a1, a0
74*b359c84fSLuke Lau; ZBA-NEXT:    addi a3, a3, 1
75*b359c84fSLuke Lau; ZBA-NEXT:    add a0, a0, a4
76*b359c84fSLuke Lau; ZBA-NEXT:    sw a2, 0(a0)
77*b359c84fSLuke Lau; ZBA-NEXT:    sw a3, 4(a0)
78*b359c84fSLuke Lau; ZBA-NEXT:    sw a2, 120(a0)
79*b359c84fSLuke Lau; ZBA-NEXT:    ret
803083acc2SLiqinWengentry:
813083acc2SLiqinWeng  %add = add nsw i32 %a, 2048
823083acc2SLiqinWeng  %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add
833083acc2SLiqinWeng  store i32 %b, ptr %arrayidx
843083acc2SLiqinWeng  %0 = getelementptr i32, ptr %array1, i32 %a
853083acc2SLiqinWeng  %arrayidx2 = getelementptr i8, ptr %0, i32 8196
863083acc2SLiqinWeng  store i32 %add, ptr %arrayidx2
873083acc2SLiqinWeng  %arrayidx4 = getelementptr i8, ptr %0, i32 8312
883083acc2SLiqinWeng  store i32 %b, ptr %arrayidx4
893083acc2SLiqinWeng  ret void
903083acc2SLiqinWeng}
913083acc2SLiqinWeng
923083acc2SLiqinWengdefine void @add_shl_moreOneUse_inSelect(ptr %array1, i32 %a, i32 %b, i32 %x) {
93*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect:
94*b359c84fSLuke Lau; NO-ZBA:       # %bb.0: # %entry
95*b359c84fSLuke Lau; NO-ZBA-NEXT:    addi a4, a1, 5
96*b359c84fSLuke Lau; NO-ZBA-NEXT:    mv a5, a4
97*b359c84fSLuke Lau; NO-ZBA-NEXT:    bgtz a3, .LBB3_2
98*b359c84fSLuke Lau; NO-ZBA-NEXT:  # %bb.1: # %entry
99*b359c84fSLuke Lau; NO-ZBA-NEXT:    mv a5, a2
100*b359c84fSLuke Lau; NO-ZBA-NEXT:  .LBB3_2: # %entry
101*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a1, a1, 2
102*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
103*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a5, 20(a0)
104*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a5, 24(a0)
105*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a4, 140(a0)
106*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
107*b359c84fSLuke Lau;
108*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inSelect:
109*b359c84fSLuke Lau; ZBA:       # %bb.0: # %entry
110*b359c84fSLuke Lau; ZBA-NEXT:    addi a4, a1, 5
111*b359c84fSLuke Lau; ZBA-NEXT:    mv a5, a4
112*b359c84fSLuke Lau; ZBA-NEXT:    bgtz a3, .LBB3_2
113*b359c84fSLuke Lau; ZBA-NEXT:  # %bb.1: # %entry
114*b359c84fSLuke Lau; ZBA-NEXT:    mv a5, a2
115*b359c84fSLuke Lau; ZBA-NEXT:  .LBB3_2: # %entry
116*b359c84fSLuke Lau; ZBA-NEXT:    sh2add a0, a1, a0
117*b359c84fSLuke Lau; ZBA-NEXT:    sw a5, 20(a0)
118*b359c84fSLuke Lau; ZBA-NEXT:    sw a5, 24(a0)
119*b359c84fSLuke Lau; ZBA-NEXT:    sw a4, 140(a0)
120*b359c84fSLuke Lau; ZBA-NEXT:    ret
1213083acc2SLiqinWengentry:
1223083acc2SLiqinWeng  %add = add nsw i32 %a, 5
1233083acc2SLiqinWeng  %cmp = icmp sgt i32 %x, 0
1243083acc2SLiqinWeng  %cond = select i1 %cmp, i32 %add, i32 %b
1253083acc2SLiqinWeng  %arrayidx = getelementptr inbounds i32, ptr %array1, i32 %add
1263083acc2SLiqinWeng  store i32 %cond, ptr %arrayidx
1273083acc2SLiqinWeng  %0 = getelementptr i32, ptr %array1, i32 %a
1283083acc2SLiqinWeng  %arrayidx2 = getelementptr i32, ptr %0, i32 6
1293083acc2SLiqinWeng  store i32 %cond, ptr %arrayidx2
1303083acc2SLiqinWeng  %arrayidx4 = getelementptr i32, ptr %0, i32 35
1313083acc2SLiqinWeng  store i32 %add, ptr %arrayidx4
1323083acc2SLiqinWeng  ret void
1333083acc2SLiqinWeng}
1343083acc2SLiqinWeng
1353083acc2SLiqinWengdefine void @add_shl_moreOneUse_inSelect_addexceedsign12(ptr %array1, i32 %a, i32 %b, i32 %x) {
136*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12:
137*b359c84fSLuke Lau; NO-ZBA:       # %bb.0: # %entry
138*b359c84fSLuke Lau; NO-ZBA-NEXT:    addi a4, a1, 2047
139*b359c84fSLuke Lau; NO-ZBA-NEXT:    addi a4, a4, 1
140*b359c84fSLuke Lau; NO-ZBA-NEXT:    mv a5, a4
141*b359c84fSLuke Lau; NO-ZBA-NEXT:    bgtz a3, .LBB4_2
142*b359c84fSLuke Lau; NO-ZBA-NEXT:  # %bb.1: # %entry
143*b359c84fSLuke Lau; NO-ZBA-NEXT:    mv a5, a2
144*b359c84fSLuke Lau; NO-ZBA-NEXT:  .LBB4_2: # %entry
145*b359c84fSLuke Lau; NO-ZBA-NEXT:    lui a2, 2
146*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a1, a1, 2
147*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
148*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a2
149*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a5, 0(a0)
150*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a5, 4(a0)
151*b359c84fSLuke Lau; NO-ZBA-NEXT:    sw a4, 120(a0)
152*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
153*b359c84fSLuke Lau;
154*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_inSelect_addexceedsign12:
155*b359c84fSLuke Lau; ZBA:       # %bb.0: # %entry
156*b359c84fSLuke Lau; ZBA-NEXT:    addi a4, a1, 2047
157*b359c84fSLuke Lau; ZBA-NEXT:    addi a4, a4, 1
158*b359c84fSLuke Lau; ZBA-NEXT:    mv a5, a4
159*b359c84fSLuke Lau; ZBA-NEXT:    bgtz a3, .LBB4_2
160*b359c84fSLuke Lau; ZBA-NEXT:  # %bb.1: # %entry
161*b359c84fSLuke Lau; ZBA-NEXT:    mv a5, a2
162*b359c84fSLuke Lau; ZBA-NEXT:  .LBB4_2: # %entry
163*b359c84fSLuke Lau; ZBA-NEXT:    lui a2, 2
164*b359c84fSLuke Lau; ZBA-NEXT:    sh2add a0, a1, a0
165*b359c84fSLuke Lau; ZBA-NEXT:    add a0, a0, a2
166*b359c84fSLuke Lau; ZBA-NEXT:    sw a5, 0(a0)
167*b359c84fSLuke Lau; ZBA-NEXT:    sw a5, 4(a0)
168*b359c84fSLuke Lau; ZBA-NEXT:    sw a4, 120(a0)
169*b359c84fSLuke Lau; ZBA-NEXT:    ret
1703083acc2SLiqinWengentry:
1713083acc2SLiqinWeng  %add = add nsw i32 %a, 2048
1723083acc2SLiqinWeng  %cmp = icmp sgt i32 %x, 0
1733083acc2SLiqinWeng  %spec.select = select i1 %cmp, i32 %add, i32 %b
1743083acc2SLiqinWeng  %0 = getelementptr inbounds i32, ptr %array1, i32 %add
1753083acc2SLiqinWeng  store i32 %spec.select, ptr %0, align 4
1763083acc2SLiqinWeng  %1 = getelementptr i32, ptr %array1, i32 %a
1773083acc2SLiqinWeng  %arrayidx4 = getelementptr i8, ptr %1, i32 8196
1783083acc2SLiqinWeng  store i32 %spec.select, ptr %arrayidx4
1793083acc2SLiqinWeng  %arrayidx6 = getelementptr i8, ptr %1, i32 8312
1803083acc2SLiqinWeng  store i32 %add, ptr %arrayidx6
1813083acc2SLiqinWeng  ret void
1823083acc2SLiqinWeng}
183*b359c84fSLuke Lau
184*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh1add(i32 %x) {
185*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add:
186*b359c84fSLuke Lau; NO-ZBA:       # %bb.0:
187*b359c84fSLuke Lau; NO-ZBA-NEXT:    ori a1, a0, 1
188*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a0, a0, 1
189*b359c84fSLuke Lau; NO-ZBA-NEXT:    ori a0, a0, 2
190*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
191*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
192*b359c84fSLuke Lau;
193*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_sh1add:
194*b359c84fSLuke Lau; ZBA:       # %bb.0:
195*b359c84fSLuke Lau; ZBA-NEXT:    ori a0, a0, 1
196*b359c84fSLuke Lau; ZBA-NEXT:    sh1add a0, a0, a0
197*b359c84fSLuke Lau; ZBA-NEXT:    ret
198*b359c84fSLuke Lau  %or = or i32 %x, 1
199*b359c84fSLuke Lau  %mul = shl i32 %or, 1
200*b359c84fSLuke Lau  %add = add i32 %mul, %or
201*b359c84fSLuke Lau  ret i32 %add
202*b359c84fSLuke Lau}
203*b359c84fSLuke Lau
204*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh2add(i32 %x) {
205*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add:
206*b359c84fSLuke Lau; NO-ZBA:       # %bb.0:
207*b359c84fSLuke Lau; NO-ZBA-NEXT:    ori a1, a0, 1
208*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a0, a0, 2
209*b359c84fSLuke Lau; NO-ZBA-NEXT:    ori a0, a0, 4
210*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
211*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
212*b359c84fSLuke Lau;
213*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_sh2add:
214*b359c84fSLuke Lau; ZBA:       # %bb.0:
215*b359c84fSLuke Lau; ZBA-NEXT:    ori a0, a0, 1
216*b359c84fSLuke Lau; ZBA-NEXT:    sh2add a0, a0, a0
217*b359c84fSLuke Lau; ZBA-NEXT:    ret
218*b359c84fSLuke Lau  %or = or i32 %x, 1
219*b359c84fSLuke Lau  %mul = shl i32 %or, 2
220*b359c84fSLuke Lau  %add = add i32 %mul, %or
221*b359c84fSLuke Lau  ret i32 %add
222*b359c84fSLuke Lau}
223*b359c84fSLuke Lau
224*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh3add(i32 %x) {
225*b359c84fSLuke Lau; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add:
226*b359c84fSLuke Lau; NO-ZBA:       # %bb.0:
227*b359c84fSLuke Lau; NO-ZBA-NEXT:    ori a1, a0, 1
228*b359c84fSLuke Lau; NO-ZBA-NEXT:    slli a0, a0, 3
229*b359c84fSLuke Lau; NO-ZBA-NEXT:    ori a0, a0, 8
230*b359c84fSLuke Lau; NO-ZBA-NEXT:    add a0, a0, a1
231*b359c84fSLuke Lau; NO-ZBA-NEXT:    ret
232*b359c84fSLuke Lau;
233*b359c84fSLuke Lau; ZBA-LABEL: add_shl_moreOneUse_sh3add:
234*b359c84fSLuke Lau; ZBA:       # %bb.0:
235*b359c84fSLuke Lau; ZBA-NEXT:    ori a0, a0, 1
236*b359c84fSLuke Lau; ZBA-NEXT:    sh3add a0, a0, a0
237*b359c84fSLuke Lau; ZBA-NEXT:    ret
238*b359c84fSLuke Lau  %or = or i32 %x, 1
239*b359c84fSLuke Lau  %mul = shl i32 %or, 3
240*b359c84fSLuke Lau  %add = add i32 %mul, %or
241*b359c84fSLuke Lau  ret i32 %add
242*b359c84fSLuke Lau}
243*b359c84fSLuke Lau
244*b359c84fSLuke Laudefine i32 @add_shl_moreOneUse_sh4add(i32 %x) {
245*b359c84fSLuke Lau; RV32-LABEL: add_shl_moreOneUse_sh4add:
246*b359c84fSLuke Lau; RV32:       # %bb.0:
247*b359c84fSLuke Lau; RV32-NEXT:    ori a1, a0, 1
248*b359c84fSLuke Lau; RV32-NEXT:    slli a0, a0, 4
249*b359c84fSLuke Lau; RV32-NEXT:    ori a0, a0, 16
250*b359c84fSLuke Lau; RV32-NEXT:    add a0, a0, a1
251*b359c84fSLuke Lau; RV32-NEXT:    ret
252*b359c84fSLuke Lau  %or = or i32 %x, 1
253*b359c84fSLuke Lau  %mul = shl i32 %or, 4
254*b359c84fSLuke Lau  %add = add i32 %mul, %or
255*b359c84fSLuke Lau  ret i32 %add
256*b359c84fSLuke Lau}
257