From b7312571a76a24627abbe2f7e9623b4082696305 Mon Sep 17 00:00:00 2001 From: Michael Maitland Date: Thu, 1 Feb 2024 17:38:16 -0800 Subject: [PATCH] [GISEL] More accounting for scalable vectors when operating on LLTs --- llvm/lib/CodeGen/GlobalISel/CallLowering.cpp | 13 +++++++------ llvm/lib/CodeGen/GlobalISel/Utils.cpp | 10 ++++++++-- llvm/lib/CodeGen/MachineVerifier.cpp | 7 ++++--- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp index ccd9b13d730b6..3bd1542eeb746 100644 --- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -412,7 +412,7 @@ static void buildCopyFromRegs(MachineIRBuilder &B, ArrayRef OrigRegs, // size, e.g. PartLLT == v2s64 and LLTy is v3s32, then first coerce it to // have the same elt type, i.e. v4s32. // TODO: Extend this coersion to element multiples other than just 2. - if (PartLLT.getSizeInBits() > LLTy.getSizeInBits() && + if (TypeSize::isKnownGT(PartLLT.getSizeInBits(), LLTy.getSizeInBits()) && PartLLT.getScalarSizeInBits() == LLTy.getScalarSizeInBits() * 2 && Regs.size() == 1) { LLT NewTy = PartLLT.changeElementType(LLTy.getElementType()) @@ -529,7 +529,7 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef DstRegs, // We could just insert a regular copy, but this is unreachable at the moment. assert(SrcTy != PartTy && "identical part types shouldn't reach here"); - const unsigned PartSize = PartTy.getSizeInBits(); + const TypeSize PartSize = PartTy.getSizeInBits(); if (PartTy.isVector() == SrcTy.isVector() && PartTy.getScalarSizeInBits() > SrcTy.getScalarSizeInBits()) { @@ -539,7 +539,7 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef DstRegs, } if (SrcTy.isVector() && !PartTy.isVector() && - PartSize > SrcTy.getElementType().getSizeInBits()) { + TypeSize::isKnownGT(PartSize, SrcTy.getElementType().getSizeInBits())) { // Vector was scalarized, and the elements extended. auto UnmergeToEltTy = B.buildUnmerge(SrcTy.getElementType(), SrcReg); for (int i = 0, e = DstRegs.size(); i != e; ++i) @@ -548,9 +548,10 @@ static void buildCopyToRegs(MachineIRBuilder &B, ArrayRef DstRegs, } if (SrcTy.isVector() && PartTy.isVector() && - PartTy.getScalarSizeInBits() == SrcTy.getScalarSizeInBits() && - SrcTy.getNumElements() < PartTy.getNumElements()) { - // A coercion like: v2f32 -> v4f32. + PartTy.getSizeInBits() == SrcTy.getSizeInBits() && + ElementCount::isKnownLT(SrcTy.getElementCount(), + PartTy.getElementCount())) { + // A coercion like: v2f32 -> v4f32 or nxv2f32 -> nxv4f32 Register DstReg = DstRegs.front(); B.buildPadVectorWithUndefElements(DstReg, SrcReg); return; diff --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp index aed826a9cbc54..c9fe758821f96 100644 --- a/llvm/lib/CodeGen/GlobalISel/Utils.cpp +++ b/llvm/lib/CodeGen/GlobalISel/Utils.cpp @@ -1117,12 +1117,18 @@ LLT llvm::getLCMType(LLT OrigTy, LLT TargetTy) { } LLT llvm::getCoverTy(LLT OrigTy, LLT TargetTy) { + + if ((OrigTy.isScalableVector() && TargetTy.isFixedVector()) || + (OrigTy.isFixedVector() && TargetTy.isScalableVector())) + llvm_unreachable( + "getCoverTy not implemented between fixed and scalable vectors."); + if (!OrigTy.isVector() || !TargetTy.isVector() || OrigTy == TargetTy || (OrigTy.getScalarSizeInBits() != TargetTy.getScalarSizeInBits())) return getLCMType(OrigTy, TargetTy); - unsigned OrigTyNumElts = OrigTy.getNumElements(); - unsigned TargetTyNumElts = TargetTy.getNumElements(); + unsigned OrigTyNumElts = OrigTy.getElementCount().getKnownMinValue(); + unsigned TargetTyNumElts = TargetTy.getElementCount().getKnownMinValue(); if (OrigTyNumElts % TargetTyNumElts == 0) return OrigTy; diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index b182000a3d705..fe865ed6f8a0e 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1400,7 +1400,8 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) { if (DstTy.isVector()) { // This case is the converse of G_CONCAT_VECTORS. if (!SrcTy.isVector() || SrcTy.getScalarType() != DstTy.getScalarType() || - SrcTy.getNumElements() != NumDsts * DstTy.getNumElements()) + SrcTy.isScalableVector() != DstTy.isScalableVector() || + SrcTy.getSizeInBits() != NumDsts * DstTy.getSizeInBits()) report("G_UNMERGE_VALUES source operand does not match vector " "destination operands", MI); @@ -1477,8 +1478,8 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) { for (const MachineOperand &MO : llvm::drop_begin(MI->operands(), 2)) if (MRI->getType(MI->getOperand(1).getReg()) != MRI->getType(MO.getReg())) report("G_CONCAT_VECTOR source operand types are not homogeneous", MI); - if (DstTy.getNumElements() != - SrcTy.getNumElements() * (MI->getNumOperands() - 1)) + if (DstTy.getElementCount() != + SrcTy.getElementCount() * (MI->getNumOperands() - 1)) report("G_CONCAT_VECTOR num dest and source elements should match", MI); break; }