[llvm] [GISel][RISCV] Correctly handle scalable vector shuffles of pointer vectors in IRTranslator. (PR #106580)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 29 09:52:03 PDT 2024
https://github.com/topperc updated https://github.com/llvm/llvm-project/pull/106580
>From 1000ffa73a0f9b14d0113cf1213b2b262965c11f Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Thu, 29 Aug 2024 09:16:20 -0700
Subject: [PATCH 1/3] [GISel][RISCV] Correctly handle scalable vector shuffles
of pointer vectors in IRTranslator.
---
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 11 ++++-----
llvm/lib/CodeGen/MachineVerifier.cpp | 4 ++--
.../GlobalISel/irtranslator/shufflevector.ll | 23 +++++++++++++++++--
3 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index f44af78cded46d..49d369ef76286d 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -3175,15 +3175,14 @@ bool IRTranslator::translateExtractElement(const User &U,
bool IRTranslator::translateShuffleVector(const User &U,
MachineIRBuilder &MIRBuilder) {
- // A ShuffleVector that has operates on scalable vectors is a splat vector
- // where the value of the splat vector is the 0th element of the first
- // operand, since the index mask operand is the zeroinitializer (undef and
+ // A ShuffleVector that operates on scalable vectors is a splat vector where
+ // the value of the splat vector is the 0th element of the first/ operand,
+ // since the index mask operand is the zeroinitializer (undef and
// poison are treated as zeroinitializer here).
if (U.getOperand(0)->getType()->isScalableTy()) {
- Value *Op0 = U.getOperand(0);
+ Register Val = getOrCreateVReg(*U.getOperand(0));
auto SplatVal = MIRBuilder.buildExtractVectorElementConstant(
- LLT::scalar(Op0->getType()->getScalarSizeInBits()),
- getOrCreateVReg(*Op0), 0);
+ MRI->getType(Val).getElementType(), Val, 0);
MIRBuilder.buildSplatVector(getOrCreateVReg(U), SplatVal);
return true;
}
diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index 5e9bb4c27ffbdf..759201ed9dadc7 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -1835,8 +1835,8 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
break;
}
- if (!SrcTy.isScalar()) {
- report("Source type must be a scalar", MI);
+ if (!SrcTy.isScalar() && !SrcTy.isPointer()) {
+ report("Source type must be a scalar or pointer", MI);
break;
}
diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/shufflevector.ll b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/shufflevector.ll
index 7ea67073bc28d2..89c7bfe81d5f98 100644
--- a/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/shufflevector.ll
+++ b/llvm/test/CodeGen/RISCV/GlobalISel/irtranslator/shufflevector.ll
@@ -1770,5 +1770,24 @@ define <vscale x 16 x i64> @shufflevector_nxv16i64_2(<vscale x 16 x i64> %a) {
ret <vscale x 16 x i64> %b
}
-
-
+define <vscale x 1 x ptr> @shufflevector_nxv1p0_0() {
+ ; RV32-LABEL: name: shufflevector_nxv1p0_0
+ ; RV32: bb.1 (%ir-block.0):
+ ; RV32-NEXT: [[DEF:%[0-9]+]]:_(<vscale x 1 x p0>) = G_IMPLICIT_DEF
+ ; RV32-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
+ ; RV32-NEXT: [[EVEC:%[0-9]+]]:_(p0) = G_EXTRACT_VECTOR_ELT [[DEF]](<vscale x 1 x p0>), [[C]](s32)
+ ; RV32-NEXT: [[SPLAT_VECTOR:%[0-9]+]]:_(<vscale x 1 x p0>) = G_SPLAT_VECTOR [[EVEC]](p0)
+ ; RV32-NEXT: $v8 = COPY [[SPLAT_VECTOR]](<vscale x 1 x p0>)
+ ; RV32-NEXT: PseudoRET implicit $v8
+ ;
+ ; RV64-LABEL: name: shufflevector_nxv1p0_0
+ ; RV64: bb.1 (%ir-block.0):
+ ; RV64-NEXT: [[DEF:%[0-9]+]]:_(<vscale x 1 x p0>) = G_IMPLICIT_DEF
+ ; RV64-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
+ ; RV64-NEXT: [[EVEC:%[0-9]+]]:_(p0) = G_EXTRACT_VECTOR_ELT [[DEF]](<vscale x 1 x p0>), [[C]](s64)
+ ; RV64-NEXT: [[SPLAT_VECTOR:%[0-9]+]]:_(<vscale x 1 x p0>) = G_SPLAT_VECTOR [[EVEC]](p0)
+ ; RV64-NEXT: $v8 = COPY [[SPLAT_VECTOR]](<vscale x 1 x p0>)
+ ; RV64-NEXT: PseudoRET implicit $v8
+ %a = shufflevector <vscale x 1 x ptr> poison, <vscale x 1 x ptr> poison, <vscale x 1 x i32> zeroinitializer
+ ret <vscale x 1 x ptr> %a
+}
>From 7d2d691fd12ef817c9e1e570e3dbef1f6aebfaed Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Thu, 29 Aug 2024 09:34:24 -0700
Subject: [PATCH 2/3] fixup! add 'or pointer' to MachineVerifier test check.
---
llvm/test/MachineVerifier/test_g_splat_vector.mir | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/test/MachineVerifier/test_g_splat_vector.mir b/llvm/test/MachineVerifier/test_g_splat_vector.mir
index 00074349776fa7..a5bde496a3f22c 100644
--- a/llvm/test/MachineVerifier/test_g_splat_vector.mir
+++ b/llvm/test/MachineVerifier/test_g_splat_vector.mir
@@ -16,10 +16,10 @@ body: |
; CHECK: Destination type must be a scalable vector
%4:_(<2 x s32>) = G_SPLAT_VECTOR %0
- ; CHECK: Source type must be a scalar
+ ; CHECK: Source type must be a scalar or pointer
%5:_(<vscale x 2 x s32>) = G_SPLAT_VECTOR %1
- ; CHECK: Source type must be a scalar
+ ; CHECK: Source type must be a scalar or pointer
%6:_(<vscale x 2 x s32>) = G_SPLAT_VECTOR %2
; CHECK: Element type of the destination must be the same size or smaller than the source type
>From c5fc05eb4ec5cc9b6fcc9a049eef1c6264a130de Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Thu, 29 Aug 2024 09:51:47 -0700
Subject: [PATCH 3/3] fixup! fix typo
---
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 49d369ef76286d..18bf5d37c07a49 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -3176,7 +3176,7 @@ bool IRTranslator::translateExtractElement(const User &U,
bool IRTranslator::translateShuffleVector(const User &U,
MachineIRBuilder &MIRBuilder) {
// A ShuffleVector that operates on scalable vectors is a splat vector where
- // the value of the splat vector is the 0th element of the first/ operand,
+ // the value of the splat vector is the 0th element of the first operand,
// since the index mask operand is the zeroinitializer (undef and
// poison are treated as zeroinitializer here).
if (U.getOperand(0)->getType()->isScalableTy()) {
More information about the llvm-commits
mailing list