From 9cfe0d5cedac51cec51367bdc552b16d50dd1f7e Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Wed, 8 Jan 2025 11:27:58 -0800 Subject: [PATCH 1/2] [RISCV][VLOpt] Remove State field from OperandInfo [nfc] We can just use a std::optional to wrap the operand info instead. The state field is confusing as we have a "partially known" state where EEW is known and EMUL is nullopt, but it's still "Known". --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 66 +++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 96a73d9720a43..576f252a19a21 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -79,11 +79,6 @@ static bool isVectorRegClass(Register R, const MachineRegisterInfo *MRI) { /// Represents the EMUL and EEW of a MachineOperand. struct OperandInfo { - enum class State { - Unknown, - Known, - } S; - // Represent as 1,2,4,8, ... and fractional indicator. This is because // EMUL can take on values that don't map to RISCVII::VLMUL values exactly. // For example, a mask operand can have an EMUL less than MF8. @@ -92,41 +87,33 @@ struct OperandInfo { unsigned Log2EEW; OperandInfo(RISCVII::VLMUL EMUL, unsigned Log2EEW) - : S(State::Known), EMUL(RISCVVType::decodeVLMUL(EMUL)), Log2EEW(Log2EEW) { + : EMUL(RISCVVType::decodeVLMUL(EMUL)), Log2EEW(Log2EEW) { } OperandInfo(std::pair EMUL, unsigned Log2EEW) - : S(State::Known), EMUL(EMUL), Log2EEW(Log2EEW) {} - - OperandInfo(unsigned Log2EEW) : S(State::Known), Log2EEW(Log2EEW) {} + : EMUL(EMUL), Log2EEW(Log2EEW) {} - OperandInfo() : S(State::Unknown) {} + OperandInfo(unsigned Log2EEW) : Log2EEW(Log2EEW) {} - bool isUnknown() const { return S == State::Unknown; } - bool isKnown() const { return S == State::Known; } + OperandInfo() = delete; static bool EMULAndEEWAreEqual(const OperandInfo &A, const OperandInfo &B) { - assert(A.isKnown() && B.isKnown() && "Both operands must be known"); - return A.Log2EEW == B.Log2EEW && A.EMUL->first == B.EMUL->first && A.EMUL->second == B.EMUL->second; } static bool EEWAreEqual(const OperandInfo &A, const OperandInfo &B) { - assert(A.isKnown() && B.isKnown() && "Both operands must be known"); return A.Log2EEW == B.Log2EEW; } void print(raw_ostream &OS) const { - if (isUnknown()) { - OS << "Unknown"; - return; - } - assert(EMUL && "Expected EMUL to have value"); - OS << "EMUL: m"; - if (EMUL->second) - OS << "f"; - OS << EMUL->first; + if (EMUL) { + OS << "EMUL: m"; + if (EMUL->second) + OS << "f"; + OS << EMUL->first; + } else + OS << "EMUL: unknown\n"; OS << ", EEW: " << (1 << Log2EEW); } }; @@ -137,6 +124,17 @@ static raw_ostream &operator<<(raw_ostream &OS, const OperandInfo &OI) { return OS; } +LLVM_ATTRIBUTE_UNUSED +static raw_ostream &operator<<(raw_ostream &OS, + const std::optional &OI) { + if (OI) + OI->print(OS); + else + OS << "nullopt"; + return OS; +} + + namespace llvm { namespace RISCVVType { /// Return EMUL = (EEW / SEW) * LMUL where EEW comes from Log2EEW and LMUL and @@ -715,12 +713,13 @@ getOperandLog2EEW(const MachineOperand &MO, const MachineRegisterInfo *MRI) { } default: - return {}; + return std::nullopt; } } -static OperandInfo getOperandInfo(const MachineOperand &MO, - const MachineRegisterInfo *MRI) { +static std::optional +getOperandInfo(const MachineOperand &MO, + const MachineRegisterInfo *MRI) { const MachineInstr &MI = *MO.getParent(); const RISCVVPseudosTable::PseudoInfo *RVV = RISCVVPseudosTable::getPseudoInfo(MI.getOpcode()); @@ -728,7 +727,7 @@ static OperandInfo getOperandInfo(const MachineOperand &MO, std::optional Log2EEW = getOperandLog2EEW(MO, MRI); if (!Log2EEW) - return {}; + return std::nullopt; switch (RVV->BaseInstr) { // Vector Reduction Operations @@ -1185,9 +1184,10 @@ std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { return std::nullopt; } - OperandInfo ConsumerInfo = getOperandInfo(UserOp, MRI); - OperandInfo ProducerInfo = getOperandInfo(MI.getOperand(0), MRI); - if (ConsumerInfo.isUnknown() || ProducerInfo.isUnknown()) { + std::optional ConsumerInfo = getOperandInfo(UserOp, MRI); + std::optional ProducerInfo = + getOperandInfo(MI.getOperand(0), MRI); + if (!ConsumerInfo || !ProducerInfo) { LLVM_DEBUG(dbgs() << " Abort due to unknown operand information.\n"); LLVM_DEBUG(dbgs() << " ConsumerInfo is: " << ConsumerInfo << "\n"); LLVM_DEBUG(dbgs() << " ProducerInfo is: " << ProducerInfo << "\n"); @@ -1198,9 +1198,9 @@ std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { // compatible. Otherwise, the EMUL *and* EEW must be compatible. bool IsVectorOpUsedAsScalarOp = isVectorOpUsedAsScalarOp(UserOp); if ((IsVectorOpUsedAsScalarOp && - !OperandInfo::EEWAreEqual(ConsumerInfo, ProducerInfo)) || + !OperandInfo::EEWAreEqual(*ConsumerInfo, *ProducerInfo)) || (!IsVectorOpUsedAsScalarOp && - !OperandInfo::EMULAndEEWAreEqual(ConsumerInfo, ProducerInfo))) { + !OperandInfo::EMULAndEEWAreEqual(*ConsumerInfo, *ProducerInfo))) { LLVM_DEBUG( dbgs() << " Abort due to incompatible information for EMUL or EEW.\n"); From e24dfbded836a07149c475e92bdca06257c83342 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Wed, 8 Jan 2025 12:11:37 -0800 Subject: [PATCH 2/2] clang-format --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 576f252a19a21..ad61a77df9057 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -87,8 +87,7 @@ struct OperandInfo { unsigned Log2EEW; OperandInfo(RISCVII::VLMUL EMUL, unsigned Log2EEW) - : EMUL(RISCVVType::decodeVLMUL(EMUL)), Log2EEW(Log2EEW) { - } + : EMUL(RISCVVType::decodeVLMUL(EMUL)), Log2EEW(Log2EEW) {} OperandInfo(std::pair EMUL, unsigned Log2EEW) : EMUL(EMUL), Log2EEW(Log2EEW) {} @@ -134,7 +133,6 @@ static raw_ostream &operator<<(raw_ostream &OS, return OS; } - namespace llvm { namespace RISCVVType { /// Return EMUL = (EEW / SEW) * LMUL where EEW comes from Log2EEW and LMUL and @@ -718,8 +716,7 @@ getOperandLog2EEW(const MachineOperand &MO, const MachineRegisterInfo *MRI) { } static std::optional -getOperandInfo(const MachineOperand &MO, - const MachineRegisterInfo *MRI) { +getOperandInfo(const MachineOperand &MO, const MachineRegisterInfo *MRI) { const MachineInstr &MI = *MO.getParent(); const RISCVVPseudosTable::PseudoInfo *RVV = RISCVVPseudosTable::getPseudoInfo(MI.getOpcode()); @@ -1186,7 +1183,7 @@ std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { std::optional ConsumerInfo = getOperandInfo(UserOp, MRI); std::optional ProducerInfo = - getOperandInfo(MI.getOperand(0), MRI); + getOperandInfo(MI.getOperand(0), MRI); if (!ConsumerInfo || !ProducerInfo) { LLVM_DEBUG(dbgs() << " Abort due to unknown operand information.\n"); LLVM_DEBUG(dbgs() << " ConsumerInfo is: " << ConsumerInfo << "\n");