Skip to content

Commit 7a2b9a9

Browse files
committed
[RISCV] Don't commute with shift if it would break sh{1,2,3}add pattern
Stacked on #119526 This fixes a regression from #101294 by checking if we might be clobbering a sh{1,2,3}add pattern. Only do this is the underlying add isn't going to be folded away into an address offset.
1 parent a2940db commit 7a2b9a9

File tree

3 files changed

+87
-43
lines changed

3 files changed

+87
-43
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18255,6 +18255,14 @@ bool RISCVTargetLowering::isDesirableToCommuteWithShift(
1825518255

1825618256
auto *C1 = dyn_cast<ConstantSDNode>(N0->getOperand(1));
1825718257
auto *C2 = dyn_cast<ConstantSDNode>(N->getOperand(1));
18258+
18259+
// Bail if we might break a sh{1,2,3}add pattern.
18260+
if (Subtarget.hasStdExtZba() && C2->getZExtValue() >= 1 &&
18261+
C2->getZExtValue() <= 3 && N->hasOneUse() &&
18262+
N->use_begin()->getOpcode() == ISD::ADD &&
18263+
!isUsedByLdSt(*N->use_begin(), nullptr))
18264+
return false;
18265+
1825818266
if (C1 && C2) {
1825918267
const APInt &C1Int = C1->getAPIntValue();
1826018268
APInt ShiftedC1Int = C1Int << C2->getAPIntValue();

llvm/test/CodeGen/RISCV/add_sext_shl_constant.ll

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -261,41 +261,59 @@ entry:
261261
}
262262

263263
define i64 @add_shl_moreOneUse_sh1add(i64 %x) {
264-
; RV64-LABEL: add_shl_moreOneUse_sh1add:
265-
; RV64: # %bb.0:
266-
; RV64-NEXT: ori a1, a0, 1
267-
; RV64-NEXT: slli a0, a0, 1
268-
; RV64-NEXT: ori a0, a0, 2
269-
; RV64-NEXT: add a0, a0, a1
270-
; RV64-NEXT: ret
264+
; NO-ZBA-LABEL: add_shl_moreOneUse_sh1add:
265+
; NO-ZBA: # %bb.0:
266+
; NO-ZBA-NEXT: ori a1, a0, 1
267+
; NO-ZBA-NEXT: slli a0, a0, 1
268+
; NO-ZBA-NEXT: ori a0, a0, 2
269+
; NO-ZBA-NEXT: add a0, a0, a1
270+
; NO-ZBA-NEXT: ret
271+
;
272+
; ZBA-LABEL: add_shl_moreOneUse_sh1add:
273+
; ZBA: # %bb.0:
274+
; ZBA-NEXT: ori a0, a0, 1
275+
; ZBA-NEXT: sh1add a0, a0, a0
276+
; ZBA-NEXT: ret
271277
%or = or i64 %x, 1
272278
%mul = shl i64 %or, 1
273279
%add = add i64 %mul, %or
274280
ret i64 %add
275281
}
276282

277283
define i64 @add_shl_moreOneUse_sh2add(i64 %x) {
278-
; RV64-LABEL: add_shl_moreOneUse_sh2add:
279-
; RV64: # %bb.0:
280-
; RV64-NEXT: ori a1, a0, 1
281-
; RV64-NEXT: slli a0, a0, 2
282-
; RV64-NEXT: ori a0, a0, 4
283-
; RV64-NEXT: add a0, a0, a1
284-
; RV64-NEXT: ret
284+
; NO-ZBA-LABEL: add_shl_moreOneUse_sh2add:
285+
; NO-ZBA: # %bb.0:
286+
; NO-ZBA-NEXT: ori a1, a0, 1
287+
; NO-ZBA-NEXT: slli a0, a0, 2
288+
; NO-ZBA-NEXT: ori a0, a0, 4
289+
; NO-ZBA-NEXT: add a0, a0, a1
290+
; NO-ZBA-NEXT: ret
291+
;
292+
; ZBA-LABEL: add_shl_moreOneUse_sh2add:
293+
; ZBA: # %bb.0:
294+
; ZBA-NEXT: ori a0, a0, 1
295+
; ZBA-NEXT: sh2add a0, a0, a0
296+
; ZBA-NEXT: ret
285297
%or = or i64 %x, 1
286298
%mul = shl i64 %or, 2
287299
%add = add i64 %mul, %or
288300
ret i64 %add
289301
}
290302

291303
define i64 @add_shl_moreOneUse_sh3add(i64 %x) {
292-
; RV64-LABEL: add_shl_moreOneUse_sh3add:
293-
; RV64: # %bb.0:
294-
; RV64-NEXT: ori a1, a0, 1
295-
; RV64-NEXT: slli a0, a0, 3
296-
; RV64-NEXT: ori a0, a0, 8
297-
; RV64-NEXT: add a0, a0, a1
298-
; RV64-NEXT: ret
304+
; NO-ZBA-LABEL: add_shl_moreOneUse_sh3add:
305+
; NO-ZBA: # %bb.0:
306+
; NO-ZBA-NEXT: ori a1, a0, 1
307+
; NO-ZBA-NEXT: slli a0, a0, 3
308+
; NO-ZBA-NEXT: ori a0, a0, 8
309+
; NO-ZBA-NEXT: add a0, a0, a1
310+
; NO-ZBA-NEXT: ret
311+
;
312+
; ZBA-LABEL: add_shl_moreOneUse_sh3add:
313+
; ZBA: # %bb.0:
314+
; ZBA-NEXT: ori a0, a0, 1
315+
; ZBA-NEXT: sh3add a0, a0, a0
316+
; ZBA-NEXT: ret
299317
%or = or i64 %x, 1
300318
%mul = shl i64 %or, 3
301319
%add = add i64 %mul, %or

llvm/test/CodeGen/RISCV/add_shl_constant.ll

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ define i32 @add_shl_oneUse(i32 %x, i32 %y) nounwind {
1212
;
1313
; ZBA-LABEL: add_shl_oneUse:
1414
; ZBA: # %bb.0:
15+
; ZBA-NEXT: addi a0, a0, 123
1516
; ZBA-NEXT: sh3add a0, a0, a1
16-
; ZBA-NEXT: addi a0, a0, 984
1717
; ZBA-NEXT: ret
1818
%add.0 = add i32 %x, 123
1919
%shl = shl i32 %add.0, 3
@@ -182,41 +182,59 @@ entry:
182182
}
183183

184184
define i32 @add_shl_moreOneUse_sh1add(i32 %x) {
185-
; RV32-LABEL: add_shl_moreOneUse_sh1add:
186-
; RV32: # %bb.0:
187-
; RV32-NEXT: ori a1, a0, 1
188-
; RV32-NEXT: slli a0, a0, 1
189-
; RV32-NEXT: ori a0, a0, 2
190-
; RV32-NEXT: add a0, a0, a1
191-
; RV32-NEXT: ret
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
192198
%or = or i32 %x, 1
193199
%mul = shl i32 %or, 1
194200
%add = add i32 %mul, %or
195201
ret i32 %add
196202
}
197203

198204
define i32 @add_shl_moreOneUse_sh2add(i32 %x) {
199-
; RV32-LABEL: add_shl_moreOneUse_sh2add:
200-
; RV32: # %bb.0:
201-
; RV32-NEXT: ori a1, a0, 1
202-
; RV32-NEXT: slli a0, a0, 2
203-
; RV32-NEXT: ori a0, a0, 4
204-
; RV32-NEXT: add a0, a0, a1
205-
; RV32-NEXT: ret
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
206218
%or = or i32 %x, 1
207219
%mul = shl i32 %or, 2
208220
%add = add i32 %mul, %or
209221
ret i32 %add
210222
}
211223

212224
define i32 @add_shl_moreOneUse_sh3add(i32 %x) {
213-
; RV32-LABEL: add_shl_moreOneUse_sh3add:
214-
; RV32: # %bb.0:
215-
; RV32-NEXT: ori a1, a0, 1
216-
; RV32-NEXT: slli a0, a0, 3
217-
; RV32-NEXT: ori a0, a0, 8
218-
; RV32-NEXT: add a0, a0, a1
219-
; RV32-NEXT: ret
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
220238
%or = or i32 %x, 1
221239
%mul = shl i32 %or, 3
222240
%add = add i32 %mul, %or

0 commit comments

Comments
 (0)