diff options
| -rw-r--r-- | llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h | 6 | ||||
| -rw-r--r-- | llvm/include/llvm/CodeGen/MachineMemOperand.h | 3 | ||||
| -rw-r--r-- | llvm/include/llvm/Support/LowLevelTypeImpl.h | 6 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 10 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/MachineVerifier.cpp | 6 | 
5 files changed, 20 insertions, 11 deletions
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h index 87ef2f84529..c37c3f95c09 100644 --- a/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/InstructionSelectorImpl.h @@ -437,15 +437,15 @@ bool InstructionSelector::executeMatchTable(        unsigned Size = MRI.getType(MO.getReg()).getSizeInBits();        if (MatcherOpcode == GIM_CheckMemorySizeEqualToLLT && -          MMO->getSize() * 8 != Size) { +          MMO->getSizeInBits() != Size) {          if (handleReject() == RejectAndGiveUp)            return false;        } else if (MatcherOpcode == GIM_CheckMemorySizeLessThanLLT && -                 MMO->getSize() * 8 >= Size) { +                 MMO->getSizeInBits() >= Size) {          if (handleReject() == RejectAndGiveUp)            return false;        } else if (MatcherOpcode == GIM_CheckMemorySizeGreaterThanLLT && -                 MMO->getSize() * 8 <= Size) +                 MMO->getSizeInBits() <= Size)          if (handleReject() == RejectAndGiveUp)            return false; diff --git a/llvm/include/llvm/CodeGen/MachineMemOperand.h b/llvm/include/llvm/CodeGen/MachineMemOperand.h index 7ba96105fe0..65f706302bc 100644 --- a/llvm/include/llvm/CodeGen/MachineMemOperand.h +++ b/llvm/include/llvm/CodeGen/MachineMemOperand.h @@ -220,6 +220,9 @@ public:    /// Return the size in bytes of the memory reference.    uint64_t getSize() const { return Size; } +  /// Return the size in bits of the memory reference. +  uint64_t getSizeInBits() const { return Size * 8; } +    /// Return the minimum known alignment in bytes of the actual memory    /// reference.    uint64_t getAlignment() const; diff --git a/llvm/include/llvm/Support/LowLevelTypeImpl.h b/llvm/include/llvm/Support/LowLevelTypeImpl.h index efe5c51d1a5..0e02b6e7d75 100644 --- a/llvm/include/llvm/Support/LowLevelTypeImpl.h +++ b/llvm/include/llvm/Support/LowLevelTypeImpl.h @@ -111,6 +111,12 @@ public:      return getScalarSizeInBits() * getNumElements();    } +  /// Returns the total size of the type in bytes, i.e. number of whole bytes +  /// needed to represent the size in bits. Must only be called on sized types. +  unsigned getSizeInBytes() const { +    return (getSizeInBits() + 7) / 8; +  } +    LLT getScalarType() const {      return isVector() ? getElementType() : *this;    } diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 62bc010902c..f841492f3a6 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -603,7 +603,7 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,      unsigned TmpReg = MRI.createGenericVirtualRegister(NarrowTy);      auto &MMO = **MI.memoperands_begin(); -    if (MMO.getSize() * 8 == NarrowSize) { +    if (MMO.getSizeInBits() == NarrowSize) {        MIRBuilder.buildLoad(TmpReg, PtrReg, MMO);      } else {        unsigned ExtLoad = ZExt ? TargetOpcode::G_ZEXTLOAD @@ -1483,7 +1483,7 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty) {      LLT DstTy = MRI.getType(DstReg);      auto &MMO = **MI.memoperands_begin(); -    if (DstTy.getSizeInBits() == MMO.getSize() /* in bytes */ * 8) { +    if (DstTy.getSizeInBits() == MMO.getSizeInBits()) {        if (MI.getOpcode() == TargetOpcode::G_LOAD) {          // This load needs splitting into power of 2 sized loads.          if (DstTy.isVector()) @@ -1540,8 +1540,8 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty) {      }      if (DstTy.isScalar()) { -      unsigned TmpReg = MRI.createGenericVirtualRegister( -          LLT::scalar(MMO.getSize() /* in bytes */ * 8)); +      unsigned TmpReg = +          MRI.createGenericVirtualRegister(LLT::scalar(MMO.getSizeInBits()));        MIRBuilder.buildLoad(TmpReg, PtrReg, MMO);        switch (MI.getOpcode()) {        default: @@ -1573,7 +1573,7 @@ LegalizerHelper::lower(MachineInstr &MI, unsigned TypeIdx, LLT Ty) {      unsigned PtrReg = MI.getOperand(1).getReg();      LLT SrcTy = MRI.getType(SrcReg);      MachineMemOperand &MMO = **MI.memoperands_begin(); -    if (SrcTy.getSizeInBits() != MMO.getSize() /* in bytes */ * 8) +    if (SrcTy.getSizeInBits() != MMO.getSizeInBits())        return UnableToLegalize;      if (SrcTy.isVector())        return UnableToLegalize; diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp index 4d388708308..b1964d68111 100644 --- a/llvm/lib/CodeGen/MachineVerifier.cpp +++ b/llvm/lib/CodeGen/MachineVerifier.cpp @@ -1022,13 +1022,13 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {        const MachineMemOperand &MMO = **MI->memoperands_begin();        if (MI->getOpcode() == TargetOpcode::G_ZEXTLOAD ||            MI->getOpcode() == TargetOpcode::G_SEXTLOAD) { -        if (MMO.getSize() * 8 >= ValTy.getSizeInBits()) +        if (MMO.getSizeInBits() >= ValTy.getSizeInBits())            report("Generic extload must have a narrower memory type", MI);        } else if (MI->getOpcode() == TargetOpcode::G_LOAD) { -        if (MMO.getSize() > (ValTy.getSizeInBits() + 7) / 8) +        if (MMO.getSize() > ValTy.getSizeInBytes())            report("load memory size cannot exceed result size", MI);        } else if (MI->getOpcode() == TargetOpcode::G_STORE) { -        if ((ValTy.getSizeInBits() + 7) / 8 < MMO.getSize()) +        if (ValTy.getSizeInBytes() < MMO.getSize())            report("store memory size cannot exceed value size", MI);        }      }  | 

