[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / RISCV / add_shl_constant.ll
bloba4da9e26836488566a9a1ddaad8861eee66e6ca6
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:
7 ; NO-ZBA:       # %bb.0:
8 ; NO-ZBA-NEXT:    slli a0, a0, 3
9 ; NO-ZBA-NEXT:    add a0, a0, a1
10 ; NO-ZBA-NEXT:    addi a0, a0, 984
11 ; NO-ZBA-NEXT:    ret
13 ; ZBA-LABEL: add_shl_oneUse:
14 ; ZBA:       # %bb.0:
15 ; ZBA-NEXT:    addi a0, a0, 123
16 ; ZBA-NEXT:    sh3add a0, a0, a1
17 ; ZBA-NEXT:    ret
18   %add.0 = add i32 %x, 123
19   %shl = shl i32 %add.0, 3
20   %add.1 = add i32 %shl, %y
21   ret i32 %add.1
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)
33 ; NO-ZBA-NEXT:    ret
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)
42 ; ZBA-NEXT:    ret
43 entry:
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
52   ret void
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)
67 ; NO-ZBA-NEXT:    ret
69 ; ZBA-LABEL: add_shl_moreOneUse_inStore_addexceedsign12:
70 ; ZBA:       # %bb.0: # %entry
71 ; ZBA-NEXT:    addi a3, a1, 2047
72 ; ZBA-NEXT:    lui a4, 2
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)
79 ; ZBA-NEXT:    ret
80 entry:
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
89   ret void
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)
106 ; NO-ZBA-NEXT:    ret
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)
120 ; ZBA-NEXT:    ret
121 entry:
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
132   ret void
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)
152 ; NO-ZBA-NEXT:    ret
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)
169 ; ZBA-NEXT:    ret
170 entry:
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
181   ret void
184 define i32 @add_shl_moreOneUse_sh1add(i32 %x) {
185 ; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add:
186 ; NO-ZBA:       # %bb.0:
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
191 ; NO-ZBA-NEXT:    ret
193 ; ZBA-LABEL: add_shl_moreOneUse_sh1add:
194 ; ZBA:       # %bb.0:
195 ; ZBA-NEXT:    ori a0, a0, 1
196 ; ZBA-NEXT:    sh1add a0, a0, a0
197 ; ZBA-NEXT:    ret
198   %or = or i32 %x, 1
199   %mul = shl i32 %or, 1
200   %add = add i32 %mul, %or
201   ret i32 %add
204 define i32 @add_shl_moreOneUse_sh2add(i32 %x) {
205 ; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add:
206 ; NO-ZBA:       # %bb.0:
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
211 ; NO-ZBA-NEXT:    ret
213 ; ZBA-LABEL: add_shl_moreOneUse_sh2add:
214 ; ZBA:       # %bb.0:
215 ; ZBA-NEXT:    ori a0, a0, 1
216 ; ZBA-NEXT:    sh2add a0, a0, a0
217 ; ZBA-NEXT:    ret
218   %or = or i32 %x, 1
219   %mul = shl i32 %or, 2
220   %add = add i32 %mul, %or
221   ret i32 %add
224 define i32 @add_shl_moreOneUse_sh3add(i32 %x) {
225 ; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add:
226 ; NO-ZBA:       # %bb.0:
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
231 ; NO-ZBA-NEXT:    ret
233 ; ZBA-LABEL: add_shl_moreOneUse_sh3add:
234 ; ZBA:       # %bb.0:
235 ; ZBA-NEXT:    ori a0, a0, 1
236 ; ZBA-NEXT:    sh3add a0, a0, a0
237 ; ZBA-NEXT:    ret
238   %or = or i32 %x, 1
239   %mul = shl i32 %or, 3
240   %add = add i32 %mul, %or
241   ret i32 %add
244 define i32 @add_shl_moreOneUse_sh4add(i32 %x) {
245 ; RV32-LABEL: add_shl_moreOneUse_sh4add:
246 ; RV32:       # %bb.0:
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
251 ; RV32-NEXT:    ret
252   %or = or i32 %x, 1
253   %mul = shl i32 %or, 4
254   %add = add i32 %mul, %or
255   ret i32 %add