xref: /llvm-project/llvm/test/CodeGen/RISCV/add_shl_constant.ll (revision b359c84f3ad68457048740b3d259258d3722eeed)
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
4
5define 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
12;
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
22}
23
24define 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
34;
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
43entry:
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
53}
54
55define 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
68;
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
80entry:
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
90}
91
92define 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
107;
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
121entry:
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
133}
134
135define 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
153;
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
170entry:
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
182}
183
184define 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
192;
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
202}
203
204define 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
212;
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
222}
223
224define 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
232;
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
242}
243
244define 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
256}
257