diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-08-17 14:24:24 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-08-17 14:24:24 +0000 |
commit | 39a979c838114383ca5dc6bc99ae22c315a4636a (patch) | |
tree | d0ff1dc07276ef9fbd493a6655c9f1c6bed383c1 | |
parent | 3291f9aa8168408ce5ef4757012c06c196a72c41 (diff) | |
download | bcm5719-llvm-39a979c838114383ca5dc6bc99ae22c315a4636a.tar.gz bcm5719-llvm-39a979c838114383ca5dc6bc99ae22c315a4636a.zip |
[Hexagon] Expand vgather pseudos during packetization
This will allow packetizing the vgather expansion with other instructions.
llvm-svn: 340028
-rw-r--r-- | llvm/lib/Target/Hexagon/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonGatherPacketize.cpp | 104 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp | 162 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfo.h | 2 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp | 47 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/Hexagon/no-packets-gather.ll | 6 | ||||
-rw-r--r-- | llvm/test/CodeGen/Hexagon/vgather-packetize.mir | 31 |
9 files changed, 157 insertions, 212 deletions
diff --git a/llvm/lib/Target/Hexagon/CMakeLists.txt b/llvm/lib/Target/Hexagon/CMakeLists.txt index a9f606c54eb..59377f4f359 100644 --- a/llvm/lib/Target/Hexagon/CMakeLists.txt +++ b/llvm/lib/Target/Hexagon/CMakeLists.txt @@ -29,7 +29,6 @@ add_llvm_target(HexagonCodeGen HexagonExpandCondsets.cpp HexagonFixupHwLoops.cpp HexagonFrameLowering.cpp - HexagonGatherPacketize.cpp HexagonGenExtract.cpp HexagonGenInsert.cpp HexagonGenMux.cpp diff --git a/llvm/lib/Target/Hexagon/HexagonGatherPacketize.cpp b/llvm/lib/Target/Hexagon/HexagonGatherPacketize.cpp deleted file mode 100644 index 63ec9c3d312..00000000000 --- a/llvm/lib/Target/Hexagon/HexagonGatherPacketize.cpp +++ /dev/null @@ -1,104 +0,0 @@ -//===- HexagonGatherPacketize.cpp -----------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// This pass ensures that producer and consumer of VTMP are paired in a bundle. -//===----------------------------------------------------------------------===// - -#define DEBUG_TYPE "gather-packetize" - -#include "HexagonTargetMachine.h" -#include "llvm/CodeGen/MachineFunctionPass.h" -#include "llvm/CodeGen/MachineInstrBundle.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/Debug.h" -using namespace llvm; - -cl::opt<bool> EnableGatherPacketize( - "hexagon-enable-gather-packetize", cl::Hidden, cl::init(true), - cl::desc("Generate gather packets before packetization")); - -namespace llvm { -FunctionPass *createHexagonGatherPacketize(); -void initializeHexagonGatherPacketizePass(PassRegistry &); -} - -namespace { -class HexagonGatherPacketize : public MachineFunctionPass { -public: - static char ID; - HexagonGatherPacketize() : MachineFunctionPass(ID) { - PassRegistry &Registry = *PassRegistry::getPassRegistry(); - initializeHexagonGatherPacketizePass(Registry); - } - - StringRef getPassName() const override { - return "Hexagon Gather Packetize Code"; - } - bool runOnMachineFunction(MachineFunction &Fn) override; -}; - -char HexagonGatherPacketize::ID = 0; - -static inline bool isVtmpDef(const MachineInstr &MI) { - for (const MachineOperand &MO : MI.operands()) - if (MO.isReg() && MO.isDef() && MO.isImplicit() && - (MO.getReg() == Hexagon::VTMP)) { - return true; - } - return false; -} - -static inline bool isVtmpUse(const MachineInstr &MI) { - return (MI.mayStore() && (MI.getOperand(2)).isReg() && - ((MI.getOperand(2)).getReg() == Hexagon::VTMP)); -} - -bool HexagonGatherPacketize::runOnMachineFunction(MachineFunction &Fn) { - if (!EnableGatherPacketize) - return false; - auto &ST = Fn.getSubtarget<HexagonSubtarget>(); - bool HasV65 = ST.hasV65Ops(); - bool UseHVX = ST.useHVXOps(); - if (!(HasV65 & UseHVX)) - return false; - - for (auto &MBB : Fn) { - bool VtmpDef = false; - MachineBasicBlock::iterator MII, MIE, DefMII; - for (MII = MBB.begin(), MIE = MBB.end(); MII != MIE; ++MII) { - MachineInstr &MI = *MII; - if (VtmpDef) { - if (!isVtmpUse(MI)) - continue; - MBB.splice(std::next(DefMII), &MBB, MII); - finalizeBundle(MBB, DefMII.getInstrIterator(), - std::next(MII).getInstrIterator()); - VtmpDef = false; - continue; - } - if (!(isVtmpDef(MI))) - continue; - VtmpDef = true; - DefMII = MII; - } - assert(!VtmpDef && "VTMP producer and consumer not in same block"); - } - return true; -} -} - -//===----------------------------------------------------------------------===// -// Public Constructor Functions -//===----------------------------------------------------------------------===// - -INITIALIZE_PASS(HexagonGatherPacketize, "hexagon-gather-packetize", - "Hexagon gather packetize Code", false, false) - -FunctionPass *llvm::createHexagonGatherPacketize() { - return new HexagonGatherPacketize(); -} diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp index 03ec645a82c..77eb28329f3 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -1341,81 +1341,6 @@ bool HexagonInstrInfo::expandPostRAPseudo(MachineInstr &MI) const { MI.setDesc(get(Hexagon::J2_jumprfnew)); return true; - case Hexagon::V6_vgathermh_pseudo: - BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermh)) - .add(MI.getOperand(1)) - .add(MI.getOperand(2)) - .add(MI.getOperand(3)); - BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) - .add(MI.getOperand(0)) - .addImm(0) - .addReg(Hexagon::VTMP); - MBB.erase(MI); - return true; - - case Hexagon::V6_vgathermw_pseudo: - BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermw)) - .add(MI.getOperand(1)) - .add(MI.getOperand(2)) - .add(MI.getOperand(3)); - BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) - .add(MI.getOperand(0)) - .addImm(0) - .addReg(Hexagon::VTMP); - MBB.erase(MI); - return true; - - case Hexagon::V6_vgathermhw_pseudo: - BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermhw)) - .add(MI.getOperand(1)) - .add(MI.getOperand(2)) - .add(MI.getOperand(3)); - BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) - .add(MI.getOperand(0)) - .addImm(0) - .addReg(Hexagon::VTMP); - MBB.erase(MI); - return true; - - case Hexagon::V6_vgathermhq_pseudo: - BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermhq)) - .add(MI.getOperand(1)) - .add(MI.getOperand(2)) - .add(MI.getOperand(3)) - .add(MI.getOperand(4)); - BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) - .add(MI.getOperand(0)) - .addImm(0) - .addReg(Hexagon::VTMP); - MBB.erase(MI); - return true; - - case Hexagon::V6_vgathermwq_pseudo: - BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermwq)) - .add(MI.getOperand(1)) - .add(MI.getOperand(2)) - .add(MI.getOperand(3)) - .add(MI.getOperand(4)); - BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) - .add(MI.getOperand(0)) - .addImm(0) - .addReg(Hexagon::VTMP); - MBB.erase(MI); - return true; - - case Hexagon::V6_vgathermhwq_pseudo: - BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermhwq)) - .add(MI.getOperand(1)) - .add(MI.getOperand(2)) - .add(MI.getOperand(3)) - .add(MI.getOperand(4)); - BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) - .add(MI.getOperand(0)) - .addImm(0) - .addReg(Hexagon::VTMP); - MBB.erase(MI); - return true; - case Hexagon::PS_loadrub_pci: return RealCirc(Hexagon::L2_loadrub_pci, /*HasImm*/true, /*MxOp*/4); case Hexagon::PS_loadrb_pci: @@ -1465,6 +1390,93 @@ bool HexagonInstrInfo::expandPostRAPseudo(MachineInstr &MI) const { return false; } +MachineBasicBlock::instr_iterator +HexagonInstrInfo::expandVGatherPseudo(MachineInstr &MI) const { + MachineBasicBlock &MBB = *MI.getParent(); + const DebugLoc &DL = MI.getDebugLoc(); + unsigned Opc = MI.getOpcode(); + MachineBasicBlock::iterator First; + + switch (Opc) { + case Hexagon::V6_vgathermh_pseudo: + First = BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermh)) + .add(MI.getOperand(1)) + .add(MI.getOperand(2)) + .add(MI.getOperand(3)); + BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) + .add(MI.getOperand(0)) + .addImm(0) + .addReg(Hexagon::VTMP); + MBB.erase(MI); + return First.getInstrIterator(); + + case Hexagon::V6_vgathermw_pseudo: + First = BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermw)) + .add(MI.getOperand(1)) + .add(MI.getOperand(2)) + .add(MI.getOperand(3)); + BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) + .add(MI.getOperand(0)) + .addImm(0) + .addReg(Hexagon::VTMP); + MBB.erase(MI); + return First.getInstrIterator(); + + case Hexagon::V6_vgathermhw_pseudo: + First = BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermhw)) + .add(MI.getOperand(1)) + .add(MI.getOperand(2)) + .add(MI.getOperand(3)); + BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) + .add(MI.getOperand(0)) + .addImm(0) + .addReg(Hexagon::VTMP); + MBB.erase(MI); + return First.getInstrIterator(); + + case Hexagon::V6_vgathermhq_pseudo: + First = BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermhq)) + .add(MI.getOperand(1)) + .add(MI.getOperand(2)) + .add(MI.getOperand(3)) + .add(MI.getOperand(4)); + BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) + .add(MI.getOperand(0)) + .addImm(0) + .addReg(Hexagon::VTMP); + MBB.erase(MI); + return First.getInstrIterator(); + + case Hexagon::V6_vgathermwq_pseudo: + First = BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermwq)) + .add(MI.getOperand(1)) + .add(MI.getOperand(2)) + .add(MI.getOperand(3)) + .add(MI.getOperand(4)); + BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) + .add(MI.getOperand(0)) + .addImm(0) + .addReg(Hexagon::VTMP); + MBB.erase(MI); + return First.getInstrIterator(); + + case Hexagon::V6_vgathermhwq_pseudo: + First = BuildMI(MBB, MI, DL, get(Hexagon::V6_vgathermhwq)) + .add(MI.getOperand(1)) + .add(MI.getOperand(2)) + .add(MI.getOperand(3)) + .add(MI.getOperand(4)); + BuildMI(MBB, MI, DL, get(Hexagon::V6_vS32b_new_ai)) + .add(MI.getOperand(0)) + .addImm(0) + .addReg(Hexagon::VTMP); + MBB.erase(MI); + return First.getInstrIterator(); + } + + return MI.getIterator(); +} + // We indicate that we want to reverse the branch by // inserting the reversed branching opcode. bool HexagonInstrInfo::reverseBranchCondition( diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h index 96b4ffaba02..817b27ede8f 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.h +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.h @@ -472,6 +472,8 @@ public: uint64_t getType(const MachineInstr &MI) const; unsigned getUnits(const MachineInstr &MI) const; + MachineBasicBlock::instr_iterator expandVGatherPseudo(MachineInstr &MI) const; + /// getInstrTimingClassLatency - Compute the instruction latency of a given /// instruction using Timing Class information, if available. unsigned nonDbgBBSize(const MachineBasicBlock *BB) const; diff --git a/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp b/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp index c9ffc7eb774..184e5b77418 100644 --- a/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp +++ b/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp @@ -153,7 +153,6 @@ namespace llvm { FunctionPass *createHexagonCopyToCombine(); FunctionPass *createHexagonEarlyIfConversion(); FunctionPass *createHexagonFixupHwLoops(); - FunctionPass *createHexagonGatherPacketize(); FunctionPass *createHexagonGenExtract(); FunctionPass *createHexagonGenInsert(); FunctionPass *createHexagonGenMux(); @@ -165,7 +164,7 @@ namespace llvm { FunctionPass *createHexagonNewValueJump(); FunctionPass *createHexagonOptimizeSZextends(); FunctionPass *createHexagonOptAddrMode(); - FunctionPass *createHexagonPacketizer(); + FunctionPass *createHexagonPacketizer(bool Minimal); FunctionPass *createHexagonPeephole(); FunctionPass *createHexagonRDFOpt(); FunctionPass *createHexagonSplitConst32AndConst64(); @@ -409,7 +408,6 @@ void HexagonPassConfig::addPreEmitPass() { addPass(createHexagonBranchRelaxation()); - // Create Packets. if (!NoOpt) { if (!DisableHardwareLoops) addPass(createHexagonFixupHwLoops()); @@ -418,12 +416,8 @@ void HexagonPassConfig::addPreEmitPass() { addPass(createHexagonGenMux()); } - // Create packets for 2 instructions that consitute a gather instruction. - // Do this regardless of the opt level. - addPass(createHexagonGatherPacketize(), false); - - if (!NoOpt) - addPass(createHexagonPacketizer(), false); + // Packetization is mandatory: it handles gather/scatter at all opt levels. + addPass(createHexagonPacketizer(NoOpt), false); if (EnableVectorPrint) addPass(createHexagonVectorPrint(), false); diff --git a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp index 56ab69db9bd..ce271141bbf 100644 --- a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp +++ b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.cpp @@ -77,7 +77,7 @@ extern cl::opt<bool> ScheduleInlineAsm; namespace llvm { -FunctionPass *createHexagonPacketizer(); +FunctionPass *createHexagonPacketizer(bool Minimal); void initializeHexagonPacketizerPass(PassRegistry&); } // end namespace llvm @@ -88,7 +88,8 @@ namespace { public: static char ID; - HexagonPacketizer() : MachineFunctionPass(ID) {} + HexagonPacketizer(bool Min = false) + : MachineFunctionPass(ID), Minimal(Min) {} void getAnalysisUsage(AnalysisUsage &AU) const override { AU.setPreservesCFG(); @@ -112,6 +113,7 @@ namespace { private: const HexagonInstrInfo *HII; const HexagonRegisterInfo *HRI; + const bool Minimal; }; } // end anonymous namespace @@ -129,8 +131,9 @@ INITIALIZE_PASS_END(HexagonPacketizer, "hexagon-packetizer", HexagonPacketizerList::HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI, AliasAnalysis *AA, - const MachineBranchProbabilityInfo *MBPI) - : VLIWPacketizerList(MF, MLI, AA), MBPI(MBPI), MLI(&MLI) { + const MachineBranchProbabilityInfo *MBPI, bool Minimal) + : VLIWPacketizerList(MF, MLI, AA), MBPI(MBPI), MLI(&MLI), + Minimal(Minimal) { HII = MF.getSubtarget<HexagonSubtarget>().getInstrInfo(); HRI = MF.getSubtarget<HexagonSubtarget>().getRegisterInfo(); @@ -200,9 +203,6 @@ static MachineBasicBlock::iterator moveInstrOut(MachineInstr &MI, bool HexagonPacketizer::runOnMachineFunction(MachineFunction &MF) { auto &HST = MF.getSubtarget<HexagonSubtarget>(); - if (DisablePacketizer || !HST.usePackets() || skipFunction(MF.getFunction())) - return false; - HII = HST.getInstrInfo(); HRI = HST.getRegisterInfo(); auto &MLI = getAnalysis<MachineLoopInfo>(); @@ -213,7 +213,9 @@ bool HexagonPacketizer::runOnMachineFunction(MachineFunction &MF) { HII->genAllInsnTimingClasses(MF); // Instantiate the packetizer. - HexagonPacketizerList Packetizer(MF, MLI, AA, MBPI); + bool MinOnly = Minimal || DisablePacketizer || !HST.usePackets() || + skipFunction(MF.getFunction()); + HexagonPacketizerList Packetizer(MF, MLI, AA, MBPI, MinOnly); // DFA state table should not be empty. assert(Packetizer.getResourceTracker() && "Empty DFA table!"); @@ -226,7 +228,7 @@ bool HexagonPacketizer::runOnMachineFunction(MachineFunction &MF) { // Here, Insn 1 will result in the dependence graph not emitting an output // dependence between Insn 0 and Insn 2. This can lead to incorrect // packetization - for (auto &MB : MF) { + for (MachineBasicBlock &MB : MF) { auto End = MB.end(); auto MI = MB.begin(); while (MI != End) { @@ -1759,8 +1761,8 @@ HexagonPacketizerList::addToPacket(MachineInstr &MI) { } void HexagonPacketizerList::endPacket(MachineBasicBlock *MBB, - MachineBasicBlock::iterator MI) { - // Replace VLIWPacketizerList::endPacket(MBB, MI). + MachineBasicBlock::iterator EndMI) { + // Replace VLIWPacketizerList::endPacket(MBB, EndMI). bool memShufDisabled = getmemShufDisabled(); if (memShufDisabled && !foundLSInPacket()) { @@ -1769,25 +1771,32 @@ void HexagonPacketizerList::endPacket(MachineBasicBlock *MBB, } memShufDisabled = getmemShufDisabled(); - if (CurrentPacketMIs.size() > 1) { - MachineBasicBlock::instr_iterator FirstMI(CurrentPacketMIs.front()); - MachineBasicBlock::instr_iterator LastMI(MI.getInstrIterator()); - finalizeBundle(*MBB, FirstMI, LastMI); + OldPacketMIs.clear(); + for (MachineInstr *MI : CurrentPacketMIs) { + MachineBasicBlock::instr_iterator NextMI = std::next(MI->getIterator()); + for (auto &I : make_range(HII->expandVGatherPseudo(*MI), NextMI)) + OldPacketMIs.push_back(&I); + } + CurrentPacketMIs.clear(); + if (OldPacketMIs.size() > 1) { + MachineBasicBlock::instr_iterator FirstMI(OldPacketMIs.front()); + MachineBasicBlock::instr_iterator LastMI(EndMI.getInstrIterator()); + finalizeBundle(*MBB, FirstMI, LastMI); auto BundleMII = std::prev(FirstMI); if (memShufDisabled) HII->setBundleNoShuf(BundleMII); setmemShufDisabled(false); } - OldPacketMIs = CurrentPacketMIs; - CurrentPacketMIs.clear(); ResourceTracker->clearResources(); LLVM_DEBUG(dbgs() << "End packet\n"); } bool HexagonPacketizerList::shouldAddToPacket(const MachineInstr &MI) { + if (Minimal) + return false; return !producesStall(MI); } @@ -1860,6 +1869,6 @@ bool HexagonPacketizerList::producesStall(const MachineInstr &I) { // Public Constructor Functions //===----------------------------------------------------------------------===// -FunctionPass *llvm::createHexagonPacketizer() { - return new HexagonPacketizer(); +FunctionPass *llvm::createHexagonPacketizer(bool Minimal) { + return new HexagonPacketizer(Minimal); } diff --git a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h index 40dcee3441a..d54dd7050e1 100644 --- a/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h +++ b/llvm/lib/Target/Hexagon/HexagonVLIWPacketizer.h @@ -66,11 +66,13 @@ protected: private: const HexagonInstrInfo *HII; const HexagonRegisterInfo *HRI; + const bool Minimal; public: HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI, AliasAnalysis *AA, - const MachineBranchProbabilityInfo *MBPI); + const MachineBranchProbabilityInfo *MBPI, + bool Minimal); // initPacketizerState - initialize some internal flags. void initPacketizerState() override; diff --git a/llvm/test/CodeGen/Hexagon/no-packets-gather.ll b/llvm/test/CodeGen/Hexagon/no-packets-gather.ll index 06054b6b2f4..e40f0a7ed85 100644 --- a/llvm/test/CodeGen/Hexagon/no-packets-gather.ll +++ b/llvm/test/CodeGen/Hexagon/no-packets-gather.ll @@ -12,11 +12,11 @@ target triple = "hexagon" ; CHECK-NEXT: m0 = r2 ; CHECK-NEXT: } ; CHECK-NEXT: { -; CHECK-NEXT: vtmp.w = vgather(r1,m0,v0.w).w -; CHECK-NEXT: vmem(r0+#0) = vtmp.new +; CHECK-NEXT: r29 = and(r29,#-64) ; CHECK-NEXT: } ; CHECK-NEXT: { -; CHECK-NEXT: r29 = and(r29,#-64) +; CHECK-NEXT: vtmp.w = vgather(r1,m0,v0.w).w +; CHECK-NEXT: vmem(r0+#0) = vtmp.new ; CHECK-NEXT: } ; CHECK-NEXT: { ; CHECK-NEXT: r0 = add(r29,#0) diff --git a/llvm/test/CodeGen/Hexagon/vgather-packetize.mir b/llvm/test/CodeGen/Hexagon/vgather-packetize.mir new file mode 100644 index 00000000000..d575880a650 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/vgather-packetize.mir @@ -0,0 +1,31 @@ +# RUN: llc -march=hexagon -mcpu=hexagonv65 -start-before hexagon-packetizer -o - %s | FileCheck %s + +# Check that the vgather pseudo was expanded and packetized with the +# surrounding instructions. + +# CHECK: r1 = add(r1,#1) +# CHECK-NEXT: vtmp.h = vgather +# CHECK-NEXT: vmem(r0+#0) = vtmp.new +# CHECK-NEXT: } :endloop0 + +name: fred +tracksRegLiveness: true +body: | + bb.0: + liveins: $r0, $w0 + $r1 = A2_tfrsi 2 + $r2 = A2_tfrsi 1 + $m0 = A2_tfrrcr killed $r1 + J2_loop0i %bb.1, 128, implicit-def $lc0, implicit-def $sa0, implicit-def $usr + + bb.1: + liveins: $r0, $r1, $r2, $m0, $w0 + $r1 = A2_addi $r1, 1 + V6_vgathermhw_pseudo killed $r0, killed $r2, killed $m0, killed $w0, implicit-def $vtmp + ENDLOOP0 %bb.1, implicit $lc0, implicit $sa0, implicit-def $lc0, implicit-def $p3, implicit-def $pc, implicit-def $usr + + bb.2: + liveins: $r1 + $r0 = A2_tfr $r1 + PS_jmpret killed $r31, implicit $r0, implicit-def dead $pc +... |