diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/BranchFolding.cpp | 50 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/CFIInstrInserter.cpp | 319 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/CodeGen.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 50 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TailDuplicator.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 43 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86TargetMachine.cpp | 7 | 
10 files changed, 14 insertions, 474 deletions
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index f7c46acc62c..40cb0c0cdf1 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -296,11 +296,6 @@ static unsigned HashEndOfMBB(const MachineBasicBlock &MBB) {    return HashMachineInstr(*I);  } -// Whether MI should be counted as an instruction when calculating common tail. -static bool countsAsInstruction(const MachineInstr &MI) { -  return !(MI.isDebugValue() || MI.isCFIInstruction()); -} -  /// ComputeCommonTailLength - Given two machine basic blocks, compute the number  /// of instructions they actually have in common together at their end.  Return  /// iterators for the first shared instruction in each block. @@ -315,9 +310,9 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1,    while (I1 != MBB1->begin() && I2 != MBB2->begin()) {      --I1; --I2;      // Skip debugging pseudos; necessary to avoid changing the code. -    while (!countsAsInstruction(*I1)) { +    while (I1->isDebugValue()) {        if (I1==MBB1->begin()) { -        while (!countsAsInstruction(*I2)) { +        while (I2->isDebugValue()) {            if (I2==MBB2->begin())              // I1==DBG at begin; I2==DBG at begin              return TailLen; @@ -330,7 +325,7 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1,        --I1;      }      // I1==first (untested) non-DBG preceding known match -    while (!countsAsInstruction(*I2)) { +    while (I2->isDebugValue()) {        if (I2==MBB2->begin()) {          ++I1;          // I1==non-DBG, or first of DBGs not at begin; I2==DBG at begin @@ -373,35 +368,6 @@ static unsigned ComputeCommonTailLength(MachineBasicBlock *MBB1,      }      ++I1;    } - -  // Ensure that I1 and I2 do not point to a CFI_INSTRUCTION. This can happen if -  // I1 and I2 are non-identical when compared and then one or both of them ends -  // up pointing to a CFI instruction after being incremented. For example: -  /* -    BB1: -    ... -    INSTRUCTION_A -    ADD32ri8  <- last common instruction -    ... -    BB2: -    ... -    INSTRUCTION_B -    CFI_INSTRUCTION -    ADD32ri8  <- last common instruction -    ... -  */ -  // When INSTRUCTION_A and INSTRUCTION_B are compared as not equal, after -  // incrementing the iterators, I1 will point to ADD, however I2 will point to -  // the CFI instruction. Later on, this leads to BB2 being 'hacked off' at the -  // wrong place (in ReplaceTailWithBranchTo()) which results in losing this CFI -  // instruction. -  while (I1 != MBB1->end() && I1->isCFIInstruction()) { -    ++I1; -  } - -  while (I2 != MBB2->end() && I2->isCFIInstruction()) { -    ++I2; -  }    return TailLen;  } @@ -488,7 +454,7 @@ static unsigned EstimateRuntime(MachineBasicBlock::iterator I,                                  MachineBasicBlock::iterator E) {    unsigned Time = 0;    for (; I != E; ++I) { -    if (!countsAsInstruction(*I)) +    if (I->isDebugValue())        continue;      if (I->isCall())        Time += 10; @@ -848,12 +814,12 @@ mergeOperations(MachineBasicBlock::iterator MBBIStartPos,      assert(MBBI != MBBIE && "Reached BB end within common tail length!");      (void)MBBIE; -    if (!countsAsInstruction(*MBBI)) { +    if (MBBI->isDebugValue()) {        ++MBBI;        continue;      } -    while ((MBBICommon != MBBIECommon) && !countsAsInstruction(*MBBICommon)) +    while ((MBBICommon != MBBIECommon) && MBBICommon->isDebugValue())        ++MBBICommon;      assert(MBBICommon != MBBIECommon && @@ -893,7 +859,7 @@ void BranchFolder::mergeCommonTails(unsigned commonTailIndex) {    }    for (auto &MI : *MBB) { -    if (!countsAsInstruction(MI)) +    if (MI.isDebugValue())        continue;      DebugLoc DL = MI.getDebugLoc();      for (unsigned int i = 0 ; i < NextCommonInsts.size() ; i++) { @@ -903,7 +869,7 @@ void BranchFolder::mergeCommonTails(unsigned commonTailIndex) {        auto &Pos = NextCommonInsts[i];        assert(Pos != SameTails[i].getBlock()->end() &&            "Reached BB end within common tail"); -      while (!countsAsInstruction(*Pos)) { +      while (Pos->isDebugValue()) {          ++Pos;          assert(Pos != SameTails[i].getBlock()->end() &&              "Reached BB end within common tail"); diff --git a/llvm/lib/CodeGen/CFIInstrInserter.cpp b/llvm/lib/CodeGen/CFIInstrInserter.cpp deleted file mode 100644 index 7760a3b7d2f..00000000000 --- a/llvm/lib/CodeGen/CFIInstrInserter.cpp +++ /dev/null @@ -1,319 +0,0 @@ -//===------ CFIInstrInserter.cpp - Insert additional CFI instructions -----===// -// -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -/// \file This pass verifies incoming and outgoing CFA information of basic -/// blocks. CFA information is information about offset and register set by CFI -/// directives, valid at the start and end of a basic block. This pass checks -/// that outgoing information of predecessors matches incoming information of -/// their successors. Then it checks if blocks have correct CFA calculation rule -/// set and inserts additional CFI instruction at their beginnings if they -/// don't. CFI instructions are inserted if basic blocks have incorrect offset -/// or register set by previous blocks, as a result of a non-linear layout of -/// blocks in a function. -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/MachineFunctionPass.h" -#include "llvm/CodeGen/MachineInstrBuilder.h" -#include "llvm/CodeGen/MachineModuleInfo.h" -#include "llvm/CodeGen/Passes.h" -#include "llvm/Target/TargetFrameLowering.h" -#include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetSubtargetInfo.h" -using namespace llvm; - -namespace { -class CFIInstrInserter : public MachineFunctionPass { - public: -  static char ID; - -  CFIInstrInserter() : MachineFunctionPass(ID) { -    initializeCFIInstrInserterPass(*PassRegistry::getPassRegistry()); -  } - -  void getAnalysisUsage(AnalysisUsage &AU) const override { -    AU.setPreservesAll(); -    MachineFunctionPass::getAnalysisUsage(AU); -  } - -  bool runOnMachineFunction(MachineFunction &MF) override { - -    if (!MF.getMMI().hasDebugInfo() && -        !MF.getFunction()->needsUnwindTableEntry()) -      return false; - -    MBBVector.resize(MF.getNumBlockIDs()); -    calculateCFAInfo(MF); -#ifndef NDEBUG -    unsigned ErrorNum = verify(MF); -    if (ErrorNum) -      report_fatal_error("Found " + Twine(ErrorNum) + -                         " in/out CFI information errors."); -#endif -    bool insertedCFI = insertCFIInstrs(MF); -    MBBVector.clear(); -    return insertedCFI; -  } - - private: -  struct MBBCFAInfo { -    MachineBasicBlock *MBB; -    /// Value of cfa offset valid at basic block entry. -    int IncomingCFAOffset = -1; -    /// Value of cfa offset valid at basic block exit. -    int OutgoingCFAOffset = -1; -    /// Value of cfa register valid at basic block entry. -    unsigned IncomingCFARegister = 0; -    /// Value of cfa register valid at basic block exit. -    unsigned OutgoingCFARegister = 0; -    /// If in/out cfa offset and register values for this block have already -    /// been set or not. -    bool Processed = false; -  }; - -  /// Contains cfa offset and register values valid at entry and exit of basic -  /// blocks. -  SmallVector<struct MBBCFAInfo, 4> MBBVector; - -  /// Calculate cfa offset and register values valid at entry and exit for all -  /// basic blocks in a function. -  void calculateCFAInfo(MachineFunction &MF); -  /// Calculate cfa offset and register values valid at basic block exit by -  /// checking the block for CFI instructions. Block's incoming CFA info remains -  /// the same. -  void calculateOutgoingCFAInfo(struct MBBCFAInfo &MBBInfo); -  /// Update in/out cfa offset and register values for successors of the basic -  /// block. -  void updateSuccCFAInfo(struct MBBCFAInfo &MBBInfo); - -  /// Check if incoming CFA information of a basic block matches outgoing CFA -  /// information of the previous block. If it doesn't, insert CFI instruction -  /// at the beginning of the block that corrects the CFA calculation rule for -  /// that block. -  bool insertCFIInstrs(MachineFunction &MF); -  /// Return the cfa offset value that should be set at the beginning of a MBB -  /// if needed. The negated value is needed when creating CFI instructions that -  /// set absolute offset. -  int getCorrectCFAOffset(MachineBasicBlock *MBB) { -    return -MBBVector[MBB->getNumber()].IncomingCFAOffset; -  } - -  void report(const char *msg, MachineBasicBlock &MBB); -  /// Go through each MBB in a function and check that outgoing offset and -  /// register of its predecessors match incoming offset and register of that -  /// MBB, as well as that incoming offset and register of its successors match -  /// outgoing offset and register of the MBB. -  unsigned verify(MachineFunction &MF); -}; -} - -char CFIInstrInserter::ID = 0; -INITIALIZE_PASS(CFIInstrInserter, "cfi-instr-inserter", -                "Check CFA info and insert CFI instructions if needed", false, -                false) -FunctionPass *llvm::createCFIInstrInserter() { return new CFIInstrInserter(); } - -void CFIInstrInserter::calculateCFAInfo(MachineFunction &MF) { -  // Initial CFA offset value i.e. the one valid at the beginning of the -  // function. -  int InitialOffset = -      MF.getSubtarget().getFrameLowering()->getInitialCFAOffset(MF); -  // Initial CFA register value i.e. the one valid at the beginning of the -  // function. -  unsigned InitialRegister = -      MF.getSubtarget().getFrameLowering()->getInitialCFARegister(MF); - -  // Initialize MBBMap. -  for (MachineBasicBlock &MBB : MF) { -    struct MBBCFAInfo MBBInfo; -    MBBInfo.MBB = &MBB; -    MBBInfo.IncomingCFAOffset = InitialOffset; -    MBBInfo.OutgoingCFAOffset = InitialOffset; -    MBBInfo.IncomingCFARegister = InitialRegister; -    MBBInfo.OutgoingCFARegister = InitialRegister; -    MBBVector[MBB.getNumber()] = MBBInfo; -  } - -  // Set in/out cfa info for all blocks in the function. This traversal is based -  // on the assumption that the first block in the function is the entry block -  // i.e. that it has initial cfa offset and register values as incoming CFA -  // information. -  for (MachineBasicBlock &MBB : MF) { -    if (MBBVector[MBB.getNumber()].Processed) continue; -    calculateOutgoingCFAInfo(MBBVector[MBB.getNumber()]); -    updateSuccCFAInfo(MBBVector[MBB.getNumber()]); -  } -} - -void CFIInstrInserter::calculateOutgoingCFAInfo(struct MBBCFAInfo &MBBInfo) { -  // Outgoing cfa offset set by the block. -  int SetOffset = MBBInfo.IncomingCFAOffset; -  // Outgoing cfa register set by the block. -  unsigned SetRegister = MBBInfo.IncomingCFARegister; -  const std::vector<MCCFIInstruction> &Instrs = -      MBBInfo.MBB->getParent()->getFrameInstructions(); - -  // Determine cfa offset and register set by the block. -  for (MachineInstr &MI : -       make_range(MBBInfo.MBB->instr_begin(), MBBInfo.MBB->instr_end())) { -    if (MI.isCFIInstruction()) { -      unsigned CFIIndex = MI.getOperand(0).getCFIIndex(); -      const MCCFIInstruction &CFI = Instrs[CFIIndex]; -      if (CFI.getOperation() == MCCFIInstruction::OpDefCfaRegister) { -        SetRegister = CFI.getRegister(); -      } else if (CFI.getOperation() == MCCFIInstruction::OpDefCfaOffset) { -        SetOffset = CFI.getOffset(); -      } else if (CFI.getOperation() == MCCFIInstruction::OpAdjustCfaOffset) { -        SetOffset += CFI.getOffset(); -      } else if (CFI.getOperation() == MCCFIInstruction::OpDefCfa) { -        SetRegister = CFI.getRegister(); -        SetOffset = CFI.getOffset(); -      } -    } -  } - -  MBBInfo.Processed = true; - -  // Update outgoing CFA info. -  MBBInfo.OutgoingCFAOffset = SetOffset; -  MBBInfo.OutgoingCFARegister = SetRegister; -} - -void CFIInstrInserter::updateSuccCFAInfo(struct MBBCFAInfo &MBBInfo) { - -  for (MachineBasicBlock *Succ : MBBInfo.MBB->successors()) { -    struct MBBCFAInfo &SuccInfo = MBBVector[Succ->getNumber()]; -    if (SuccInfo.Processed) continue; -    SuccInfo.IncomingCFAOffset = MBBInfo.OutgoingCFAOffset; -    SuccInfo.IncomingCFARegister = MBBInfo.OutgoingCFARegister; -    calculateOutgoingCFAInfo(SuccInfo); -    updateSuccCFAInfo(SuccInfo); -  } -} - -bool CFIInstrInserter::insertCFIInstrs(MachineFunction &MF) { - -  const struct MBBCFAInfo *PrevMBBInfo = &MBBVector[MF.front().getNumber()]; -  const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo(); -  bool InsertedCFIInstr = false; - -  for (MachineBasicBlock &MBB : MF) { -    // Skip the first MBB in a function -    if (MBB.getNumber() == MF.front().getNumber()) continue; - -    const struct MBBCFAInfo& MBBInfo = MBBVector[MBB.getNumber()]; -    auto MBBI = MBBInfo.MBB->begin(); -    DebugLoc DL = MBBInfo.MBB->findDebugLoc(MBBI); - -    if (PrevMBBInfo->OutgoingCFAOffset != MBBInfo.IncomingCFAOffset) { -      // If both outgoing offset and register of a previous block don't match -      // incoming offset and register of this block, add a def_cfa instruction -      // with the correct offset and register for this block. -      if (PrevMBBInfo->OutgoingCFARegister != MBBInfo.IncomingCFARegister) { -        unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfa( -            nullptr, MBBInfo.IncomingCFARegister, getCorrectCFAOffset(&MBB))); -        BuildMI(*MBBInfo.MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) -            .addCFIIndex(CFIIndex); -        // If outgoing offset of a previous block doesn't match incoming offset -        // of this block, add a def_cfa_offset instruction with the correct -        // offset for this block. -      } else { -        unsigned CFIIndex = -            MF.addFrameInst(MCCFIInstruction::createDefCfaOffset( -                nullptr, getCorrectCFAOffset(&MBB))); -        BuildMI(*MBBInfo.MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) -            .addCFIIndex(CFIIndex); -      } -      InsertedCFIInstr = true; -      // If outgoing register of a previous block doesn't match incoming -      // register of this block, add a def_cfa_register instruction with the -      // correct register for this block. -    } else if (PrevMBBInfo->OutgoingCFARegister != MBBInfo.IncomingCFARegister) { -      unsigned CFIIndex = -          MF.addFrameInst(MCCFIInstruction::createDefCfaRegister( -              nullptr, MBBInfo.IncomingCFARegister)); -      BuildMI(*MBBInfo.MBB, MBBI, DL, TII->get(TargetOpcode::CFI_INSTRUCTION)) -          .addCFIIndex(CFIIndex); -      InsertedCFIInstr = true; -    } -    PrevMBBInfo = &MBBInfo; -  } -  return InsertedCFIInstr; -} - -void CFIInstrInserter::report(const char *msg, MachineBasicBlock &MBB) { -  errs() << '\n'; -  errs() << "*** " << msg << " ***\n" -         << "- function:    " << MBB.getParent()->getName() << "\n"; -  errs() << "- basic block: BB#" << MBB.getNumber() << ' ' << MBB.getName() -         << " (" << (const void *)&MBB << ')'; -  errs() << '\n'; -} - -unsigned CFIInstrInserter::verify(MachineFunction &MF) { -  unsigned ErrorNum = 0; -  for (MachineBasicBlock &CurrMBB : MF) { -    const struct MBBCFAInfo& CurrMBBInfo = MBBVector[CurrMBB.getNumber()]; -    for (MachineBasicBlock *Pred : CurrMBB.predecessors()) { -      const struct MBBCFAInfo& PredMBBInfo = MBBVector[Pred->getNumber()]; -      // Check that outgoing offset values of predecessors match the incoming -      // offset value of CurrMBB -      if (PredMBBInfo.OutgoingCFAOffset != CurrMBBInfo.IncomingCFAOffset) { -        report("The outgoing offset of a predecessor is inconsistent.", -               CurrMBB); -        errs() << "Predecessor BB#" << Pred->getNumber() -               << " has outgoing offset (" << PredMBBInfo.OutgoingCFAOffset -               << "), while BB#" << CurrMBB.getNumber() -               << " has incoming offset (" << CurrMBBInfo.IncomingCFAOffset -               << ").\n"; -        ErrorNum++; -      } -      // Check that outgoing register values of predecessors match the incoming -      // register value of CurrMBB -      if (PredMBBInfo.OutgoingCFARegister != CurrMBBInfo.IncomingCFARegister) { -        report("The outgoing register of a predecessor is inconsistent.", -               CurrMBB); -        errs() << "Predecessor BB#" << Pred->getNumber() -               << " has outgoing register (" << PredMBBInfo.OutgoingCFARegister -               << "), while BB#" << CurrMBB.getNumber() -               << " has incoming register (" << CurrMBBInfo.IncomingCFARegister -               << ").\n"; -        ErrorNum++; -      } -    } - -    for (MachineBasicBlock *Succ : CurrMBB.successors()) { -      const struct MBBCFAInfo& SuccMBBInfo = MBBVector[Succ->getNumber()]; -      // Check that incoming offset values of successors match the outgoing -      // offset value of CurrMBB -      if (SuccMBBInfo.IncomingCFAOffset != CurrMBBInfo.OutgoingCFAOffset) { -        report("The incoming offset of a successor is inconsistent.", CurrMBB); -        errs() << "Successor BB#" << Succ->getNumber() -               << " has incoming offset (" << SuccMBBInfo.IncomingCFAOffset -               << "), while BB#" << CurrMBB.getNumber() -               << " has outgoing offset (" << CurrMBBInfo.OutgoingCFAOffset -               << ").\n"; -        ErrorNum++; -      } -      // Check that incoming register values of successors match the outgoing -      // register value of CurrMBB -      if (SuccMBBInfo.IncomingCFARegister != CurrMBBInfo.OutgoingCFARegister) { -        report("The incoming register of a successor is inconsistent.", -               CurrMBB); -        errs() << "Successor BB#" << Succ->getNumber() -               << " has incoming register (" << SuccMBBInfo.IncomingCFARegister -               << "), while BB#" << CurrMBB.getNumber() -               << " has outgoing register (" << CurrMBBInfo.OutgoingCFARegister -               << ").\n"; -        ErrorNum++; -      } -    } -  } -  return ErrorNum; -} diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 44da41ac745..7ec7fda4e44 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -9,7 +9,6 @@ add_llvm_library(LLVMCodeGen    BuiltinGCs.cpp    CalcSpillWeights.cpp    CallingConvLower.cpp -  CFIInstrInserter.cpp    CodeGen.cpp    CodeGenPrepare.cpp    CountingFunctionInserter.cpp diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index c0e7511aa0c..f4ccb4889d3 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -23,7 +23,6 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {    initializeAtomicExpandPass(Registry);    initializeBranchFolderPassPass(Registry);    initializeBranchRelaxationPass(Registry); -  initializeCFIInstrInserterPass(Registry);    initializeCodeGenPreparePass(Registry);    initializeCountingFunctionInserterPass(Registry);    initializeDeadMachineInstructionElimPass(Registry); diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index 9137c836caa..bb2dda980e4 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -320,45 +320,8 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {    }    case MachineOperand::MO_MCSymbol:      return getMCSymbol() == Other.getMCSymbol(); -  case MachineOperand::MO_CFIIndex: { -    const MachineFunction *MF = getParent()->getParent()->getParent(); -    const MachineFunction *OtherMF = -        Other.getParent()->getParent()->getParent(); -    MCCFIInstruction Inst = MF->getFrameInstructions()[getCFIIndex()]; -    MCCFIInstruction OtherInst = -        OtherMF->getFrameInstructions()[Other.getCFIIndex()]; -    MCCFIInstruction::OpType op = Inst.getOperation(); -    if (op != OtherInst.getOperation()) return false; -    switch (op) { -    case MCCFIInstruction::OpDefCfa: -    case MCCFIInstruction::OpOffset: -    case MCCFIInstruction::OpRelOffset: -      if (Inst.getRegister() != OtherInst.getRegister()) return false; -      if (Inst.getOffset() != OtherInst.getOffset()) return false; -      break; -    case MCCFIInstruction::OpRestore: -    case MCCFIInstruction::OpUndefined: -    case MCCFIInstruction::OpSameValue: -    case MCCFIInstruction::OpDefCfaRegister: -      if (Inst.getRegister() != OtherInst.getRegister()) return false; -      break; -    case MCCFIInstruction::OpRegister: -      if (Inst.getRegister() != OtherInst.getRegister()) return false; -      if (Inst.getRegister2() != OtherInst.getRegister2()) return false; -      break; -    case MCCFIInstruction::OpDefCfaOffset: -    case MCCFIInstruction::OpAdjustCfaOffset: -    case MCCFIInstruction::OpGnuArgsSize: -      if (Inst.getOffset() != OtherInst.getOffset()) return false; -      break; -    case MCCFIInstruction::OpRememberState: -    case MCCFIInstruction::OpRestoreState: -    case MCCFIInstruction::OpEscape: -    case MCCFIInstruction::OpWindowSave: -      break; -    } -    return true; -  } +  case MachineOperand::MO_CFIIndex: +    return getCFIIndex() == Other.getCFIIndex();    case MachineOperand::MO_Metadata:      return getMetadata() == Other.getMetadata();    case MachineOperand::MO_IntrinsicID: @@ -407,13 +370,8 @@ hash_code llvm::hash_value(const MachineOperand &MO) {      return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMetadata());    case MachineOperand::MO_MCSymbol:      return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getMCSymbol()); -  case MachineOperand::MO_CFIIndex: { -    const MachineFunction *MF = MO.getParent()->getParent()->getParent(); -    MCCFIInstruction Inst = MF->getFrameInstructions()[MO.getCFIIndex()]; -    return hash_combine(MO.getType(), MO.getTargetFlags(), Inst.getOperation(), -                        Inst.getRegister(), Inst.getRegister2(), -                        Inst.getOffset()); -  } +  case MachineOperand::MO_CFIIndex: +    return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getCFIIndex());    case MachineOperand::MO_IntrinsicID:      return hash_combine(MO.getType(), MO.getTargetFlags(), MO.getIntrinsicID());    case MachineOperand::MO_Predicate: diff --git a/llvm/lib/CodeGen/TailDuplicator.cpp b/llvm/lib/CodeGen/TailDuplicator.cpp index 93b53c3a1cd..bd3a20f936d 100644 --- a/llvm/lib/CodeGen/TailDuplicator.cpp +++ b/llvm/lib/CodeGen/TailDuplicator.cpp @@ -603,8 +603,8 @@ bool TailDuplicator::shouldTailDuplicate(bool IsSimple,      if (PreRegAlloc && MI.isCall())        return false; -    if (!MI.isPHI() && !MI.isMetaInstruction()) -        InstrCount += 1; +    if (!MI.isPHI() && !MI.isDebugValue()) +      InstrCount += 1;      if (InstrCount > MaxDuplicateCount)        return false; diff --git a/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp b/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp index 22e73dc80d5..9dd98b4020d 100644 --- a/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp +++ b/llvm/lib/CodeGen/TargetFrameLoweringImpl.cpp @@ -104,12 +104,3 @@ unsigned TargetFrameLowering::getStackAlignmentSkew(    return 0;  } - -int TargetFrameLowering::getInitialCFAOffset(const MachineFunction &MF) const { -  llvm_unreachable("getInitialCFAOffset() not implemented!"); -} - -unsigned TargetFrameLowering::getInitialCFARegister(const MachineFunction &MF) -    const { -  llvm_unreachable("getInitialCFARegister() not implemented!"); -}
\ No newline at end of file diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index b477c80ecc5..988f2967401 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -1562,11 +1562,6 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,    bool HasFP = hasFP(MF);    uint64_t NumBytes = 0; -  bool NeedsDwarfCFI = -      (!MF.getTarget().getTargetTriple().isOSDarwin() && -       !MF.getTarget().getTargetTriple().isOSWindows()) && -      (MF.getMMI().hasDebugInfo() || MF.getFunction()->needsUnwindTableEntry()); -    if (IsFunclet) {      assert(HasFP && "EH funclets without FP not yet implemented");      NumBytes = getWinEHFuncletFrameSize(MF); @@ -1589,13 +1584,6 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,      BuildMI(MBB, MBBI, DL, TII.get(Is64Bit ? X86::POP64r : X86::POP32r),              MachineFramePtr)          .setMIFlag(MachineInstr::FrameDestroy); -    if (NeedsDwarfCFI) { -      unsigned DwarfStackPtr = -          TRI->getDwarfRegNum(Is64Bit ? X86::RSP : X86::ESP, true); -      BuildCFI(MBB, MBBI, DL, MCCFIInstruction::createDefCfa( -                                  nullptr, DwarfStackPtr, -SlotSize)); -      --MBBI; -    }    }    MachineBasicBlock::iterator FirstCSPop = MBBI; @@ -1659,11 +1647,6 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,    } else if (NumBytes) {      // Adjust stack pointer back: ESP += numbytes.      emitSPUpdate(MBB, MBBI, NumBytes, /*InEpilogue=*/true); -    if (!hasFP(MF) && NeedsDwarfCFI) { -      // Define the current CFA rule to use the provided offset. -      BuildCFI(MBB, MBBI, DL, MCCFIInstruction::createDefCfaOffset( -                                  nullptr, -CSSize - SlotSize)); -    }      --MBBI;    } @@ -1676,23 +1659,6 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF,    if (NeedsWin64CFI && MF.hasWinCFI())      BuildMI(MBB, MBBI, DL, TII.get(X86::SEH_Epilogue)); -  if (!hasFP(MF) && NeedsDwarfCFI) { -    MBBI = FirstCSPop; -    int64_t Offset = -CSSize - SlotSize; -    // Mark callee-saved pop instruction. -    // Define the current CFA rule to use the provided offset. -    while (MBBI != MBB.end()) { -      MachineBasicBlock::iterator PI = MBBI; -      unsigned Opc = PI->getOpcode(); -      ++MBBI; -      if (Opc == X86::POP32r || Opc == X86::POP64r) { -        Offset += SlotSize; -        BuildCFI(MBB, MBBI, DL, -                 MCCFIInstruction::createDefCfaOffset(nullptr, Offset)); -      } -    } -  } -    if (Terminator == MBB.end() || !isTailCallOpcode(Terminator->getOpcode())) {      // Add the return addr area delta back since we are not tail calling.      int Offset = -1 * X86FI->getTCReturnAddrDelta(); @@ -2869,15 +2835,6 @@ MachineBasicBlock::iterator X86FrameLowering::restoreWin32EHStackPointers(    return MBBI;  } -int X86FrameLowering::getInitialCFAOffset(const MachineFunction &MF) const { -  return TRI->getSlotSize(); -} - -unsigned X86FrameLowering::getInitialCFARegister(const MachineFunction &MF) -    const { -  return TRI->getDwarfRegNum(StackPtr, true); -} -  namespace {  // Struct used by orderFrameObjects to help sort the stack objects.  struct X86FrameSortingObject { diff --git a/llvm/lib/Target/X86/X86FrameLowering.h b/llvm/lib/Target/X86/X86FrameLowering.h index 1ed88b5f17f..38ac96e16d4 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.h +++ b/llvm/lib/Target/X86/X86FrameLowering.h @@ -168,10 +168,6 @@ public:                                MachineBasicBlock::iterator MBBI,                                const DebugLoc &DL, bool RestoreSP = false) const; -  int getInitialCFAOffset(const MachineFunction &MF) const override; - -  unsigned getInitialCFARegister(const MachineFunction &MF) const override; -  private:    uint64_t calculateMaxStackAlign(const MachineFunction &MF) const; diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp index 11fe84f162d..6e6c724eb0a 100644 --- a/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -436,11 +436,4 @@ void X86PassConfig::addPreEmitPass() {      addPass(createX86FixupLEAs());      addPass(createX86EvexToVexInsts());    } - -  // Verify basic block incoming and outgoing cfa offset and register values and -  // correct CFA calculation rule where needed by inserting appropriate CFI -  // instructions. -  const Triple &TT = TM->getTargetTriple(); -  if (!TT.isOSDarwin() && !TT.isOSWindows()) -    addPass(createCFIInstrInserter());  }  | 

