Skip to content

Commit 2e10671

Browse files
committed
[RISCV] Improve detection of when to skip (and (srl x, c2) c1) -> (srli (slli x, c3-c2), c3) isel.
We have a special case to skip this transform if c1 is 0xffffffff and x is sext_inreg in order to use sraiw+zext.w. But we were only checking that we have a sext_inreg opcode, not how many bits are being sign extended. This commit adds a check that it is a sext_inreg from i32 so we know for sure that an sraiw can be created.
1 parent 50f82e6 commit 2e10671

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,8 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
774774
// (srli (slli x, c3-c2), c3).
775775
// Skip it in order to select sraiw.
776776
bool Skip = Subtarget->hasStdExtZba() && C3 == 32 &&
777-
X.getOpcode() == ISD::SIGN_EXTEND_INREG;
777+
X.getOpcode() == ISD::SIGN_EXTEND_INREG &&
778+
cast<VTSDNode>(X.getOperand(1))->getVT() == MVT::i32;
778779
if (OneUseOrZExtW && !IsANDI && !Skip) {
779780
SDNode *SLLI = CurDAG->getMachineNode(
780781
RISCV::SLLI, DL, XLenVT, X,

llvm/test/CodeGen/RISCV/rv64zba.ll

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \
33
; RUN: | FileCheck %s -check-prefix=RV64I
44
; RUN: llc -mtriple=riscv64 -mattr=+m,+zba -verify-machineinstrs < %s \
5-
; RUN: | FileCheck %s -check-prefix=RV64ZBA
5+
; RUN: | FileCheck %s -check-prefixes=RV64ZBA,RV64ZBANOZBB
6+
; RUN: llc -mtriple=riscv64 -mattr=+m,+zba,+zbb -verify-machineinstrs < %s \
7+
; RUN: | FileCheck %s -check-prefixes=RV64ZBA,RV64ZBAZBB
68

79
define i64 @slliuw(i64 %a) nounwind {
810
; RV64I-LABEL: slliuw:
@@ -1155,3 +1157,63 @@ define i64 @addshl64_5_8(i64 %a, i64 %b) {
11551157
%e = add i64 %c, %d
11561158
ret i64 %e
11571159
}
1160+
1161+
; Make sure we use sext.h+slli+srli for Zba+Zbb.
1162+
; FIXME: The RV64I and Zba only cases can be done with only 3 shifts.
1163+
define zeroext i32 @sext_ashr_zext_i8(i8 %a) nounwind {
1164+
; RV64I-LABEL: sext_ashr_zext_i8:
1165+
; RV64I: # %bb.0:
1166+
; RV64I-NEXT: slli a0, a0, 56
1167+
; RV64I-NEXT: srai a0, a0, 56
1168+
; RV64I-NEXT: slli a0, a0, 23
1169+
; RV64I-NEXT: srli a0, a0, 32
1170+
; RV64I-NEXT: ret
1171+
;
1172+
; RV64ZBANOZBB-LABEL: sext_ashr_zext_i8:
1173+
; RV64ZBANOZBB: # %bb.0:
1174+
; RV64ZBANOZBB-NEXT: slli a0, a0, 56
1175+
; RV64ZBANOZBB-NEXT: srai a0, a0, 56
1176+
; RV64ZBANOZBB-NEXT: slli a0, a0, 23
1177+
; RV64ZBANOZBB-NEXT: srli a0, a0, 32
1178+
; RV64ZBANOZBB-NEXT: ret
1179+
;
1180+
; RV64ZBAZBB-LABEL: sext_ashr_zext_i8:
1181+
; RV64ZBAZBB: # %bb.0:
1182+
; RV64ZBAZBB-NEXT: sext.b a0, a0
1183+
; RV64ZBAZBB-NEXT: slli a0, a0, 23
1184+
; RV64ZBAZBB-NEXT: srli a0, a0, 32
1185+
; RV64ZBAZBB-NEXT: ret
1186+
%ext = sext i8 %a to i32
1187+
%1 = ashr i32 %ext, 9
1188+
ret i32 %1
1189+
}
1190+
1191+
; Make sure we use sext.h+slli+srli for Zba+Zbb.
1192+
; FIXME: The RV64I and Zba only cases can be done with only 3 shifts.
1193+
define zeroext i32 @sext_ashr_zext_i16(i16 %a) nounwind {
1194+
; RV64I-LABEL: sext_ashr_zext_i16:
1195+
; RV64I: # %bb.0:
1196+
; RV64I-NEXT: slli a0, a0, 48
1197+
; RV64I-NEXT: srai a0, a0, 48
1198+
; RV64I-NEXT: slli a0, a0, 23
1199+
; RV64I-NEXT: srli a0, a0, 32
1200+
; RV64I-NEXT: ret
1201+
;
1202+
; RV64ZBANOZBB-LABEL: sext_ashr_zext_i16:
1203+
; RV64ZBANOZBB: # %bb.0:
1204+
; RV64ZBANOZBB-NEXT: slli a0, a0, 48
1205+
; RV64ZBANOZBB-NEXT: srai a0, a0, 48
1206+
; RV64ZBANOZBB-NEXT: slli a0, a0, 23
1207+
; RV64ZBANOZBB-NEXT: srli a0, a0, 32
1208+
; RV64ZBANOZBB-NEXT: ret
1209+
;
1210+
; RV64ZBAZBB-LABEL: sext_ashr_zext_i16:
1211+
; RV64ZBAZBB: # %bb.0:
1212+
; RV64ZBAZBB-NEXT: sext.h a0, a0
1213+
; RV64ZBAZBB-NEXT: slli a0, a0, 23
1214+
; RV64ZBAZBB-NEXT: srli a0, a0, 32
1215+
; RV64ZBAZBB-NEXT: ret
1216+
%ext = sext i16 %a to i32
1217+
%1 = ashr i32 %ext, 9
1218+
ret i32 %1
1219+
}

0 commit comments

Comments
 (0)