brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 7fbccf7 Raw
77 lines · cpp
1#include "llvm/CodeGen/GlobalISel/InstructionSelect.h"2#include "GISelMITest.h"3#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"4#include "llvm/CodeGen/TargetPassConfig.h"5#include "llvm/IR/LegacyPassManager.h"6 7namespace {8 9class EraseMockInstructionSelector : public InstructionSelector {10public:11  int NumSelected = 0;12  SmallVector<MachineInstr *> MIs;13 14  bool select(MachineInstr &MI) override {15    ++NumSelected;16    switch (NumSelected) {17    case 1:18      EXPECT_EQ(&MI, MIs[8]);19      // Erase previous instructions20      MIs[7]->eraseFromParent();21      MIs[6]->eraseFromParent();22      // Don't erase this MI before step 3 to prevent DCE23      return true;24    case 2:25      EXPECT_EQ(&MI, MIs[5]);26      // Erase previous instructions reversed27      MIs[3]->eraseFromParent();28      MIs[4]->eraseFromParent();29      MI.eraseFromParent();30      return true;31    case 3:32      EXPECT_EQ(&MI, MIs[2]);33      MIs[8]->eraseFromParent();34      // Erase first instructions35      MIs[0]->eraseFromParent();36      MIs[1]->eraseFromParent();37      MI.eraseFromParent();38      return true;39    default:40      ADD_FAILURE();41      return false;42    }43  }44 45  void setupGeneratedPerFunctionState(MachineFunction &MF) override {}46};47 48TEST_F(AArch64GISelMITest, TestInstructionSelectErase) {49  StringRef MIRString = R"(50   $x0 = COPY %2(s64)51   $x0 = COPY %2(s64)52   $x0 = COPY %2(s64)53   $x0 = COPY %2(s64)54   $x0 = COPY %2(s64)55   $x0 = COPY %2(s64)56)";57  setUp(MIRString);58  if (!TM)59    GTEST_SKIP();60 61  legacy::PassManager PM;62  std::unique_ptr<TargetPassConfig> TPC(TM->createPassConfig(PM));63 64  EraseMockInstructionSelector ISel;65  ISel.TPC = TPC.get();66  for (auto &MI : *EntryMBB) {67    ISel.MIs.push_back(&MI);68  }69 70  InstructionSelect ISelPass;71  ISelPass.setInstructionSelector(&ISel);72  ISelPass.selectMachineFunction(*MF);73  EXPECT_EQ(ISel.NumSelected, 3);74}75 76} // namespace77