diff options
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
| -rw-r--r-- | lib/CodeGen/MachineInstr.cpp | 86 | 
1 files changed, 38 insertions, 48 deletions
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index d665201a5d17..306b75dbbae7 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -1,4 +1,4 @@ -//===-- lib/CodeGen/MachineInstr.cpp --------------------------------------===// +//===- lib/CodeGen/MachineInstr.cpp ---------------------------------------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -11,21 +11,34 @@  //  //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/ADT/APFloat.h" +#include "llvm/ADT/ArrayRef.h"  #include "llvm/ADT/FoldingSet.h"  #include "llvm/ADT/Hashing.h" +#include "llvm/ADT/None.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/STLExtras.h"  #include "llvm/Analysis/AliasAnalysis.h" -#include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/Analysis/MemoryLocation.h" +#include "llvm/CodeGen/GlobalISel/RegisterBank.h" +#include "llvm/CodeGen/MachineBasicBlock.h"  #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstr.h"  #include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/MachineInstrBundle.h"  #include "llvm/CodeGen/MachineMemOperand.h"  #include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/CodeGen/MachineOperand.h"  #include "llvm/CodeGen/MachineRegisterInfo.h"  #include "llvm/CodeGen/PseudoSourceValue.h"  #include "llvm/IR/Constants.h" -#include "llvm/IR/DebugInfo.h" +#include "llvm/IR/DebugInfoMetadata.h" +#include "llvm/IR/DebugLoc.h" +#include "llvm/IR/DerivedTypes.h"  #include "llvm/IR/Function.h"  #include "llvm/IR/InlineAsm.h" +#include "llvm/IR/InstrTypes.h"  #include "llvm/IR/Intrinsics.h"  #include "llvm/IR/LLVMContext.h"  #include "llvm/IR/Metadata.h" @@ -35,9 +48,13 @@  #include "llvm/IR/Value.h"  #include "llvm/MC/MCInstrDesc.h"  #include "llvm/MC/MCSymbol.h" +#include "llvm/MC/MCRegisterInfo.h" +#include "llvm/Support/Casting.h"  #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compiler.h"  #include "llvm/Support/Debug.h"  #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/LowLevelTypeImpl.h"  #include "llvm/Support/MathExtras.h"  #include "llvm/Support/raw_ostream.h"  #include "llvm/Target/TargetInstrInfo.h" @@ -45,6 +62,14 @@  #include "llvm/Target/TargetMachine.h"  #include "llvm/Target/TargetRegisterInfo.h"  #include "llvm/Target/TargetSubtargetInfo.h" +#include <algorithm> +#include <cassert> +#include <cstddef> +#include <cstdint> +#include <cstring> +#include <iterator> +#include <utility> +  using namespace llvm;  static cl::opt<bool> PrintWholeRegMask( @@ -256,7 +281,7 @@ bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const {    case MachineOperand::MO_GlobalAddress:      return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset();    case MachineOperand::MO_ExternalSymbol: -    return !strcmp(getSymbolName(), Other.getSymbolName()) && +    return strcmp(getSymbolName(), Other.getSymbolName()) == 0 &&             getOffset() == Other.getOffset();    case MachineOperand::MO_BlockAddress:      return getBlockAddress() == Other.getBlockAddress() && @@ -723,9 +748,7 @@ void MachineInstr::addImplicitDefUseOperands(MachineFunction &MF) {  /// the MCInstrDesc.  MachineInstr::MachineInstr(MachineFunction &MF, const MCInstrDesc &tid,                             DebugLoc dl, bool NoImp) -    : MCID(&tid), Parent(nullptr), Operands(nullptr), NumOperands(0), Flags(0), -      AsmPrinterFlags(0), NumMemRefs(0), MemRefs(nullptr), -      debugLoc(std::move(dl)) { +    : MCID(&tid), debugLoc(std::move(dl)) {    assert(debugLoc.hasTrivialDestructor() && "Expected trivial destructor");    // Reserve space for the expected number of operands. @@ -742,9 +765,8 @@ MachineInstr::MachineInstr(MachineFunction &MF, const MCInstrDesc &tid,  /// MachineInstr ctor - Copies MachineInstr arg exactly  ///  MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI) -    : MCID(&MI.getDesc()), Parent(nullptr), Operands(nullptr), NumOperands(0), -      Flags(0), AsmPrinterFlags(0), NumMemRefs(MI.NumMemRefs), -      MemRefs(MI.MemRefs), debugLoc(MI.getDebugLoc()) { +    : MCID(&MI.getDesc()), NumMemRefs(MI.NumMemRefs), MemRefs(MI.MemRefs), +      debugLoc(MI.getDebugLoc()) {    assert(debugLoc.hasTrivialDestructor() && "Expected trivial destructor");    CapOperands = OperandCapacity::get(MI.getNumOperands()); @@ -1633,8 +1655,8 @@ bool MachineInstr::mayAlias(AliasAnalysis *AA, MachineInstr &Other,    // memory objects. It can save compile time, and possibly catch some    // corner cases not currently covered. -  assert ((MMOa->getOffset() >= 0) && "Negative MachineMemOperand offset"); -  assert ((MMOb->getOffset() >= 0) && "Negative MachineMemOperand offset"); +  assert((MMOa->getOffset() >= 0) && "Negative MachineMemOperand offset"); +  assert((MMOb->getOffset() >= 0) && "Negative MachineMemOperand offset");    int64_t MinOffset = std::min(MMOa->getOffset(), MMOb->getOffset());    int64_t Overlapa = MMOa->getSize() + MMOa->getOffset() - MinOffset; @@ -1667,7 +1689,7 @@ bool MachineInstr::hasOrderedMemoryRef() const {      return true;    // Check if any of our memory operands are ordered. -  return any_of(memoperands(), [](const MachineMemOperand *MMO) { +  return llvm::any_of(memoperands(), [](const MachineMemOperand *MMO) {      return !MMO->isUnordered();    });  } @@ -1841,7 +1863,6 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,      return;    // Print the rest of the operands. -  bool OmittedAnyCallClobbers = false;    bool FirstOp = true;    unsigned AsmDescOp = ~0u;    unsigned AsmOpCount = 0; @@ -1878,31 +1899,6 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,      if (MO.isReg() && TargetRegisterInfo::isVirtualRegister(MO.getReg()))        VirtRegs.push_back(MO.getReg()); -    // Omit call-clobbered registers which aren't used anywhere. This makes -    // call instructions much less noisy on targets where calls clobber lots -    // of registers. Don't rely on MO.isDead() because we may be called before -    // LiveVariables is run, or we may be looking at a non-allocatable reg. -    if (MRI && isCall() && -        MO.isReg() && MO.isImplicit() && MO.isDef()) { -      unsigned Reg = MO.getReg(); -      if (TargetRegisterInfo::isPhysicalRegister(Reg)) { -        if (MRI->use_empty(Reg)) { -          bool HasAliasLive = false; -          for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) { -            unsigned AliasReg = *AI; -            if (!MRI->use_empty(AliasReg)) { -              HasAliasLive = true; -              break; -            } -          } -          if (!HasAliasLive) { -            OmittedAnyCallClobbers = true; -            continue; -          } -        } -      } -    } -      if (FirstOp) FirstOp = false; else OS << ",";      OS << " ";      if (i < getDesc().NumOperands) { @@ -1984,12 +1980,6 @@ void MachineInstr::print(raw_ostream &OS, ModuleSlotTracker &MST,        MO.print(OS, MST, TRI);    } -  // Briefly indicate whether any call clobbers were omitted. -  if (OmittedAnyCallClobbers) { -    if (!FirstOp) OS << ","; -    OS << " ..."; -  } -    bool HaveSemi = false;    const unsigned PrintableFlags = FrameSetup | FrameDestroy;    if (Flags & PrintableFlags) { @@ -2255,8 +2245,8 @@ void MachineInstr::setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs,      unsigned Reg = MO.getReg();      if (!TargetRegisterInfo::isPhysicalRegister(Reg)) continue;      // If there are no uses, including partial uses, the def is dead. -    if (none_of(UsedRegs, -                [&](unsigned Use) { return TRI.regsOverlap(Use, Reg); })) +    if (llvm::none_of(UsedRegs, +                      [&](unsigned Use) { return TRI.regsOverlap(Use, Reg); }))        MO.setIsDead();    }  | 
