Skip to content

Commit 2dd52f8

Browse files
committed
[RISCV] Fold (srl (and X, 0xffff), C)->(srli (slli X, (XLen-16), (XLen-16) + C) even with Zbb/Zbp.
We can use zext.h with Zbb, but srli/slli may offer more opportunities for compression.
1 parent 8179364 commit 2dd52f8

File tree

4 files changed

+24
-23
lines changed

4 files changed

+24
-23
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -534,9 +534,6 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
534534
return;
535535
}
536536
case ISD::SRL: {
537-
// We don't need this transform if zext.h is supported.
538-
if (Subtarget->hasStdExtZbb() || Subtarget->hasStdExtZbp())
539-
break;
540537
// Optimize (srl (and X, 0xffff), C) ->
541538
// (srli (slli X, (XLen-16), (XLen-16) + C)
542539
// Taking into account that the 0xffff may have had lower bits unset by

llvm/test/CodeGen/RISCV/div-by-constant.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,8 @@ define i16 @udiv16_constant_add(i16 %a) nounwind {
272272
; RV32IMZB-NEXT: mul a1, a1, a2
273273
; RV32IMZB-NEXT: srli a1, a1, 16
274274
; RV32IMZB-NEXT: sub a0, a0, a1
275-
; RV32IMZB-NEXT: zext.h a0, a0
276-
; RV32IMZB-NEXT: srli a0, a0, 1
275+
; RV32IMZB-NEXT: slli a0, a0, 16
276+
; RV32IMZB-NEXT: srli a0, a0, 17
277277
; RV32IMZB-NEXT: add a0, a0, a1
278278
; RV32IMZB-NEXT: srli a0, a0, 2
279279
; RV32IMZB-NEXT: ret
@@ -299,8 +299,8 @@ define i16 @udiv16_constant_add(i16 %a) nounwind {
299299
; RV64IMZB-NEXT: mul a1, a1, a2
300300
; RV64IMZB-NEXT: srli a1, a1, 16
301301
; RV64IMZB-NEXT: subw a0, a0, a1
302-
; RV64IMZB-NEXT: zext.h a0, a0
303-
; RV64IMZB-NEXT: srli a0, a0, 1
302+
; RV64IMZB-NEXT: slli a0, a0, 48
303+
; RV64IMZB-NEXT: srli a0, a0, 49
304304
; RV64IMZB-NEXT: add a0, a0, a1
305305
; RV64IMZB-NEXT: srli a0, a0, 2
306306
; RV64IMZB-NEXT: ret
@@ -872,8 +872,8 @@ define i16 @sdiv16_constant_add_srai(i16 %a) nounwind {
872872
; RV32IMZB-NEXT: mul a1, a1, a2
873873
; RV32IMZB-NEXT: srli a1, a1, 16
874874
; RV32IMZB-NEXT: add a0, a1, a0
875-
; RV32IMZB-NEXT: zext.h a1, a0
876-
; RV32IMZB-NEXT: srli a1, a1, 15
875+
; RV32IMZB-NEXT: slli a1, a0, 16
876+
; RV32IMZB-NEXT: srli a1, a1, 31
877877
; RV32IMZB-NEXT: sext.h a0, a0
878878
; RV32IMZB-NEXT: srai a0, a0, 3
879879
; RV32IMZB-NEXT: add a0, a0, a1
@@ -902,8 +902,8 @@ define i16 @sdiv16_constant_add_srai(i16 %a) nounwind {
902902
; RV64IMZB-NEXT: mul a1, a1, a2
903903
; RV64IMZB-NEXT: srli a1, a1, 16
904904
; RV64IMZB-NEXT: addw a0, a1, a0
905-
; RV64IMZB-NEXT: zext.h a1, a0
906-
; RV64IMZB-NEXT: srli a1, a1, 15
905+
; RV64IMZB-NEXT: slli a1, a0, 48
906+
; RV64IMZB-NEXT: srli a1, a1, 63
907907
; RV64IMZB-NEXT: sext.h a0, a0
908908
; RV64IMZB-NEXT: srai a0, a0, 3
909909
; RV64IMZB-NEXT: add a0, a0, a1
@@ -938,8 +938,8 @@ define i16 @sdiv16_constant_sub_srai(i16 %a) nounwind {
938938
; RV32IMZB-NEXT: mul a1, a1, a2
939939
; RV32IMZB-NEXT: srli a1, a1, 16
940940
; RV32IMZB-NEXT: sub a0, a1, a0
941-
; RV32IMZB-NEXT: zext.h a1, a0
942-
; RV32IMZB-NEXT: srli a1, a1, 15
941+
; RV32IMZB-NEXT: slli a1, a0, 16
942+
; RV32IMZB-NEXT: srli a1, a1, 31
943943
; RV32IMZB-NEXT: sext.h a0, a0
944944
; RV32IMZB-NEXT: srai a0, a0, 3
945945
; RV32IMZB-NEXT: add a0, a0, a1
@@ -968,8 +968,8 @@ define i16 @sdiv16_constant_sub_srai(i16 %a) nounwind {
968968
; RV64IMZB-NEXT: mul a1, a1, a2
969969
; RV64IMZB-NEXT: srli a1, a1, 16
970970
; RV64IMZB-NEXT: subw a0, a1, a0
971-
; RV64IMZB-NEXT: zext.h a1, a0
972-
; RV64IMZB-NEXT: srli a1, a1, 15
971+
; RV64IMZB-NEXT: slli a1, a0, 48
972+
; RV64IMZB-NEXT: srli a1, a1, 63
973973
; RV64IMZB-NEXT: sext.h a0, a0
974974
; RV64IMZB-NEXT: srai a0, a0, 3
975975
; RV64IMZB-NEXT: add a0, a0, a1

llvm/test/CodeGen/RISCV/rv32zbb-zbp.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,8 @@ define i8 @srai_i8(i8 %a) nounwind {
514514
ret i8 %1
515515
}
516516

517+
; We could use zext.h+srli, but slli+srli offers more opportunities for
518+
; comppressed instructions.
517519
define i16 @srli_i16(i16 %a) nounwind {
518520
; RV32I-LABEL: srli_i16:
519521
; RV32I: # %bb.0:
@@ -523,14 +525,14 @@ define i16 @srli_i16(i16 %a) nounwind {
523525
;
524526
; RV32ZBB-LABEL: srli_i16:
525527
; RV32ZBB: # %bb.0:
526-
; RV32ZBB-NEXT: zext.h a0, a0
527-
; RV32ZBB-NEXT: srli a0, a0, 6
528+
; RV32ZBB-NEXT: slli a0, a0, 16
529+
; RV32ZBB-NEXT: srli a0, a0, 22
528530
; RV32ZBB-NEXT: ret
529531
;
530532
; RV32ZBP-LABEL: srli_i16:
531533
; RV32ZBP: # %bb.0:
532-
; RV32ZBP-NEXT: zext.h a0, a0
533-
; RV32ZBP-NEXT: srli a0, a0, 6
534+
; RV32ZBP-NEXT: slli a0, a0, 16
535+
; RV32ZBP-NEXT: srli a0, a0, 22
534536
; RV32ZBP-NEXT: ret
535537
%1 = lshr i16 %a, 6
536538
ret i16 %1

llvm/test/CodeGen/RISCV/rv64zbb-zbp.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,8 @@ define i8 @srai_i8(i8 %a) nounwind {
585585
ret i8 %1
586586
}
587587

588+
; We could use zext.h+srli, but slli+srli offers more opportunities for
589+
; comppressed instructions.
588590
define i16 @srli_i16(i16 %a) nounwind {
589591
; RV64I-LABEL: srli_i16:
590592
; RV64I: # %bb.0:
@@ -594,14 +596,14 @@ define i16 @srli_i16(i16 %a) nounwind {
594596
;
595597
; RV64ZBB-LABEL: srli_i16:
596598
; RV64ZBB: # %bb.0:
597-
; RV64ZBB-NEXT: zext.h a0, a0
598-
; RV64ZBB-NEXT: srli a0, a0, 6
599+
; RV64ZBB-NEXT: slli a0, a0, 48
600+
; RV64ZBB-NEXT: srli a0, a0, 54
599601
; RV64ZBB-NEXT: ret
600602
;
601603
; RV64ZBP-LABEL: srli_i16:
602604
; RV64ZBP: # %bb.0:
603-
; RV64ZBP-NEXT: zext.h a0, a0
604-
; RV64ZBP-NEXT: srli a0, a0, 6
605+
; RV64ZBP-NEXT: slli a0, a0, 48
606+
; RV64ZBP-NEXT: srli a0, a0, 54
605607
; RV64ZBP-NEXT: ret
606608
%1 = lshr i16 %a, 6
607609
ret i16 %1

0 commit comments

Comments
 (0)