From c6eb48e1b3d26713408e59c47760b9175b27c1a4 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Tue, 28 Jan 2025 23:52:16 +0800 Subject: [PATCH 01/10] Keep VL = 1 check, check isCandidate after popping instead --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index d9e62449490de..1fc9a2baaf262 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -1143,6 +1143,16 @@ bool RISCVVLOptimizer::isCandidate(const MachineInstr &MI) const { if (MI.getNumDefs() != 1) return false; + unsigned VLOpNum = RISCVII::getVLOpNum(Desc); + const MachineOperand &VLOp = MI.getOperand(VLOpNum); + + // If the VL is 1, then there is no need to reduce it. This is an + // optimization, not needed to preserve correctness. + if (VLOp.isImm() && VLOp.getImm() == 1) { + LLVM_DEBUG(dbgs() << " Not a candidate because VL is already 1\n"); + return false; + } + if (MI.mayRaiseFPException()) { LLVM_DEBUG(dbgs() << "Not a candidate because may raise FP exception\n"); return false; @@ -1342,8 +1352,6 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { continue; MachineInstr *DefMI = MRI->getVRegDef(Op.getReg()); - if (!isCandidate(*DefMI)) - continue; if (IgnoreSameBlock && DefMI->getParent() == MI.getParent()) continue; @@ -1375,7 +1383,8 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { while (!Worklist.empty()) { assert(MadeChange); MachineInstr &MI = *Worklist.pop_back_val(); - assert(isCandidate(MI)); + if (!isCandidate(MI)) + continue; if (!tryReduceVL(MI)) continue; PushOperands(MI, /*IgnoreSameBlock*/ false); From dd84c167add9f225e2fd0bc7dfdf0d2452ba4188 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 29 Jan 2025 01:05:17 +0800 Subject: [PATCH 02/10] Move VL=1 check to tryReduceVL --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 1fc9a2baaf262..d9e62449490de 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -1143,16 +1143,6 @@ bool RISCVVLOptimizer::isCandidate(const MachineInstr &MI) const { if (MI.getNumDefs() != 1) return false; - unsigned VLOpNum = RISCVII::getVLOpNum(Desc); - const MachineOperand &VLOp = MI.getOperand(VLOpNum); - - // If the VL is 1, then there is no need to reduce it. This is an - // optimization, not needed to preserve correctness. - if (VLOp.isImm() && VLOp.getImm() == 1) { - LLVM_DEBUG(dbgs() << " Not a candidate because VL is already 1\n"); - return false; - } - if (MI.mayRaiseFPException()) { LLVM_DEBUG(dbgs() << "Not a candidate because may raise FP exception\n"); return false; @@ -1352,6 +1342,8 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { continue; MachineInstr *DefMI = MRI->getVRegDef(Op.getReg()); + if (!isCandidate(*DefMI)) + continue; if (IgnoreSameBlock && DefMI->getParent() == MI.getParent()) continue; @@ -1383,8 +1375,7 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { while (!Worklist.empty()) { assert(MadeChange); MachineInstr &MI = *Worklist.pop_back_val(); - if (!isCandidate(MI)) - continue; + assert(isCandidate(MI)); if (!tryReduceVL(MI)) continue; PushOperands(MI, /*IgnoreSameBlock*/ false); From 39cdcef9addc682ef7b9af7a3fb1a571cee6d703 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Mon, 27 Jan 2025 18:41:37 +0800 Subject: [PATCH 03/10] [RISCV][VLOPT] Compute demanded VLs up front. NFC This replaces the worklist by instead computing what VL is demanded by each instruction's users first. checkUsers essentially already did this, so it's been renamed to computeDemandedVL. The demanded VLs are stored in a DenseMap, and then we can just do a single forward pass of tryReduceVL where we check if a candidate's demanded VL is less than its VLOp. This means the pass should now be in linear complexity, and allows us to relax the restriction on tied operands in more easily as in #124066. Note that in order to avoid std::optional inside the DenseMap, I've removed the std::optionals and replaced them with VLMAX or 0 constant operands. --- llvm/lib/Target/RISCV/RISCVInstrInfo.cpp | 2 + llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 141 +++++---- .../test/CodeGen/RISCV/rvv/vl-opt-op-info.mir | 272 ++++++++++++++++++ llvm/test/CodeGen/RISCV/rvv/vl-opt.mir | 28 ++ llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll | 10 +- 5 files changed, 376 insertions(+), 77 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp index 12a7af0750813..c2b1ee390583b 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -4241,6 +4241,8 @@ unsigned RISCV::getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW) { /// Given two VL operands, do we know that LHS <= RHS? bool RISCV::isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS) { + if (LHS.isImm() && LHS.getImm() == 0) + return true; if (LHS.isReg() && RHS.isReg() && LHS.getReg().isVirtual() && LHS.getReg() == RHS.getReg()) return true; diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index d9e62449490de..697327170d5f2 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -33,6 +33,7 @@ namespace { class RISCVVLOptimizer : public MachineFunctionPass { const MachineRegisterInfo *MRI; const MachineDominatorTree *MDT; + const TargetInstrInfo *TII; public: static char ID; @@ -50,12 +51,15 @@ class RISCVVLOptimizer : public MachineFunctionPass { StringRef getPassName() const override { return PASS_NAME; } private: - std::optional getMinimumVLForUser(MachineOperand &UserOp); - /// Returns the largest common VL MachineOperand that may be used to optimize - /// MI. Returns std::nullopt if it failed to find a suitable VL. - std::optional checkUsers(MachineInstr &MI); + MachineOperand getMinimumVLForUser(MachineOperand &UserOp); + /// Computes the VL of \p MI that is actually used by its users. + MachineOperand computeDemandedVL(const MachineInstr &MI); bool tryReduceVL(MachineInstr &MI); bool isCandidate(const MachineInstr &MI) const; + + /// For a given instruction, records what elements of it are demanded by + /// downstream users. + DenseMap DemandedVLs; }; } // end anonymous namespace @@ -1173,15 +1177,14 @@ bool RISCVVLOptimizer::isCandidate(const MachineInstr &MI) const { return true; } -std::optional -RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { +MachineOperand RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { const MachineInstr &UserMI = *UserOp.getParent(); const MCInstrDesc &Desc = UserMI.getDesc(); if (!RISCVII::hasVLOp(Desc.TSFlags) || !RISCVII::hasSEWOp(Desc.TSFlags)) { LLVM_DEBUG(dbgs() << " Abort due to lack of VL, assume that" " use VLMAX\n"); - return std::nullopt; + return MachineOperand::CreateImm(RISCV::VLMaxSentinel); } // Instructions like reductions may use a vector register as a scalar @@ -1201,46 +1204,59 @@ RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { // Looking for an immediate or a register VL that isn't X0. assert((!VLOp.isReg() || VLOp.getReg() != RISCV::X0) && "Did not expect X0 VL"); + + // If we know the demanded VL of UserMI, then we can reduce the VL it + // requires. + if (DemandedVLs.contains(&UserMI)) { + // We can only shrink the demanded VL if the elementwise result doesn't + // depend on VL (i.e. not vredsum/viota etc.) + // Also conservatively restrict to supported instructions for now. + // TODO: Can we remove the isSupportedInstr check? + if (!RISCVII::elementsDependOnVL( + TII->get(RISCV::getRVVMCOpcode(UserMI.getOpcode())).TSFlags) && + isSupportedInstr(UserMI)) { + const MachineOperand &DemandedVL = DemandedVLs.at(&UserMI); + if (RISCV::isVLKnownLE(DemandedVL, VLOp)) + return DemandedVL; + } + } + return VLOp; } -std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { - // FIXME: Avoid visiting each user for each time we visit something on the - // worklist, combined with an extra visit from the outer loop. Restructure - // along lines of an instcombine style worklist which integrates the outer - // pass. - std::optional CommonVL; +MachineOperand RISCVVLOptimizer::computeDemandedVL(const MachineInstr &MI) { + const MachineOperand &VLMAX = MachineOperand::CreateImm(RISCV::VLMaxSentinel); + MachineOperand DemandedVL = MachineOperand::CreateImm(0); + for (auto &UserOp : MRI->use_operands(MI.getOperand(0).getReg())) { const MachineInstr &UserMI = *UserOp.getParent(); LLVM_DEBUG(dbgs() << " Checking user: " << UserMI << "\n"); if (mayReadPastVL(UserMI)) { LLVM_DEBUG(dbgs() << " Abort because used by unsafe instruction\n"); - return std::nullopt; + return VLMAX; } // If used as a passthru, elements past VL will be read. if (UserOp.isTied()) { LLVM_DEBUG(dbgs() << " Abort because user used as tied operand\n"); - return std::nullopt; + return VLMAX; } - auto VLOp = getMinimumVLForUser(UserOp); - if (!VLOp) - return std::nullopt; + const MachineOperand &VLOp = getMinimumVLForUser(UserOp); // Use the largest VL among all the users. If we cannot determine this // statically, then we cannot optimize the VL. - if (!CommonVL || RISCV::isVLKnownLE(*CommonVL, *VLOp)) { - CommonVL = *VLOp; - LLVM_DEBUG(dbgs() << " User VL is: " << VLOp << "\n"); - } else if (!RISCV::isVLKnownLE(*VLOp, *CommonVL)) { + if (RISCV::isVLKnownLE(DemandedVL, VLOp)) { + DemandedVL = VLOp; + LLVM_DEBUG(dbgs() << " Demanded VL is: " << VLOp << "\n"); + } else if (!RISCV::isVLKnownLE(VLOp, DemandedVL)) { LLVM_DEBUG(dbgs() << " Abort because cannot determine a common VL\n"); - return std::nullopt; + return VLMAX; } if (!RISCVII::hasSEWOp(UserMI.getDesc().TSFlags)) { LLVM_DEBUG(dbgs() << " Abort due to lack of SEW operand\n"); - return std::nullopt; + return VLMAX; } std::optional ConsumerInfo = getOperandInfo(UserOp, MRI); @@ -1250,7 +1266,7 @@ std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { LLVM_DEBUG(dbgs() << " Abort due to unknown operand information.\n"); LLVM_DEBUG(dbgs() << " ConsumerInfo is: " << ConsumerInfo << "\n"); LLVM_DEBUG(dbgs() << " ProducerInfo is: " << ProducerInfo << "\n"); - return std::nullopt; + return VLMAX; } // If the operand is used as a scalar operand, then the EEW must be @@ -1265,11 +1281,11 @@ std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { << " Abort due to incompatible information for EMUL or EEW.\n"); LLVM_DEBUG(dbgs() << " ConsumerInfo is: " << ConsumerInfo << "\n"); LLVM_DEBUG(dbgs() << " ProducerInfo is: " << ProducerInfo << "\n"); - return std::nullopt; + return VLMAX; } } - return CommonVL; + return DemandedVL; } bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { @@ -1285,11 +1301,11 @@ bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { return false; } - auto CommonVL = checkUsers(MI); + auto CommonVL = DemandedVLs[&MI]; if (!CommonVL) return false; - assert((CommonVL->isImm() || CommonVL->getReg().isVirtual()) && + assert((CommonVL.isImm() || CommonVL.getReg().isVirtual()) && "Expected VL to be an Imm or virtual Reg"); if (!RISCV::isVLKnownLE(*CommonVL, VLOp)) { @@ -1297,28 +1313,28 @@ bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { return false; } - if (CommonVL->isIdenticalTo(VLOp)) { + if (CommonVL.isIdenticalTo(VLOp)) { LLVM_DEBUG( - dbgs() << " Abort due to CommonVL == VLOp, no point in reducing.\n"); + dbgs() + << " Abort due to DemandedVL == VLOp, no point in reducing.\n"); return false; } - if (CommonVL->isImm()) { + if (CommonVL.isImm()) { LLVM_DEBUG(dbgs() << " Reduce VL from " << VLOp << " to " - << CommonVL->getImm() << " for " << MI << "\n"); - VLOp.ChangeToImmediate(CommonVL->getImm()); + << CommonVL.getImm() << " for " << MI << "\n"); + VLOp.ChangeToImmediate(CommonVL.getImm()); return true; } - const MachineInstr *VLMI = MRI->getVRegDef(CommonVL->getReg()); + const MachineInstr *VLMI = MRI->getVRegDef(CommonVL.getReg()); if (!MDT->dominates(VLMI, &MI)) return false; - LLVM_DEBUG( - dbgs() << " Reduce VL from " << VLOp << " to " - << printReg(CommonVL->getReg(), MRI->getTargetRegisterInfo()) - << " for " << MI << "\n"); + LLVM_DEBUG(dbgs() << " Reduce VL from " << VLOp << " to " + << printReg(CommonVL.getReg(), MRI->getTargetRegisterInfo()) + << " for " << MI << "\n"); // All our checks passed. We can reduce VL. - VLOp.ChangeToRegister(CommonVL->getReg(), false); + VLOp.ChangeToRegister(CommonVL.getReg(), false); return true; } @@ -1333,52 +1349,33 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { if (!ST.hasVInstructions()) return false; - SetVector Worklist; - auto PushOperands = [this, &Worklist](MachineInstr &MI, - bool IgnoreSameBlock) { - for (auto &Op : MI.operands()) { - if (!Op.isReg() || !Op.isUse() || !Op.getReg().isVirtual() || - !isVectorRegClass(Op.getReg(), MRI)) - continue; + TII = ST.getInstrInfo(); - MachineInstr *DefMI = MRI->getVRegDef(Op.getReg()); - if (!isCandidate(*DefMI)) - continue; - - if (IgnoreSameBlock && DefMI->getParent() == MI.getParent()) - continue; - - Worklist.insert(DefMI); - } - }; - - // Do a first pass eagerly rewriting in roughly reverse instruction - // order, populate the worklist with any instructions we might need to - // revisit. We avoid adding definitions to the worklist if they're - // in the same block - we're about to visit them anyways. bool MadeChange = false; for (MachineBasicBlock &MBB : MF) { // Avoid unreachable blocks as they have degenerate dominance if (!MDT->isReachableFromEntry(&MBB)) continue; - for (auto &MI : reverse(MBB)) { + // For each instruction that defines a vector, compute what VL its + // downstream users demand. + for (const auto &MI : reverse(MBB)) { + if (!isCandidate(MI)) + continue; + DemandedVLs.insert({&MI, computeDemandedVL(MI)}); + } + + // Then go through and see if we can reduce the VL of any instructions to + // only what's demanded. + for (auto &MI : MBB) { if (!isCandidate(MI)) continue; if (!tryReduceVL(MI)) continue; MadeChange = true; - PushOperands(MI, /*IgnoreSameBlock*/ true); } - } - while (!Worklist.empty()) { - assert(MadeChange); - MachineInstr &MI = *Worklist.pop_back_val(); - assert(isCandidate(MI)); - if (!tryReduceVL(MI)) - continue; - PushOperands(MI, /*IgnoreSameBlock*/ false); + DemandedVLs.clear(); } return MadeChange; diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir index 8ae48e0b27e1e..2684e7c3b139c 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir @@ -8,8 +8,10 @@ body: | ; CHECK-LABEL: name: vop_vi ; CHECK: %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vop_vi_incompatible_eew @@ -18,8 +20,10 @@ body: | ; CHECK-LABEL: name: vop_vi_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vi_incompatible_emul @@ -28,8 +32,10 @@ body: | ; CHECK-LABEL: name: vop_vi_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vop_vv @@ -38,8 +44,10 @@ body: | ; CHECK-LABEL: name: vop_vv ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vop_vv_incompatible_eew @@ -48,8 +56,10 @@ body: | ; CHECK-LABEL: name: vop_vv_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- @@ -59,8 +69,10 @@ body: | ; CHECK-LABEL: name: vop_vv_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_vv_vd @@ -69,8 +81,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vd ; CHECK: early-clobber %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vwop_vv_vd_incompatible_eew @@ -79,8 +93,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_vv_vd_incompatible_emul @@ -89,8 +105,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_vv_vs2 @@ -99,8 +117,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: vwop_vv_vs2_incompatible_eew @@ -109,8 +129,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8m2 = COPY %y ... --- name: vwop_vv_vs2_incompatible_emul @@ -119,8 +141,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVWADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_vv_vs1 @@ -129,8 +153,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: vwop_vv_vs1_incompatible_eew @@ -139,8 +165,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 + $v8m2 = COPY %y ... --- name: vwop_vv_vs1_incompatible_emul @@ -149,8 +177,10 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_wv_vd @@ -159,8 +189,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vd ; CHECK: early-clobber %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vwop_wv_vd_incompatible_eew @@ -169,8 +201,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_wv_vd_incompatible_emul @@ -179,8 +213,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_wv_vs2 @@ -189,8 +225,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs2 ; CHECK: %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: vwop_wv_vs2_incompatible_eew @@ -199,8 +237,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs2_incompatible_eew ; CHECK: %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: vwop_wv_vs2_incompatible_emul @@ -209,8 +249,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVWADD_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVWADD_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwop_wv_vs1 @@ -219,8 +261,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: vwop_wv_vs1_incompatible_eew @@ -229,8 +273,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: vwop_wv_vs1_incompatible_emul @@ -239,8 +285,10 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: tied_vwop_wv_vs1 @@ -249,8 +297,10 @@ body: | ; CHECK-LABEL: name: tied_vwop_wv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: tied_vwop_wv_vs1_incompatible_eew @@ -259,8 +309,10 @@ body: | ; CHECK-LABEL: name: tied_vwop_wv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: tied_vwop_wv_vs1_incompatible_emul @@ -269,8 +321,10 @@ body: | ; CHECK-LABEL: name: tied_vwop_wv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 + $v8m2 = COPY %y ... --- name: vop_vf2_vd @@ -279,8 +333,10 @@ body: | ; CHECK-LABEL: name: vop_vf2_vd ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vf2_vd_incompatible_eew @@ -289,8 +345,10 @@ body: | ; CHECK-LABEL: name: vop_vf2_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vf2_vd_incompatible_emul @@ -299,8 +357,10 @@ body: | ; CHECK-LABEL: name: vop_vf2_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF2_MF2 $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF2_MF2 $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vf2_vs2 @@ -309,8 +369,10 @@ body: | ; CHECK-LABEL: name: vop_vf2_vs2 ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vf2_vs2_incompatible_eew @@ -319,8 +381,10 @@ body: | ; CHECK-LABEL: name: vop_vf2_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vf2_vs2_incompatible_emul @@ -329,8 +393,10 @@ body: | ; CHECK-LABEL: name: vop_vf2_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vf4_vd @@ -339,8 +405,10 @@ body: | ; CHECK-LABEL: name: vop_vf4_vd ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vop_vf4_vd_incompatible_eew @@ -349,8 +417,10 @@ body: | ; CHECK-LABEL: name: vop_vf4_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vop_vf4_vd_incompatible_emul @@ -359,8 +429,10 @@ body: | ; CHECK-LABEL: name: vop_vf4_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF4_MF2 $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF4_MF2 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vop_vf4_vs2 @@ -369,8 +441,10 @@ body: | ; CHECK-LABEL: name: vop_vf4_vs2 ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vop_vf4_vs2_incompatible_eew @@ -379,8 +453,10 @@ body: | ; CHECK-LABEL: name: vop_vf4_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vop_vf4_vs2_incompatible_emul @@ -389,8 +465,10 @@ body: | ; CHECK-LABEL: name: vop_vf4_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vop_vf8_vd @@ -399,8 +477,10 @@ body: | ; CHECK-LABEL: name: vop_vf8_vd ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, 1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 + $v8 = COPY %y ... --- name: vop_vf8_vd_incompatible_eew @@ -409,8 +489,10 @@ body: | ; CHECK-LABEL: name: vop_vf8_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vop_vf8_vd_incompatible_emul @@ -419,8 +501,10 @@ body: | ; CHECK-LABEL: name: vop_vf8_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 + $v8 = COPY %y ... --- name: vop_vf8_vs2 @@ -429,8 +513,10 @@ body: | ; CHECK-LABEL: name: vop_vf8_vs2 ; CHECK: %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 + $v8 = COPY %y ... --- name: vop_vf8_vs2_incompatible_eew @@ -439,8 +525,10 @@ body: | ; CHECK-LABEL: name: vop_vf8_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 + $v8 = COPY %y ... --- name: vop_vf8_vs2_incompatible_emul @@ -449,8 +537,10 @@ body: | ; CHECK-LABEL: name: vop_vf8_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vd @@ -459,8 +549,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vd ; CHECK: early-clobber %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vd_unsupported_eew @@ -469,8 +561,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vd_unsupported_eew ; CHECK: early-clobber %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vd_unsupported_emul @@ -479,8 +573,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vd_unsupported_emul ; CHECK: %x:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vs2 @@ -489,8 +585,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vs2_incompatible_eew @@ -499,8 +597,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vs2_incompatible_emul @@ -509,8 +609,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vs1 @@ -519,8 +621,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vs1_incompatible_eew @@ -529,8 +633,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vnop_wv_vs1_incompatible_emul @@ -539,8 +645,10 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vfnop_vs2 @@ -549,8 +657,10 @@ body: | ; CHECK-LABEL: name: vfnop_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vfnop_vs2_incompatible_eew @@ -559,8 +669,10 @@ body: | ; CHECK-LABEL: name: vfnop_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vfnop_vs2_incompatible_emul @@ -569,8 +681,10 @@ body: | ; CHECK-LABEL: name: vfnop_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vseN_v @@ -629,8 +743,10 @@ body: | ; CHECK-LABEL: name: vleN_v ; CHECK: %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vleN_v_incompatible_eew @@ -639,8 +755,10 @@ body: | ; CHECK-LABEL: name: vleN_v_incompatible_eew ; CHECK: %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vleN_v_incompatible_emul @@ -649,8 +767,10 @@ body: | ; CHECK-LABEL: name: vleN_v_incompatible_emul ; CHECK: %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vlm_v @@ -659,8 +779,10 @@ body: | ; CHECK-LABEL: name: vlm_v ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, 1, 0 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 + $v8 = COPY %y ... --- name: vlm_v_incompatible_eew @@ -669,8 +791,10 @@ body: | ; CHECK-LABEL: name: vlm_v_incompatible_eew ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vlm_v_incompatible_emul @@ -679,8 +803,10 @@ body: | ; CHECK-LABEL: name: vlm_v_incompatible_emul ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 + $v8 = COPY %y ... --- name: vsseN_v @@ -779,8 +905,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_data ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_v_incompatible_eew @@ -789,8 +917,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_v_data_incompatible_emul @@ -799,8 +929,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_data_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_v_idx @@ -809,8 +941,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_idx ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVLUXEI8_V_MF2_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_MF2_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_v_idx_incompatible_eew @@ -819,8 +953,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_idx_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_v_idx_incompatible_emul @@ -829,8 +965,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_idx_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_v_vd @@ -839,8 +977,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_vd ; CHECK: %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_v_vd_incompatible_eew @@ -849,8 +989,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_vd_incompatible_eew ; CHECK: %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vluxeiN_vd_incompatible_emul @@ -859,8 +1001,10 @@ body: | ; CHECK-LABEL: name: vluxeiN_vd_incompatible_emul ; CHECK: %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmop_mm @@ -869,8 +1013,10 @@ body: | ; CHECK-LABEL: name: vmop_mm ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, 1, 0 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 + $v8 = COPY %y ... --- name: vmop_mm_incompatible_eew @@ -879,8 +1025,10 @@ body: | ; CHECK-LABEL: name: vmop_mm_incompatible_eew ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmop_mm_incompatible_emul @@ -889,8 +1037,10 @@ body: | ; CHECK-LABEL: name: vmop_mm_incompatible_emul ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 + $v8 = COPY %y ... --- name: vmop_mm_mask @@ -899,8 +1049,10 @@ body: | ; CHECK-LABEL: name: vmop_mm_mask ; CHECK: %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, 1, 0 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmop_mm_mask_larger_emul_user @@ -909,8 +1061,10 @@ body: | ; CHECK-LABEL: name: vmop_mm_mask_larger_emul_user ; CHECK: %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, 1, 0 /* e8 */ ; CHECK-NEXT: %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 + $v8m2 = COPY %y ... --- name: vmop_mm_mask_incompatible_emul @@ -919,8 +1073,10 @@ body: | ; CHECK-LABEL: name: vmop_mm_mask_incompatible_emul ; CHECK: %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmop_vv @@ -929,8 +1085,10 @@ body: | ; CHECK-LABEL: name: vmop_vv ; CHECK: %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 + $v8 = COPY %y ... --- name: vmop_vv_maskuser @@ -939,8 +1097,10 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmop_vv_maskuser_incompatible_eew @@ -949,8 +1109,10 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser_incompatible_eew ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vmop_vv_incompatible_emul @@ -959,8 +1121,10 @@ body: | ; CHECK-LABEL: name: vmop_vv_incompatible_emul ; CHECK: %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 + $v8 = COPY %y ... --- name: vmop_vv_maskuser_incompaible_emul @@ -969,8 +1133,10 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser_incompaible_emul ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmop_vv_maskuser_larger_emul @@ -979,8 +1145,10 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser_larger_emul ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 + $v8m2 = COPY %y ... --- name: vmop_vv_consumer_incompatible_eew @@ -989,8 +1157,10 @@ body: | ; CHECK-LABEL: name: vmop_vv_consumer_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMSEQ_VV_M1 $noreg, %x, 1, 4 /* e16 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMSEQ_VV_M1 $noreg, %x, 1, 4 /* e16 */ + $v8 = COPY %y ... --- name: vmop_vv_consumer_incompatible_emul @@ -999,8 +1169,10 @@ body: | ; CHECK-LABEL: name: vmop_vv_consumer_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMSEQ_VV_MF2 $noreg, %x, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMSEQ_VV_MF2 $noreg, %x, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vim @@ -1009,8 +1181,10 @@ body: | ; CHECK-LABEL: name: vmerge_vim ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vim_incompatible_eew @@ -1019,8 +1193,10 @@ body: | ; CHECK-LABEL: name: vmerge_vim_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vim_incompatible_emul @@ -1029,8 +1205,10 @@ body: | ; CHECK-LABEL: name: vmerge_vim_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VIM_MF2 $noreg, %x, 9, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VIM_MF2 $noreg, %x, 9, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vxm @@ -1039,8 +1217,10 @@ body: | ; CHECK-LABEL: name: vmerge_vxm ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vxm_incompatible_eew @@ -1049,8 +1229,10 @@ body: | ; CHECK-LABEL: name: vmerge_vxm_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vxm_incompatible_emul @@ -1059,8 +1241,10 @@ body: | ; CHECK-LABEL: name: vmerge_vxm_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VXM_MF2 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VXM_MF2 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vvm @@ -1069,8 +1253,10 @@ body: | ; CHECK-LABEL: name: vmerge_vvm ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vvm_incompatible_eew @@ -1079,8 +1265,10 @@ body: | ; CHECK-LABEL: name: vmerge_vvm_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmerge_vvm_incompatible_emul @@ -1089,8 +1277,10 @@ body: | ; CHECK-LABEL: name: vmerge_vvm_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VVM_MF2 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VVM_MF2 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ + $v8 = COPY %y ... --- name: vmv_v_i @@ -1099,8 +1289,10 @@ body: | ; CHECK-LABEL: name: vmv_v_i ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_i_incompatible_eew @@ -1109,8 +1301,10 @@ body: | ; CHECK-LABEL: name: vmv_v_i_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_i_incompatible_emul @@ -1119,8 +1313,10 @@ body: | ; CHECK-LABEL: name: vmv_v_i_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_I_MF2 %x, 9, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_I_MF2 %x, 9, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_x @@ -1129,8 +1325,10 @@ body: | ; CHECK-LABEL: name: vmv_v_x ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_x_incompatible_eew @@ -1139,8 +1337,10 @@ body: | ; CHECK-LABEL: name: vmv_v_x_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_x_incompatible_emul @@ -1149,8 +1349,10 @@ body: | ; CHECK-LABEL: name: vmv_v_x_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_X_MF2 %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_X_MF2 %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_v @@ -1159,8 +1361,10 @@ body: | ; CHECK-LABEL: name: vmv_v_v ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_v_incompatible_eew @@ -1169,8 +1373,10 @@ body: | ; CHECK-LABEL: name: vmv_v_v_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vmv_v_v_incompatible_emul @@ -1179,8 +1385,10 @@ body: | ; CHECK-LABEL: name: vmv_v_v_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_V_MF2 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_V_MF2 $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: viota_m_dest @@ -1189,8 +1397,10 @@ body: | ; CHECK-LABEL: name: viota_m_dest ; CHECK: early-clobber %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: viota_m_dest_incompatible_eew @@ -1199,8 +1409,10 @@ body: | ; CHECK-LABEL: name: viota_m_dest_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: viota_m_dest_incompatible_emul @@ -1209,8 +1421,10 @@ body: | ; CHECK-LABEL: name: viota_m_dest_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: viota_m_mask @@ -1219,8 +1433,10 @@ body: | ; CHECK-LABEL: name: viota_m_mask ; CHECK: %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: viota_m_mask_scale_mask @@ -1229,8 +1445,10 @@ body: | ; CHECK-LABEL: name: viota_m_mask_scale_mask ; CHECK: early-clobber %x:vr = PseudoVMSEQ_VV_M2 $noreg, $noreg, 1, 4 /* e16 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M2 $noreg, $noreg, -1, 4 /* e16 */ %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: viota_m_mask_incompatible_emul_from_sew @@ -1239,8 +1457,10 @@ body: | ; CHECK-LABEL: name: viota_m_mask_incompatible_emul_from_sew ; CHECK: %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: viota_m_mask_incompatible_emul_from_lmul @@ -1249,8 +1469,10 @@ body: | ; CHECK-LABEL: name: viota_m_mask_incompatible_emul_from_lmul ; CHECK: %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_MF2 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 %y:vr = PseudoVIOTA_M_MF2 $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vred_vs2 @@ -1259,8 +1481,10 @@ body: | ; CHECK-LABEL: name: vred_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vred_vs1 @@ -1269,8 +1493,10 @@ body: | ; CHECK-LABEL: name: vred_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vred_vs1_vs2 @@ -1279,8 +1505,10 @@ body: | ; CHECK-LABEL: name: vred_vs1_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vred_vs1_vs2_incompatible_eew @@ -1289,8 +1517,10 @@ body: | ; CHECK-LABEL: name: vred_vs1_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vred_vs1_vs2_incompatible_emul @@ -1299,8 +1529,10 @@ body: | ; CHECK-LABEL: name: vred_vs1_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_MF2_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_MF2_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vred_other_user_is_vl0 @@ -1310,9 +1542,13 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v9 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 + $v8 = COPY %y + $v9 = COPY %z ... --- name: vred_both_vl0 @@ -1322,9 +1558,13 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v9 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 + $v8 = COPY %y + $v9 = COPY %z ... --- name: vred_vl0_and_vlreg @@ -1335,10 +1575,14 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v9 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, %vl, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 + $v8 = COPY %y + $v9 = COPY %z ... --- name: vred_vlreg_and_vl0 @@ -1349,10 +1593,14 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v9 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 + $v8 = COPY %y + $v9 = COPY %z ... --- name: vred_other_user_is_vl2 @@ -1362,9 +1610,13 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v9 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 + $v8 = COPY %y + $v9 = COPY %z ... --- name: vwred_vs2 @@ -1373,8 +1625,10 @@ body: | ; CHECK-LABEL: name: vwred_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwred_vs1 @@ -1383,8 +1637,10 @@ body: | ; CHECK-LABEL: name: vwred_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwred_vs1_incompatible_eew @@ -1393,8 +1649,10 @@ body: | ; CHECK-LABEL: name: vwred_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwred_vs2_incompatible_eew @@ -1403,8 +1661,10 @@ body: | ; CHECK-LABEL: name: vwred_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vwred_incompatible_emul @@ -1413,8 +1673,10 @@ body: | ; CHECK-LABEL: name: vwred_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_MF2_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWREDSUM_VS_MF2_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vfred_vs2 @@ -1423,8 +1685,10 @@ body: | ; CHECK-LABEL: name: vfred_vs2 ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vfred_vs1 @@ -1433,8 +1697,10 @@ body: | ; CHECK-LABEL: name: vfred_vs1 ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, $noreg, %x, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vfred_vs1_vs2 @@ -1443,8 +1709,10 @@ body: | ; CHECK-LABEL: name: vfred_vs1_vs2 ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vfred_vs1_vs2_incompatible_eew @@ -1453,8 +1721,10 @@ body: | ; CHECK-LABEL: name: vfred_vs1_vs2_incompatible_eew ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 6 /* e64 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vfred_vs1_vs2_incompatible_emul @@ -1463,8 +1733,10 @@ body: | ; CHECK-LABEL: name: vfred_vs1_vs2_incompatible_emul ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_MF2_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_MF2_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 + $v8 = COPY %y ... --- name: vfirst_v diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir index 7a28eaaaa5d8b..f85ce5821eae5 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir @@ -12,9 +12,11 @@ body: | ; CHECK-NEXT: %vl:gprnox0 = COPY $x1 ; CHECK-NEXT: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */ + $v8 = COPY %y ... --- name: vredsum_vv_user @@ -28,10 +30,12 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */ + $v8 = COPY %z ... --- name: use_largest_common_vl_imm_imm @@ -41,9 +45,11 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 + $v8 = COPY %z ... --- name: use_largest_common_vl_same_reg @@ -57,10 +63,14 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v8 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 + $v8 = COPY %y + $v8 = COPY %z ... --- name: use_largest_common_vl_diff_regs @@ -75,11 +85,15 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v8 = COPY %z %vl0:gprnox0 = COPY $x1 %vl1:gprnox0 = COPY $x2 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0 + $v8 = COPY %y + $v8 = COPY %z ... --- name: use_largest_common_vl_imm_reg @@ -93,10 +107,14 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y + ; CHECK-NEXT: $v8 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y + $v8 = COPY %z ... --- name: use_largest_common_vl_imm_vlmax @@ -106,9 +124,11 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0 + $v8 = COPY %z ... --- name: vfcvt_x_f_v_nofpexcept @@ -117,8 +137,10 @@ body: | ; CHECK-LABEL: name: vfcvt_x_f_v_nofpexcept ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vfcvt_x_f_v_fpexcept @@ -127,8 +149,10 @@ body: | ; CHECK-LABEL: name: vfcvt_x_f_v_fpexcept ; CHECK: %x:vr = PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 + $v8 = COPY %y ... --- name: vfncvtbf16_f_f_w_nofpexcept @@ -137,8 +161,10 @@ body: | ; CHECK-LABEL: name: vfncvtbf16_f_f_w_nofpexcept ; CHECK: early-clobber %x:vr = nofpexcept PseudoVFNCVTBF16_F_F_W_M1_E16 $noreg, $noreg, 7, 1, 4 /* e16 */, 0 /* tu, mu */, implicit $frm ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFNCVTBF16_F_F_W_M1_E16 $noreg, $noreg, 7, -1, 4 /* e16 */, 0 /* tu, mu */, implicit $frm %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 + $v8 = COPY %y ... --- name: vwadd_tied_vs1 @@ -147,8 +173,10 @@ body: | ; CHECK-LABEL: name: vwadd_tied_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ + $v8m2 = COPY %y ... --- name: crossbb diff --git a/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll b/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll index 65e6eddfb3cd6..c5cc5a560a427 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll @@ -5,22 +5,22 @@ ; GitHub Issue #123862 provided a case where the riscv-vl-optimizer pass was ; very slow. It was found that that case benefited greatly from aborting due -; to CommonVL == VLOp. Adding the case provided in the issue would show up +; to DemandedVL == VLOp. Adding the case provided in the issue would show up ; as a long running test instead of a test failure. We would likley have a hard ; time figuring if that case had a regression. So instead, we check this output ; which was responsible for speeding it up. define @same_vl_imm( %passthru, %a, %b) { - ; CHECK: User VL is: 4 - ; CHECK-NEXT: Abort due to CommonVL == VLOp, no point in reducing. + ; CHECK: Demanded VL is: 4 + ; CHECK: Abort due to DemandedVL == VLOp, no point in reducing. %v = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %a, %b, i64 4) %w = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %v, %a, i64 4) ret %w } define @same_vl_reg( %passthru, %a, %b, i64 %vl) { - ; CHECK: User VL is: %3:gprnox0 - ; CHECK-NEXT: Abort due to CommonVL == VLOp, no point in reducing. + ; CHECK: Demanded VL is: %3:gprnox0 + ; CHECK: Abort due to DemandedVL == VLOp, no point in reducing. %v = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %a, %b, i64 %vl) %w = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %v, %a, i64 %vl) ret %w From 46c590edbc98065dc10bff1669e1c49dbf47c4fa Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Mon, 27 Jan 2025 23:52:14 +0800 Subject: [PATCH 04/10] Update comments, remove redundant isSupportedInstr check, rename CommonVL -> DemandedVL --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 41 +++++++++++----------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 697327170d5f2..8cd4761aa89aa 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -52,7 +52,9 @@ class RISCVVLOptimizer : public MachineFunctionPass { private: MachineOperand getMinimumVLForUser(MachineOperand &UserOp); - /// Computes the VL of \p MI that is actually used by its users. + /// Computes the minimum demanded VL of \p MI, i.e. the minimum VL that's used + /// by its users downstream. + /// Returns 0 if MI has no users. MachineOperand computeDemandedVL(const MachineInstr &MI); bool tryReduceVL(MachineInstr &MI); bool isCandidate(const MachineInstr &MI) const; @@ -1208,13 +1210,10 @@ MachineOperand RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { // If we know the demanded VL of UserMI, then we can reduce the VL it // requires. if (DemandedVLs.contains(&UserMI)) { - // We can only shrink the demanded VL if the elementwise result doesn't - // depend on VL (i.e. not vredsum/viota etc.) - // Also conservatively restrict to supported instructions for now. - // TODO: Can we remove the isSupportedInstr check? + // We can only shrink the VL used if the elementwise result doesn't depend + // on VL (i.e. not vredsum/viota etc.) if (!RISCVII::elementsDependOnVL( - TII->get(RISCV::getRVVMCOpcode(UserMI.getOpcode())).TSFlags) && - isSupportedInstr(UserMI)) { + TII->get(RISCV::getRVVMCOpcode(UserMI.getOpcode())).TSFlags)) { const MachineOperand &DemandedVL = DemandedVLs.at(&UserMI); if (RISCV::isVLKnownLE(DemandedVL, VLOp)) return DemandedVL; @@ -1244,13 +1243,14 @@ MachineOperand RISCVVLOptimizer::computeDemandedVL(const MachineInstr &MI) { const MachineOperand &VLOp = getMinimumVLForUser(UserOp); - // Use the largest VL among all the users. If we cannot determine this - // statically, then we cannot optimize the VL. + // The minimum demanded VL is the largest VL read amongst all the users. If + // we cannot determine this statically, then we cannot optimize the VL. if (RISCV::isVLKnownLE(DemandedVL, VLOp)) { DemandedVL = VLOp; LLVM_DEBUG(dbgs() << " Demanded VL is: " << VLOp << "\n"); } else if (!RISCV::isVLKnownLE(VLOp, DemandedVL)) { - LLVM_DEBUG(dbgs() << " Abort because cannot determine a common VL\n"); + LLVM_DEBUG( + dbgs() << " Abort because cannot determine the demanded VL\n"); return VLMAX; } @@ -1305,7 +1305,7 @@ bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { if (!CommonVL) return false; - assert((CommonVL.isImm() || CommonVL.getReg().isVirtual()) && + assert((DemandedVL.isImm() || DemandedVL.getReg().isVirtual()) && "Expected VL to be an Imm or virtual Reg"); if (!RISCV::isVLKnownLE(*CommonVL, VLOp)) { @@ -1313,28 +1313,29 @@ bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { return false; } - if (CommonVL.isIdenticalTo(VLOp)) { + if (DemandedVL.isIdenticalTo(VLOp)) { LLVM_DEBUG( dbgs() << " Abort due to DemandedVL == VLOp, no point in reducing.\n"); return false; } - if (CommonVL.isImm()) { + if (DemandedVL.isImm()) { LLVM_DEBUG(dbgs() << " Reduce VL from " << VLOp << " to " - << CommonVL.getImm() << " for " << MI << "\n"); - VLOp.ChangeToImmediate(CommonVL.getImm()); + << DemandedVL.getImm() << " for " << MI << "\n"); + VLOp.ChangeToImmediate(DemandedVL.getImm()); return true; } - const MachineInstr *VLMI = MRI->getVRegDef(CommonVL.getReg()); + const MachineInstr *VLMI = MRI->getVRegDef(DemandedVL.getReg()); if (!MDT->dominates(VLMI, &MI)) return false; - LLVM_DEBUG(dbgs() << " Reduce VL from " << VLOp << " to " - << printReg(CommonVL.getReg(), MRI->getTargetRegisterInfo()) - << " for " << MI << "\n"); + LLVM_DEBUG( + dbgs() << " Reduce VL from " << VLOp << " to " + << printReg(DemandedVL.getReg(), MRI->getTargetRegisterInfo()) + << " for " << MI << "\n"); // All our checks passed. We can reduce VL. - VLOp.ChangeToRegister(CommonVL.getReg(), false); + VLOp.ChangeToRegister(DemandedVL.getReg(), false); return true; } From ed23fc8f7e9410c3112587f8c590375db456684b Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Tue, 28 Jan 2025 19:06:40 +0800 Subject: [PATCH 05/10] Undo renames + put back std::optional --- llvm/lib/Target/RISCV/RISCVInstrInfo.cpp | 2 - llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 79 ++++++++++---------- llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll | 10 +-- 3 files changed, 44 insertions(+), 47 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp index c2b1ee390583b..12a7af0750813 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -4241,8 +4241,6 @@ unsigned RISCV::getDestLog2EEW(const MCInstrDesc &Desc, unsigned Log2SEW) { /// Given two VL operands, do we know that LHS <= RHS? bool RISCV::isVLKnownLE(const MachineOperand &LHS, const MachineOperand &RHS) { - if (LHS.isImm() && LHS.getImm() == 0) - return true; if (LHS.isReg() && RHS.isReg() && LHS.getReg().isVirtual() && LHS.getReg() == RHS.getReg()) return true; diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 8cd4761aa89aa..7de4af66b19fa 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -51,11 +51,10 @@ class RISCVVLOptimizer : public MachineFunctionPass { StringRef getPassName() const override { return PASS_NAME; } private: - MachineOperand getMinimumVLForUser(MachineOperand &UserOp); - /// Computes the minimum demanded VL of \p MI, i.e. the minimum VL that's used - /// by its users downstream. - /// Returns 0 if MI has no users. - MachineOperand computeDemandedVL(const MachineInstr &MI); + std::optional getMinimumVLForUser(MachineOperand &UserOp); + /// Returns the largest common VL MachineOperand that may be used to optimize + /// MI. Returns std::nullopt if it failed to find a suitable VL. + std::optional checkUsers(MachineInstr &MI); bool tryReduceVL(MachineInstr &MI); bool isCandidate(const MachineInstr &MI) const; @@ -1179,14 +1178,15 @@ bool RISCVVLOptimizer::isCandidate(const MachineInstr &MI) const { return true; } -MachineOperand RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { +std::optional +RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { const MachineInstr &UserMI = *UserOp.getParent(); const MCInstrDesc &Desc = UserMI.getDesc(); if (!RISCVII::hasVLOp(Desc.TSFlags) || !RISCVII::hasSEWOp(Desc.TSFlags)) { LLVM_DEBUG(dbgs() << " Abort due to lack of VL, assume that" " use VLMAX\n"); - return MachineOperand::CreateImm(RISCV::VLMaxSentinel); + return std::nullopt; } // Instructions like reductions may use a vector register as a scalar @@ -1223,40 +1223,39 @@ MachineOperand RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { return VLOp; } -MachineOperand RISCVVLOptimizer::computeDemandedVL(const MachineInstr &MI) { - const MachineOperand &VLMAX = MachineOperand::CreateImm(RISCV::VLMaxSentinel); - MachineOperand DemandedVL = MachineOperand::CreateImm(0); - +std::optional RISCVVLOptimizer::checkUsers(MachineInstr &MI) { + std::optional CommonVL; for (auto &UserOp : MRI->use_operands(MI.getOperand(0).getReg())) { const MachineInstr &UserMI = *UserOp.getParent(); LLVM_DEBUG(dbgs() << " Checking user: " << UserMI << "\n"); if (mayReadPastVL(UserMI)) { LLVM_DEBUG(dbgs() << " Abort because used by unsafe instruction\n"); - return VLMAX; + return std::nullopt; } // If used as a passthru, elements past VL will be read. if (UserOp.isTied()) { LLVM_DEBUG(dbgs() << " Abort because user used as tied operand\n"); - return VLMAX; + return std::nullopt; } - const MachineOperand &VLOp = getMinimumVLForUser(UserOp); - - // The minimum demanded VL is the largest VL read amongst all the users. If - // we cannot determine this statically, then we cannot optimize the VL. - if (RISCV::isVLKnownLE(DemandedVL, VLOp)) { - DemandedVL = VLOp; - LLVM_DEBUG(dbgs() << " Demanded VL is: " << VLOp << "\n"); - } else if (!RISCV::isVLKnownLE(VLOp, DemandedVL)) { - LLVM_DEBUG( - dbgs() << " Abort because cannot determine the demanded VL\n"); - return VLMAX; + auto VLOp = getMinimumVLForUser(UserOp); + if (!VLOp) + return std::nullopt; + + // Use the largest VL among all the users. If we cannot determine this + // statically, then we cannot optimize the VL. + if (!CommonVL || RISCV::isVLKnownLE(*CommonVL, *VLOp)) { + CommonVL = *VLOp; + LLVM_DEBUG(dbgs() << " User VL is: " << VLOp << "\n"); + } else if (!RISCV::isVLKnownLE(*VLOp, *CommonVL)) { + LLVM_DEBUG(dbgs() << " Abort because cannot determine a common VL\n"); + return std::nullopt; } if (!RISCVII::hasSEWOp(UserMI.getDesc().TSFlags)) { LLVM_DEBUG(dbgs() << " Abort due to lack of SEW operand\n"); - return VLMAX; + return std::nullopt; } std::optional ConsumerInfo = getOperandInfo(UserOp, MRI); @@ -1266,7 +1265,7 @@ MachineOperand RISCVVLOptimizer::computeDemandedVL(const MachineInstr &MI) { LLVM_DEBUG(dbgs() << " Abort due to unknown operand information.\n"); LLVM_DEBUG(dbgs() << " ConsumerInfo is: " << ConsumerInfo << "\n"); LLVM_DEBUG(dbgs() << " ProducerInfo is: " << ProducerInfo << "\n"); - return VLMAX; + return std::nullopt; } // If the operand is used as a scalar operand, then the EEW must be @@ -1281,11 +1280,11 @@ MachineOperand RISCVVLOptimizer::computeDemandedVL(const MachineInstr &MI) { << " Abort due to incompatible information for EMUL or EEW.\n"); LLVM_DEBUG(dbgs() << " ConsumerInfo is: " << ConsumerInfo << "\n"); LLVM_DEBUG(dbgs() << " ProducerInfo is: " << ProducerInfo << "\n"); - return VLMAX; + return std::nullopt; } } - return DemandedVL; + return CommonVL; } bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { @@ -1305,7 +1304,7 @@ bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { if (!CommonVL) return false; - assert((DemandedVL.isImm() || DemandedVL.getReg().isVirtual()) && + assert((CommonVL->isImm() || CommonVL->getReg().isVirtual()) && "Expected VL to be an Imm or virtual Reg"); if (!RISCV::isVLKnownLE(*CommonVL, VLOp)) { @@ -1313,29 +1312,28 @@ bool RISCVVLOptimizer::tryReduceVL(MachineInstr &MI) { return false; } - if (DemandedVL.isIdenticalTo(VLOp)) { + if (CommonVL->isIdenticalTo(VLOp)) { LLVM_DEBUG( - dbgs() - << " Abort due to DemandedVL == VLOp, no point in reducing.\n"); + dbgs() << " Abort due to CommonVL == VLOp, no point in reducing.\n"); return false; } - if (DemandedVL.isImm()) { + if (CommonVL->isImm()) { LLVM_DEBUG(dbgs() << " Reduce VL from " << VLOp << " to " - << DemandedVL.getImm() << " for " << MI << "\n"); - VLOp.ChangeToImmediate(DemandedVL.getImm()); + << CommonVL->getImm() << " for " << MI << "\n"); + VLOp.ChangeToImmediate(CommonVL->getImm()); return true; } - const MachineInstr *VLMI = MRI->getVRegDef(DemandedVL.getReg()); + const MachineInstr *VLMI = MRI->getVRegDef(CommonVL->getReg()); if (!MDT->dominates(VLMI, &MI)) return false; LLVM_DEBUG( dbgs() << " Reduce VL from " << VLOp << " to " - << printReg(DemandedVL.getReg(), MRI->getTargetRegisterInfo()) + << printReg(CommonVL->getReg(), MRI->getTargetRegisterInfo()) << " for " << MI << "\n"); // All our checks passed. We can reduce VL. - VLOp.ChangeToRegister(DemandedVL.getReg(), false); + VLOp.ChangeToRegister(CommonVL->getReg(), false); return true; } @@ -1360,10 +1358,11 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { // For each instruction that defines a vector, compute what VL its // downstream users demand. - for (const auto &MI : reverse(MBB)) { + for (MachineInstr &MI : reverse(MBB)) { if (!isCandidate(MI)) continue; - DemandedVLs.insert({&MI, computeDemandedVL(MI)}); + if (auto DemandedVL = checkUsers(MI)) + DemandedVLs.insert({&MI, *DemandedVL}); } // Then go through and see if we can reduce the VL of any instructions to diff --git a/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll b/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll index c5cc5a560a427..a14268af85bc8 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vlopt-same-vl.ll @@ -5,22 +5,22 @@ ; GitHub Issue #123862 provided a case where the riscv-vl-optimizer pass was ; very slow. It was found that that case benefited greatly from aborting due -; to DemandedVL == VLOp. Adding the case provided in the issue would show up +; to CommonVL == VLOp. Adding the case provided in the issue would show up ; as a long running test instead of a test failure. We would likley have a hard ; time figuring if that case had a regression. So instead, we check this output ; which was responsible for speeding it up. define @same_vl_imm( %passthru, %a, %b) { - ; CHECK: Demanded VL is: 4 - ; CHECK: Abort due to DemandedVL == VLOp, no point in reducing. + ; CHECK: User VL is: 4 + ; CHECK: Abort due to CommonVL == VLOp, no point in reducing. %v = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %a, %b, i64 4) %w = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %v, %a, i64 4) ret %w } define @same_vl_reg( %passthru, %a, %b, i64 %vl) { - ; CHECK: Demanded VL is: %3:gprnox0 - ; CHECK: Abort due to DemandedVL == VLOp, no point in reducing. + ; CHECK: User VL is: %3:gprnox0 + ; CHECK: Abort due to CommonVL == VLOp, no point in reducing. %v = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %a, %b, i64 %vl) %w = call @llvm.riscv.vadd.nxv4i32.nxv4i32( poison, %v, %a, i64 %vl) ret %w From 61004a91338dc1abd5f43ed7668f93267ee77560 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Tue, 28 Jan 2025 20:02:21 +0800 Subject: [PATCH 06/10] Do cross-block analysis with post-order traversal, add assert + test for unreachable blocks. --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 21 ++++++++++----------- llvm/test/CodeGen/RISCV/rvv/vl-opt.mir | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 7de4af66b19fa..2f344f659e3ef 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -18,7 +18,7 @@ #include "RISCV.h" #include "RISCVSubtarget.h" -#include "llvm/ADT/SetVector.h" +#include "llvm/ADT/PostOrderIterator.h" #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/InitializePasses.h" @@ -1350,21 +1350,22 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { TII = ST.getInstrInfo(); - bool MadeChange = false; - for (MachineBasicBlock &MBB : MF) { - // Avoid unreachable blocks as they have degenerate dominance - if (!MDT->isReachableFromEntry(&MBB)) - continue; - // For each instruction that defines a vector, compute what VL its - // downstream users demand. - for (MachineInstr &MI : reverse(MBB)) { + // For each instruction that defines a vector, compute what VL its + // downstream users demand. + for (MachineBasicBlock *MBB : post_order(&MF)) { + // Avoid unreachable blocks as they have degenerate dominance + assert(MDT->isReachableFromEntry(MBB)); + for (MachineInstr &MI : reverse(*MBB)) { if (!isCandidate(MI)) continue; if (auto DemandedVL = checkUsers(MI)) DemandedVLs.insert({&MI, *DemandedVL}); } + } + bool MadeChange = false; + for (MachineBasicBlock &MBB : MF) { // Then go through and see if we can reduce the VL of any instructions to // only what's demanded. for (auto &MI : MBB) { @@ -1374,8 +1375,6 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { continue; MadeChange = true; } - - DemandedVLs.clear(); } return MadeChange; diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir index f85ce5821eae5..f761f08408d34 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir @@ -223,3 +223,23 @@ body: | %c:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ BEQ $x1, $x0, %bb.1 PseudoBR %bb.2 +... +--- +name: unreachable +body: | + ; CHECK-LABEL: name: unreachable + ; CHECK: bb.0: + ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: $v8 = COPY %x + ; CHECK-NEXT: PseudoRET + ; CHECK-NEXT: {{ $}} + ; CHECK-NEXT: bb.1: + ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + ; CHECK-NEXT: PseudoRET + bb.0: + %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ + $v8 = COPY %x + PseudoRET + bb.1: + %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ + PseudoRET From 343dba9d30e0dc94caf6925535e30651739724f6 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Tue, 28 Jan 2025 20:07:59 +0800 Subject: [PATCH 07/10] clang-format --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 2f344f659e3ef..9fd25ee59e2fb 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -1350,7 +1350,6 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { TII = ST.getInstrInfo(); - // For each instruction that defines a vector, compute what VL its // downstream users demand. for (MachineBasicBlock *MBB : post_order(&MF)) { @@ -1360,7 +1359,7 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { if (!isCandidate(MI)) continue; if (auto DemandedVL = checkUsers(MI)) - DemandedVLs.insert({&MI, *DemandedVL}); + DemandedVLs.insert({&MI, *DemandedVL}); } } From c65518ce07501f562be3f13dbe6aae8ad08f5ae4 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Tue, 28 Jan 2025 20:18:35 +0800 Subject: [PATCH 08/10] Remove more parts of the diff --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 9fd25ee59e2fb..250b2d31149ba 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -1353,7 +1353,6 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { // For each instruction that defines a vector, compute what VL its // downstream users demand. for (MachineBasicBlock *MBB : post_order(&MF)) { - // Avoid unreachable blocks as they have degenerate dominance assert(MDT->isReachableFromEntry(MBB)); for (MachineInstr &MI : reverse(*MBB)) { if (!isCandidate(MI)) @@ -1363,11 +1362,15 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { } } + // Then go through and see if we can reduce the VL of any instructions to + // only what's demanded. bool MadeChange = false; for (MachineBasicBlock &MBB : MF) { - // Then go through and see if we can reduce the VL of any instructions to - // only what's demanded. - for (auto &MI : MBB) { + // Avoid unreachable blocks as they have degenerate dominance + if (!MDT->isReachableFromEntry(&MBB)) + continue; + + for (auto &MI : reverse(MBB)) { if (!isCandidate(MI)) continue; if (!tryReduceVL(MI)) From 1bf77168128c2ca6ca309b65ac9a065bfaf1381f Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 29 Jan 2025 01:28:45 +0800 Subject: [PATCH 09/10] Use std::optional in DenseMap, remove TII check given everything in demandedVL must be a candidate --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 250b2d31149ba..1d7b75c065c2f 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -33,7 +33,6 @@ namespace { class RISCVVLOptimizer : public MachineFunctionPass { const MachineRegisterInfo *MRI; const MachineDominatorTree *MDT; - const TargetInstrInfo *TII; public: static char ID; @@ -60,7 +59,7 @@ class RISCVVLOptimizer : public MachineFunctionPass { /// For a given instruction, records what elements of it are demanded by /// downstream users. - DenseMap DemandedVLs; + DenseMap> DemandedVLs; }; } // end anonymous namespace @@ -1209,15 +1208,10 @@ RISCVVLOptimizer::getMinimumVLForUser(MachineOperand &UserOp) { // If we know the demanded VL of UserMI, then we can reduce the VL it // requires. - if (DemandedVLs.contains(&UserMI)) { - // We can only shrink the VL used if the elementwise result doesn't depend - // on VL (i.e. not vredsum/viota etc.) - if (!RISCVII::elementsDependOnVL( - TII->get(RISCV::getRVVMCOpcode(UserMI.getOpcode())).TSFlags)) { - const MachineOperand &DemandedVL = DemandedVLs.at(&UserMI); - if (RISCV::isVLKnownLE(DemandedVL, VLOp)) - return DemandedVL; - } + if (auto DemandedVL = DemandedVLs[&UserMI]) { + assert(isCandidate(UserMI)); + if (RISCV::isVLKnownLE(*DemandedVL, VLOp)) + return DemandedVL; } return VLOp; @@ -1348,8 +1342,6 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { if (!ST.hasVInstructions()) return false; - TII = ST.getInstrInfo(); - // For each instruction that defines a vector, compute what VL its // downstream users demand. for (MachineBasicBlock *MBB : post_order(&MF)) { From 6264a898b2b3c5071d6163fd5039f6f92fbcecc3 Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 29 Jan 2025 11:20:06 +0800 Subject: [PATCH 10/10] Remove COPYs from tests that are no longer needed, make insert unconditional --- llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp | 3 +- .../test/CodeGen/RISCV/rvv/vl-opt-op-info.mir | 272 ------------------ llvm/test/CodeGen/RISCV/rvv/vl-opt.mir | 36 +-- 3 files changed, 2 insertions(+), 309 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp index 1d7b75c065c2f..6c4d1b48b6ffc 100644 --- a/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp +++ b/llvm/lib/Target/RISCV/RISCVVLOptimizer.cpp @@ -1349,8 +1349,7 @@ bool RISCVVLOptimizer::runOnMachineFunction(MachineFunction &MF) { for (MachineInstr &MI : reverse(*MBB)) { if (!isCandidate(MI)) continue; - if (auto DemandedVL = checkUsers(MI)) - DemandedVLs.insert({&MI, *DemandedVL}); + DemandedVLs.insert({&MI, checkUsers(MI)}); } } diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir index 2684e7c3b139c..8ae48e0b27e1e 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt-op-info.mir @@ -8,10 +8,8 @@ body: | ; CHECK-LABEL: name: vop_vi ; CHECK: %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vop_vi_incompatible_eew @@ -20,10 +18,8 @@ body: | ; CHECK-LABEL: name: vop_vi_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vi_incompatible_emul @@ -32,10 +28,8 @@ body: | ; CHECK-LABEL: name: vop_vi_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VI_M1 $noreg, $noreg, 9, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vop_vv @@ -44,10 +38,8 @@ body: | ; CHECK-LABEL: name: vop_vv ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vop_vv_incompatible_eew @@ -56,10 +48,8 @@ body: | ; CHECK-LABEL: name: vop_vv_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- @@ -69,10 +59,8 @@ body: | ; CHECK-LABEL: name: vop_vv_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_vv_vd @@ -81,10 +69,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vd ; CHECK: early-clobber %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vwop_vv_vd_incompatible_eew @@ -93,10 +79,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_vv_vd_incompatible_emul @@ -105,10 +89,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_vv_vs2 @@ -117,10 +99,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: vwop_vv_vs2_incompatible_eew @@ -129,10 +109,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8m2 = COPY %y ... --- name: vwop_vv_vs2_incompatible_emul @@ -141,10 +119,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVWADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_vv_vs1 @@ -153,10 +129,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: vwop_vv_vs1_incompatible_eew @@ -165,10 +139,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 - $v8m2 = COPY %y ... --- name: vwop_vv_vs1_incompatible_emul @@ -177,10 +149,8 @@ body: | ; CHECK-LABEL: name: vwop_vv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWADD_VV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_wv_vd @@ -189,10 +159,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vd ; CHECK: early-clobber %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vwop_wv_vd_incompatible_eew @@ -201,10 +169,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_wv_vd_incompatible_emul @@ -213,10 +179,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVWADD_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 4 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_wv_vs2 @@ -225,10 +189,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs2 ; CHECK: %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: vwop_wv_vs2_incompatible_eew @@ -237,10 +199,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs2_incompatible_eew ; CHECK: %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vrm2 = PseudoVADD_VV_M2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: vwop_wv_vs2_incompatible_emul @@ -249,10 +209,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVWADD_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVWADD_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwop_wv_vs1 @@ -261,10 +219,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: vwop_wv_vs1_incompatible_eew @@ -273,10 +229,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: vwop_wv_vs1_incompatible_emul @@ -285,10 +239,8 @@ body: | ; CHECK-LABEL: name: vwop_wv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: tied_vwop_wv_vs1 @@ -297,10 +249,8 @@ body: | ; CHECK-LABEL: name: tied_vwop_wv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: tied_vwop_wv_vs1_incompatible_eew @@ -309,10 +259,8 @@ body: | ; CHECK-LABEL: name: tied_vwop_wv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: tied_vwop_wv_vs1_incompatible_emul @@ -321,10 +269,8 @@ body: | ; CHECK-LABEL: name: tied_vwop_wv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 - $v8m2 = COPY %y ... --- name: vop_vf2_vd @@ -333,10 +279,8 @@ body: | ; CHECK-LABEL: name: vop_vf2_vd ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vf2_vd_incompatible_eew @@ -345,10 +289,8 @@ body: | ; CHECK-LABEL: name: vop_vf2_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF2_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vf2_vd_incompatible_emul @@ -357,10 +299,8 @@ body: | ; CHECK-LABEL: name: vop_vf2_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF2_MF2 $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF2_MF2 $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vf2_vs2 @@ -369,10 +309,8 @@ body: | ; CHECK-LABEL: name: vop_vf2_vs2 ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vf2_vs2_incompatible_eew @@ -381,10 +319,8 @@ body: | ; CHECK-LABEL: name: vop_vf2_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vf2_vs2_incompatible_emul @@ -393,10 +329,8 @@ body: | ; CHECK-LABEL: name: vop_vf2_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF2_M1 $noreg, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vf4_vd @@ -405,10 +339,8 @@ body: | ; CHECK-LABEL: name: vop_vf4_vd ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vop_vf4_vd_incompatible_eew @@ -417,10 +349,8 @@ body: | ; CHECK-LABEL: name: vop_vf4_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF4_M1 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vop_vf4_vd_incompatible_emul @@ -429,10 +359,8 @@ body: | ; CHECK-LABEL: name: vop_vf4_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF4_MF2 $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF4_MF2 $noreg, $noreg, -1, 5 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vop_vf4_vs2 @@ -441,10 +369,8 @@ body: | ; CHECK-LABEL: name: vop_vf4_vs2 ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vop_vf4_vs2_incompatible_eew @@ -453,10 +379,8 @@ body: | ; CHECK-LABEL: name: vop_vf4_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vop_vf4_vs2_incompatible_emul @@ -465,10 +389,8 @@ body: | ; CHECK-LABEL: name: vop_vf4_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF4_M1 $noreg, %x, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vop_vf8_vd @@ -477,10 +399,8 @@ body: | ; CHECK-LABEL: name: vop_vf8_vd ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, 1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 - $v8 = COPY %y ... --- name: vop_vf8_vd_incompatible_eew @@ -489,10 +409,8 @@ body: | ; CHECK-LABEL: name: vop_vf8_vd_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vop_vf8_vd_incompatible_emul @@ -501,10 +419,8 @@ body: | ; CHECK-LABEL: name: vop_vf8_vd_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVZEXT_VF8_M1 $noreg, $noreg, -1, 6 /* e64 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 6 /* e64 */, 0 - $v8 = COPY %y ... --- name: vop_vf8_vs2 @@ -513,10 +429,8 @@ body: | ; CHECK-LABEL: name: vop_vf8_vs2 ; CHECK: %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 - $v8 = COPY %y ... --- name: vop_vf8_vs2_incompatible_eew @@ -525,10 +439,8 @@ body: | ; CHECK-LABEL: name: vop_vf8_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF8 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 - $v8 = COPY %y ... --- name: vop_vf8_vs2_incompatible_emul @@ -537,10 +449,8 @@ body: | ; CHECK-LABEL: name: vop_vf8_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVZEXT_VF8_M1 $noreg, %x, 1, 6 /* e64 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vd @@ -549,10 +459,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vd ; CHECK: early-clobber %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vd_unsupported_eew @@ -561,10 +469,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vd_unsupported_eew ; CHECK: early-clobber %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVNSRL_WV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vd_unsupported_emul @@ -573,10 +479,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vd_unsupported_emul ; CHECK: %x:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vs2 @@ -585,10 +489,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vs2_incompatible_eew @@ -597,10 +499,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vs2_incompatible_emul @@ -609,10 +509,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vs1 @@ -621,10 +519,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs1 ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vs1_incompatible_eew @@ -633,10 +529,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vnop_wv_vs1_incompatible_emul @@ -645,10 +539,8 @@ body: | ; CHECK-LABEL: name: vnop_wv_vs1_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVNSRL_WV_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vfnop_vs2 @@ -657,10 +549,8 @@ body: | ; CHECK-LABEL: name: vfnop_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vfnop_vs2_incompatible_eew @@ -669,10 +559,8 @@ body: | ; CHECK-LABEL: name: vfnop_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vfnop_vs2_incompatible_emul @@ -681,10 +569,8 @@ body: | ; CHECK-LABEL: name: vfnop_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 early-clobber %y:vr = PseudoVFNCVT_X_F_W_MF2 $noreg, %x, 0, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vseN_v @@ -743,10 +629,8 @@ body: | ; CHECK-LABEL: name: vleN_v ; CHECK: %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vleN_v_incompatible_eew @@ -755,10 +639,8 @@ body: | ; CHECK-LABEL: name: vleN_v_incompatible_eew ; CHECK: %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vleN_v_incompatible_emul @@ -767,10 +649,8 @@ body: | ; CHECK-LABEL: name: vleN_v_incompatible_emul ; CHECK: %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLE8_V_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vlm_v @@ -779,10 +659,8 @@ body: | ; CHECK-LABEL: name: vlm_v ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, 1, 0 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 - $v8 = COPY %y ... --- name: vlm_v_incompatible_eew @@ -791,10 +669,8 @@ body: | ; CHECK-LABEL: name: vlm_v_incompatible_eew ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vlm_v_incompatible_emul @@ -803,10 +679,8 @@ body: | ; CHECK-LABEL: name: vlm_v_incompatible_emul ; CHECK: %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLM_V_B8 $noreg, $noreg, -1, 0, 0 %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 - $v8 = COPY %y ... --- name: vsseN_v @@ -905,10 +779,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_data ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_v_incompatible_eew @@ -917,10 +789,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_v_data_incompatible_emul @@ -929,10 +799,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_data_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_v_idx @@ -941,10 +809,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_idx ; CHECK: %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVLUXEI8_V_MF2_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_MF2 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_MF2_M1 $noreg, $noreg, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_v_idx_incompatible_eew @@ -953,10 +819,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_idx_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_v_idx_incompatible_emul @@ -965,10 +829,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_idx_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVLUXEI8_V_MF2_MF2 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_v_vd @@ -977,10 +839,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_vd ; CHECK: %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_v_vd_incompatible_eew @@ -989,10 +849,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_v_vd_incompatible_eew ; CHECK: %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vluxeiN_vd_incompatible_emul @@ -1001,10 +859,8 @@ body: | ; CHECK-LABEL: name: vluxeiN_vd_incompatible_emul ; CHECK: %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVLUXEI8_V_M1_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmop_mm @@ -1013,10 +869,8 @@ body: | ; CHECK-LABEL: name: vmop_mm ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, 1, 0 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 - $v8 = COPY %y ... --- name: vmop_mm_incompatible_eew @@ -1025,10 +879,8 @@ body: | ; CHECK-LABEL: name: vmop_mm_incompatible_eew ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vr = PseudoVADD_VV_M1 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmop_mm_incompatible_emul @@ -1037,10 +889,8 @@ body: | ; CHECK-LABEL: name: vmop_mm_incompatible_emul ; CHECK: %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 - $v8 = COPY %y ... --- name: vmop_mm_mask @@ -1049,10 +899,8 @@ body: | ; CHECK-LABEL: name: vmop_mm_mask ; CHECK: %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, 1, 0 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmop_mm_mask_larger_emul_user @@ -1061,10 +909,8 @@ body: | ; CHECK-LABEL: name: vmop_mm_mask_larger_emul_user ; CHECK: %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, 1, 0 /* e8 */ ; CHECK-NEXT: %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 - $v8m2 = COPY %y ... --- name: vmop_mm_mask_incompatible_emul @@ -1073,10 +919,8 @@ body: | ; CHECK-LABEL: name: vmop_mm_mask_incompatible_emul ; CHECK: %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMAND_MM_B8 $noreg, $noreg, -1, 0 %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmop_vv @@ -1085,10 +929,8 @@ body: | ; CHECK-LABEL: name: vmop_vv ; CHECK: %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vr = PseudoVMAND_MM_B8 $noreg, %x, 1, 0 - $v8 = COPY %y ... --- name: vmop_vv_maskuser @@ -1097,10 +939,8 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmop_vv_maskuser_incompatible_eew @@ -1109,10 +949,8 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser_incompatible_eew ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrnov0 = PseudoVADD_VV_M1_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vmop_vv_incompatible_emul @@ -1121,10 +959,8 @@ body: | ; CHECK-LABEL: name: vmop_vv_incompatible_emul ; CHECK: %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ ; CHECK-NEXT: %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vr = PseudoVMAND_MM_B16 $noreg, %x, 1, 0 - $v8 = COPY %y ... --- name: vmop_vv_maskuser_incompaible_emul @@ -1133,10 +969,8 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser_incompaible_emul ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ ; CHECK-NEXT: %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrnov0 = PseudoVADD_VV_MF2_MASK $noreg, $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmop_vv_maskuser_larger_emul @@ -1145,10 +979,8 @@ body: | ; CHECK-LABEL: name: vmop_vv_maskuser_larger_emul ; CHECK: %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vmv0 = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vrm2nov0 = PseudoVADD_VV_M2_MASK $noreg, $noreg, $noreg, %x, 1, 4 /* e16 */, 0 - $v8m2 = COPY %y ... --- name: vmop_vv_consumer_incompatible_eew @@ -1157,10 +989,8 @@ body: | ; CHECK-LABEL: name: vmop_vv_consumer_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMSEQ_VV_M1 $noreg, %x, 1, 4 /* e16 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMSEQ_VV_M1 $noreg, %x, 1, 4 /* e16 */ - $v8 = COPY %y ... --- name: vmop_vv_consumer_incompatible_emul @@ -1169,10 +999,8 @@ body: | ; CHECK-LABEL: name: vmop_vv_consumer_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMSEQ_VV_MF2 $noreg, %x, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMSEQ_VV_MF2 $noreg, %x, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vim @@ -1181,10 +1009,8 @@ body: | ; CHECK-LABEL: name: vmerge_vim ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vim_incompatible_eew @@ -1193,10 +1019,8 @@ body: | ; CHECK-LABEL: name: vmerge_vim_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrnov0 = PseudoVMERGE_VIM_M1 $noreg, %x, 9, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vim_incompatible_emul @@ -1205,10 +1029,8 @@ body: | ; CHECK-LABEL: name: vmerge_vim_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VIM_MF2 $noreg, %x, 9, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VIM_MF2 $noreg, %x, 9, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vxm @@ -1217,10 +1039,8 @@ body: | ; CHECK-LABEL: name: vmerge_vxm ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vxm_incompatible_eew @@ -1229,10 +1049,8 @@ body: | ; CHECK-LABEL: name: vmerge_vxm_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrnov0 = PseudoVMERGE_VXM_M1 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vxm_incompatible_emul @@ -1241,10 +1059,8 @@ body: | ; CHECK-LABEL: name: vmerge_vxm_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VXM_MF2 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VXM_MF2 $noreg, %x, $noreg, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vvm @@ -1253,10 +1069,8 @@ body: | ; CHECK-LABEL: name: vmerge_vvm ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vvm_incompatible_eew @@ -1265,10 +1079,8 @@ body: | ; CHECK-LABEL: name: vmerge_vvm_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vrnov0 = PseudoVMERGE_VVM_M1 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmerge_vvm_incompatible_emul @@ -1277,10 +1089,8 @@ body: | ; CHECK-LABEL: name: vmerge_vvm_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vrnov0 = PseudoVMERGE_VVM_MF2 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vrnov0 = PseudoVMERGE_VVM_MF2 $noreg, $noreg, %x, $v0, 1, 3 /* e8 */ - $v8 = COPY %y ... --- name: vmv_v_i @@ -1289,10 +1099,8 @@ body: | ; CHECK-LABEL: name: vmv_v_i ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_i_incompatible_eew @@ -1301,10 +1109,8 @@ body: | ; CHECK-LABEL: name: vmv_v_i_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVMV_V_I_M1 %x, 9, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_i_incompatible_emul @@ -1313,10 +1119,8 @@ body: | ; CHECK-LABEL: name: vmv_v_i_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_I_MF2 %x, 9, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_I_MF2 %x, 9, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_x @@ -1325,10 +1129,8 @@ body: | ; CHECK-LABEL: name: vmv_v_x ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_x_incompatible_eew @@ -1337,10 +1139,8 @@ body: | ; CHECK-LABEL: name: vmv_v_x_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVMV_V_X_M1 %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_x_incompatible_emul @@ -1349,10 +1149,8 @@ body: | ; CHECK-LABEL: name: vmv_v_x_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_X_MF2 %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_X_MF2 %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_v @@ -1361,10 +1159,8 @@ body: | ; CHECK-LABEL: name: vmv_v_v ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_v_incompatible_eew @@ -1373,10 +1169,8 @@ body: | ; CHECK-LABEL: name: vmv_v_v_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVMV_V_V_M1 $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vmv_v_v_incompatible_emul @@ -1385,10 +1179,8 @@ body: | ; CHECK-LABEL: name: vmv_v_v_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVMV_V_V_MF2 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVMV_V_V_MF2 $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: viota_m_dest @@ -1397,10 +1189,8 @@ body: | ; CHECK-LABEL: name: viota_m_dest ; CHECK: early-clobber %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: viota_m_dest_incompatible_eew @@ -1409,10 +1199,8 @@ body: | ; CHECK-LABEL: name: viota_m_dest_incompatible_eew ; CHECK: early-clobber %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: viota_m_dest_incompatible_emul @@ -1421,10 +1209,8 @@ body: | ; CHECK-LABEL: name: viota_m_dest_incompatible_emul ; CHECK: early-clobber %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVIOTA_M_M1 $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_MF2 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: viota_m_mask @@ -1433,10 +1219,8 @@ body: | ; CHECK-LABEL: name: viota_m_mask ; CHECK: %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, 1, 3 /* e8 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M1 $noreg, $noreg, -1, 3 /* e8 */ %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: viota_m_mask_scale_mask @@ -1445,10 +1229,8 @@ body: | ; CHECK-LABEL: name: viota_m_mask_scale_mask ; CHECK: early-clobber %x:vr = PseudoVMSEQ_VV_M2 $noreg, $noreg, 1, 4 /* e16 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMSEQ_VV_M2 $noreg, $noreg, -1, 4 /* e16 */ %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: viota_m_mask_incompatible_emul_from_sew @@ -1457,10 +1239,8 @@ body: | ; CHECK-LABEL: name: viota_m_mask_incompatible_emul_from_sew ; CHECK: %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 %y:vr = PseudoVIOTA_M_M1 $noreg, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: viota_m_mask_incompatible_emul_from_lmul @@ -1469,10 +1249,8 @@ body: | ; CHECK-LABEL: name: viota_m_mask_incompatible_emul_from_lmul ; CHECK: %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 /* e8 */ ; CHECK-NEXT: early-clobber %y:vr = PseudoVIOTA_M_MF2 $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVMAND_MM_B1 $noreg, $noreg, -1, 0 %y:vr = PseudoVIOTA_M_MF2 $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vred_vs2 @@ -1481,10 +1259,8 @@ body: | ; CHECK-LABEL: name: vred_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vred_vs1 @@ -1493,10 +1269,8 @@ body: | ; CHECK-LABEL: name: vred_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vred_vs1_vs2 @@ -1505,10 +1279,8 @@ body: | ; CHECK-LABEL: name: vred_vs1_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vred_vs1_vs2_incompatible_eew @@ -1517,10 +1289,8 @@ body: | ; CHECK-LABEL: name: vred_vs1_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_M1_E8 $noreg, %x, %x, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vred_vs1_vs2_incompatible_emul @@ -1529,10 +1299,8 @@ body: | ; CHECK-LABEL: name: vred_vs1_vs2_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDAND_VS_MF2_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDAND_VS_MF2_E8 $noreg, %x, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vred_other_user_is_vl0 @@ -1542,13 +1310,9 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v9 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 - $v8 = COPY %y - $v9 = COPY %z ... --- name: vred_both_vl0 @@ -1558,13 +1322,9 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v9 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 - $v8 = COPY %y - $v9 = COPY %z ... --- name: vred_vl0_and_vlreg @@ -1575,14 +1335,10 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v9 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, %vl, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 0, 3 /* e8 */, 0 - $v8 = COPY %y - $v9 = COPY %z ... --- name: vred_vlreg_and_vl0 @@ -1593,14 +1349,10 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v9 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 0, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 - $v8 = COPY %y - $v9 = COPY %z ... --- name: vred_other_user_is_vl2 @@ -1610,13 +1362,9 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v9 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 - $v8 = COPY %y - $v9 = COPY %z ... --- name: vwred_vs2 @@ -1625,10 +1373,8 @@ body: | ; CHECK-LABEL: name: vwred_vs2 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwred_vs1 @@ -1637,10 +1383,8 @@ body: | ; CHECK-LABEL: name: vwred_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwred_vs1_incompatible_eew @@ -1649,10 +1393,8 @@ body: | ; CHECK-LABEL: name: vwred_vs1_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwred_vs2_incompatible_eew @@ -1661,10 +1403,8 @@ body: | ; CHECK-LABEL: name: vwred_vs2_incompatible_eew ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWREDSUM_VS_M1_E8 $noreg, $noreg, %x, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vwred_incompatible_emul @@ -1673,10 +1413,8 @@ body: | ; CHECK-LABEL: name: vwred_incompatible_emul ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVWREDSUM_VS_MF2_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVWREDSUM_VS_MF2_E8 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vfred_vs2 @@ -1685,10 +1423,8 @@ body: | ; CHECK-LABEL: name: vfred_vs2 ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, $noreg, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vfred_vs1 @@ -1697,10 +1433,8 @@ body: | ; CHECK-LABEL: name: vfred_vs1 ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, $noreg, %x, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, $noreg, %x, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vfred_vs1_vs2 @@ -1709,10 +1443,8 @@ body: | ; CHECK-LABEL: name: vfred_vs1_vs2 ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vfred_vs1_vs2_incompatible_eew @@ -1721,10 +1453,8 @@ body: | ; CHECK-LABEL: name: vfred_vs1_vs2_incompatible_eew ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 6 /* e64 */, 0 %y:vr = PseudoVFREDMAX_VS_M1_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vfred_vs1_vs2_incompatible_emul @@ -1733,10 +1463,8 @@ body: | ; CHECK-LABEL: name: vfred_vs1_vs2_incompatible_emul ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVFREDMAX_VS_MF2_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 5 /* e32 */, 0 %y:vr = PseudoVFREDMAX_VS_MF2_E32 $noreg, %x, %x, 1, 5 /* e32 */, 0 - $v8 = COPY %y ... --- name: vfirst_v diff --git a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir index f761f08408d34..e753a0b7ea378 100644 --- a/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir +++ b/llvm/test/CodeGen/RISCV/rvv/vl-opt.mir @@ -12,11 +12,9 @@ body: | ; CHECK-NEXT: %vl:gprnox0 = COPY $x1 ; CHECK-NEXT: %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_MF4 $noreg, $noreg, $noreg, -1, 4 /* e16 */, 0 /* tu, mu */ %y:vr = PseudoVNSRL_WV_MF4 $noreg, %x, $noreg, %vl, 4 /* e16 */, 0 /* tu, mu */ - $v8 = COPY %y ... --- name: vredsum_vv_user @@ -30,12 +28,10 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 5 /* e32 */, 0 /* tu, mu */ %y:vr = PseudoVREDSUM_VS_M1_E64 $noreg, %x, $noreg, -1, 6 /* e64 */, 0 /* tu, mu */ %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 5 /* e32 */, 0 /* tu, mu */ - $v8 = COPY %z ... --- name: use_largest_common_vl_imm_imm @@ -45,11 +41,9 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 2, 3 /* e8 */, 0 - $v8 = COPY %z ... --- name: use_largest_common_vl_same_reg @@ -63,14 +57,10 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v8 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 - $v8 = COPY %y - $v8 = COPY %z ... --- name: use_largest_common_vl_diff_regs @@ -85,15 +75,11 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v8 = COPY %z %vl0:gprnox0 = COPY $x1 %vl1:gprnox0 = COPY $x2 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl0, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl1, 3 /* e8 */, 0 - $v8 = COPY %y - $v8 = COPY %z ... --- name: use_largest_common_vl_imm_reg @@ -107,14 +93,10 @@ body: | ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y - ; CHECK-NEXT: $v8 = COPY %z %vl:gprnox0 = COPY $x1 %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, %vl, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y - $v8 = COPY %z ... --- name: use_largest_common_vl_imm_vlmax @@ -124,11 +106,9 @@ body: | ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %z %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 %z:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, -1, 3 /* e8 */, 0 - $v8 = COPY %z ... --- name: vfcvt_x_f_v_nofpexcept @@ -137,10 +117,8 @@ body: | ; CHECK-LABEL: name: vfcvt_x_f_v_nofpexcept ; CHECK: %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vfcvt_x_f_v_fpexcept @@ -149,10 +127,8 @@ body: | ; CHECK-LABEL: name: vfcvt_x_f_v_fpexcept ; CHECK: %x:vr = PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = PseudoVFCVT_X_F_V_M1 $noreg, $noreg, 0, -1, 3 /* e32 */, 0 %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 - $v8 = COPY %y ... --- name: vfncvtbf16_f_f_w_nofpexcept @@ -161,10 +137,8 @@ body: | ; CHECK-LABEL: name: vfncvtbf16_f_f_w_nofpexcept ; CHECK: early-clobber %x:vr = nofpexcept PseudoVFNCVTBF16_F_F_W_M1_E16 $noreg, $noreg, 7, 1, 4 /* e16 */, 0 /* tu, mu */, implicit $frm ; CHECK-NEXT: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %y %x:vr = nofpexcept PseudoVFNCVTBF16_F_F_W_M1_E16 $noreg, $noreg, 7, -1, 4 /* e16 */, 0 /* tu, mu */, implicit $frm %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 4 /* e16 */, 0 - $v8 = COPY %y ... --- name: vwadd_tied_vs1 @@ -173,10 +147,8 @@ body: | ; CHECK-LABEL: name: vwadd_tied_vs1 ; CHECK: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: early-clobber %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8m2 = COPY %y %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ %y:vrm2 = PseudoVWADD_WV_M1_TIED $noreg, %x, 1, 3 /* e8 */, 0 /* tu, mu */ - $v8m2 = COPY %y ... --- name: crossbb @@ -190,13 +162,11 @@ body: | ; CHECK-NEXT: bb.1: ; CHECK-NEXT: %a1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %a2:vr = PseudoVADD_VV_M1 $noreg, %a1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %a2 ; CHECK-NEXT: PseudoRET ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.2: ; CHECK-NEXT: %b1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: %b2:vr = PseudoVADD_VV_M1 $noreg, %b1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %b2 ; CHECK-NEXT: PseudoRET ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.3: @@ -211,12 +181,10 @@ body: | bb.1: %a1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ %a2:vr = PseudoVADD_VV_M1 $noreg, %a1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - $v8 = COPY %a2 PseudoRET bb.2: %b1:vr = PseudoVADD_VV_M1 $noreg, %c, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ %b2:vr = PseudoVADD_VV_M1 $noreg, %b1, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ - $v8 = COPY %b2 PseudoRET bb.3: liveins: $x1 @@ -229,8 +197,7 @@ name: unreachable body: | ; CHECK-LABEL: name: unreachable ; CHECK: bb.0: - ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ - ; CHECK-NEXT: $v8 = COPY %x + ; CHECK-NEXT: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */ ; CHECK-NEXT: PseudoRET ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: bb.1: @@ -238,7 +205,6 @@ body: | ; CHECK-NEXT: PseudoRET bb.0: %x:vr = PseudoVADD_VV_M1 $noreg, $noreg, $noreg, -1, 3 /* e8 */, 0 /* tu, mu */ - $v8 = COPY %x PseudoRET bb.1: %y:vr = PseudoVADD_VV_M1 $noreg, %x, $noreg, 1, 3 /* e8 */, 0 /* tu, mu */