[llvm] be253cb - [RISCV] Support i32 brev8 intrinsic on RV64.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 6 17:25:32 PDT 2023
Author: Craig Topper
Date: 2023-07-06T17:24:53-07:00
New Revision: be253cb987a9fa078c66038d2325f81eeacf7209
URL: https://github.com/llvm/llvm-project/commit/be253cb987a9fa078c66038d2325f81eeacf7209
DIFF: https://github.com/llvm/llvm-project/commit/be253cb987a9fa078c66038d2325f81eeacf7209.diff
LOG: [RISCV] Support i32 brev8 intrinsic on RV64.
Similar to what we do for orc.b. Another patch will expose this
as a builtin in clang.
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
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 0bfa277f083df0..43d95705cb6433 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -9749,10 +9749,13 @@ void RISCVTargetLowering::ReplaceNodeResults(SDNode *N,
Results.push_back(DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Res));
return;
}
- case Intrinsic::riscv_orc_b: {
+ case Intrinsic::riscv_orc_b:
+ case Intrinsic::riscv_brev8: {
+ unsigned Opc =
+ IntNo == Intrinsic::riscv_brev8 ? RISCVISD::BREV8 : RISCVISD::ORC_B;
SDValue NewOp =
DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, N->getOperand(1));
- SDValue Res = DAG.getNode(RISCVISD::ORC_B, DL, MVT::i64, NewOp);
+ SDValue Res = DAG.getNode(Opc, DL, MVT::i64, NewOp);
Results.push_back(DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Res));
return;
}
diff --git a/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll b/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll
index d3ba14c71cb929..3169f65f646718 100644
--- a/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zbkb-intrinsic.ll
@@ -2,14 +2,14 @@
; RUN: llc -mtriple=riscv64 -mattr=+zbkb -verify-machineinstrs < %s \
; RUN: | FileCheck %s -check-prefix=RV64ZBKB
-declare i64 @llvm.riscv.brev8(i64)
+declare i64 @llvm.riscv.brev8.i64(i64)
define i64 @brev8(i64 %a) nounwind {
; RV64ZBKB-LABEL: brev8:
; RV64ZBKB: # %bb.0:
; RV64ZBKB-NEXT: brev8 a0, a0
; RV64ZBKB-NEXT: ret
- %val = call i64 @llvm.riscv.brev8(i64 %a)
+ %val = call i64 @llvm.riscv.brev8.i64(i64 %a)
ret i64 %val
}
@@ -20,7 +20,7 @@ define zeroext i16 @brev8_knownbits(i16 zeroext %a) nounwind {
; RV64ZBKB-NEXT: brev8 a0, a0
; RV64ZBKB-NEXT: ret
%zext = zext i16 %a to i64
- %val = call i64 @llvm.riscv.brev8(i64 %zext)
+ %val = call i64 @llvm.riscv.brev8.i64(i64 %zext)
%trunc = trunc i64 %val to i16
ret i16 %trunc
}
@@ -35,3 +35,39 @@ define i64 @rev8_i64(i64 %a) {
%1 = call i64 @llvm.bswap.i64(i64 %a)
ret i64 %1
}
+
+declare i32 @llvm.riscv.brev8.i32(i32)
+
+define signext i32 @brev8_i32(i32 signext %a) nounwind {
+; RV64ZBKB-LABEL: brev8_i32:
+; RV64ZBKB: # %bb.0:
+; RV64ZBKB-NEXT: brev8 a0, a0
+; RV64ZBKB-NEXT: sext.w a0, a0
+; RV64ZBKB-NEXT: ret
+ %val = call i32 @llvm.riscv.brev8.i32(i32 %a)
+ ret i32 %val
+}
+
+; Test that rev8 is recognized as preserving zero extension.
+define zeroext i16 @brev8_i32_knownbits(i16 zeroext %a) nounwind {
+; RV64ZBKB-LABEL: brev8_i32_knownbits:
+; RV64ZBKB: # %bb.0:
+; RV64ZBKB-NEXT: brev8 a0, a0
+; RV64ZBKB-NEXT: ret
+ %zext = zext i16 %a to i32
+ %val = call i32 @llvm.riscv.brev8.i32(i32 %zext)
+ %trunc = trunc i32 %val to i16
+ ret i16 %trunc
+}
+
+declare i32 @llvm.bswap.i32(i32)
+
+define signext i32 @rev8_i32(i32 signext %a) {
+; RV64ZBKB-LABEL: rev8_i32:
+; RV64ZBKB: # %bb.0:
+; RV64ZBKB-NEXT: rev8 a0, a0
+; RV64ZBKB-NEXT: srai a0, a0, 32
+; RV64ZBKB-NEXT: ret
+ %1 = call i32 @llvm.bswap.i32(i32 %a)
+ ret i32 %1
+}
More information about the llvm-commits
mailing list