[llvm] e107518 - [RISCV] Custom lower brev8 intrinsic to RISCVISD::GREV.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 30 12:50:46 PST 2022
Author: Craig Topper
Date: 2022-01-30T12:41:09-08:00
New Revision: e1075186a6458de75492f5de5fb8b8139097ff5f
URL: https://github.com/llvm/llvm-project/commit/e1075186a6458de75492f5de5fb8b8139097ff5f
DIFF: https://github.com/llvm/llvm-project/commit/e1075186a6458de75492f5de5fb8b8139097ff5f.diff
LOG: [RISCV] Custom lower brev8 intrinsic to RISCVISD::GREV.
We can use the RISCVISD::GREV encoding that swaps the bits in
each byte. This allows it to use the existing computeKnownBits
support for RISCVISD::GREV.
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/lib/Target/RISCV/RISCVInstrInfoZb.td
llvm/test/CodeGen/RISCV/rv32zbkb-intrinsic.ll
llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 54b909ec94e0e..838e2bbeb96fc 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -4465,9 +4465,13 @@ SDValue RISCVTargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
return DAG.getRegister(RISCV::X4, PtrVT);
}
case Intrinsic::riscv_orc_b:
- // Lower to the GORCI encoding for orc.b.
- return DAG.getNode(RISCVISD::GORC, DL, XLenVT, Op.getOperand(1),
+ case Intrinsic::riscv_brev8: {
+ // Lower to the GORCI encoding for orc.b or the GREVI encoding for brev8.
+ unsigned Opc =
+ IntNo == Intrinsic::riscv_brev8 ? RISCVISD::GREV : RISCVISD::GORC;
+ return DAG.getNode(Opc, DL, XLenVT, Op.getOperand(1),
DAG.getConstant(7, DL, XLenVT));
+ }
case Intrinsic::riscv_grev:
case Intrinsic::riscv_gorc: {
unsigned Opc =
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td
index c60f31ae1d6b3..50849949bfb48 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZb.td
@@ -1172,10 +1172,6 @@ def : PatGprGpr<riscv_bfp, BFP>;
let Predicates = [HasStdExtZbf, IsRV64] in
def : PatGprGpr<riscv_bfpw, BFPW>;
-let Predicates = [HasStdExtZbkb] in {
-def : PatGpr<int_riscv_brev8, BREV8>;
-} // Predicates = [HasStdExtZbkb]
-
let Predicates = [HasStdExtZbkb, IsRV32] in {
def : PatGpr<int_riscv_zip, ZIP_RV32>;
def : PatGpr<int_riscv_unzip, UNZIP_RV32>;
diff --git a/llvm/test/CodeGen/RISCV/rv32zbkb-intrinsic.ll b/llvm/test/CodeGen/RISCV/rv32zbkb-intrinsic.ll
index 9efd7e5feb3f0..a4d76f8e82103 100644
--- a/llvm/test/CodeGen/RISCV/rv32zbkb-intrinsic.ll
+++ b/llvm/test/CodeGen/RISCV/rv32zbkb-intrinsic.ll
@@ -13,6 +13,18 @@ define i32 @brev8(i32 %a) nounwind {
ret i32 %val
}
+; Test that rev8 is recognized as preserving zero extension.
+define zeroext i16 @brev8_knownbits(i16 zeroext %a) nounwind {
+; RV32ZBKB-LABEL: brev8_knownbits:
+; RV32ZBKB: # %bb.0:
+; RV32ZBKB-NEXT: brev8 a0, a0
+; RV32ZBKB-NEXT: ret
+ %zext = zext i16 %a to i32
+ %val = call i32 @llvm.riscv.brev8(i32 %zext)
+ %trunc = trunc i32 %val to i16
+ ret i16 %trunc
+}
+
declare i32 @llvm.bswap.i32(i32)
define i32 @rev8_i32(i32 %a) nounwind {
diff --git a/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll b/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll
index ec3196beacd0e..d3ba14c71cb92 100644
--- a/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll
@@ -13,6 +13,18 @@ define i64 @brev8(i64 %a) nounwind {
ret i64 %val
}
+; Test that rev8 is recognized as preserving zero extension.
+define zeroext i16 @brev8_knownbits(i16 zeroext %a) nounwind {
+; RV64ZBKB-LABEL: brev8_knownbits:
+; RV64ZBKB: # %bb.0:
+; RV64ZBKB-NEXT: brev8 a0, a0
+; RV64ZBKB-NEXT: ret
+ %zext = zext i16 %a to i64
+ %val = call i64 @llvm.riscv.brev8(i64 %zext)
+ %trunc = trunc i64 %val to i16
+ ret i16 %trunc
+}
+
declare i64 @llvm.bswap.i64(i64)
define i64 @rev8_i64(i64 %a) {
More information about the llvm-commits
mailing list