diff options
Diffstat (limited to 'llvm/lib/Target/R600/SIISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/R600/SIISelLowering.cpp | 34 | 
1 files changed, 30 insertions, 4 deletions
| diff --git a/llvm/lib/Target/R600/SIISelLowering.cpp b/llvm/lib/Target/R600/SIISelLowering.cpp index ae405aca4e1..af38c94928a 100644 --- a/llvm/lib/Target/R600/SIISelLowering.cpp +++ b/llvm/lib/Target/R600/SIISelLowering.cpp @@ -1342,6 +1342,35 @@ SDValue SITargetLowering::performUCharToFloatCombine(SDNode *N,    return SDValue();  } +/// \brief Return true if the given offset Size in bytes can be folded into +/// the immediate offsets of a memory instruction for the given address space. +static bool canFoldOffset(unsigned OffsetSize, unsigned AS, +                          const AMDGPUSubtarget &STI) { +  switch (AS) { +  case AMDGPUAS::GLOBAL_ADDRESS: { +    // MUBUF instructions a 12-bit offset in bytes. +    return isUInt<12>(OffsetSize); +  } +  case AMDGPUAS::CONSTANT_ADDRESS: { +    // SMRD instructions have an 8-bit offset in dwords on SI and +    // a 20-bit offset in bytes on VI. +    if (STI.getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS) +      return isUInt<20>(OffsetSize); +    else +      return (OffsetSize % 4 == 0) && isUInt<8>(OffsetSize / 4); +  } +  case AMDGPUAS::LOCAL_ADDRESS: +  case AMDGPUAS::REGION_ADDRESS: { +    // The single offset versions have a 16-bit offset in bytes. +    return isUInt<16>(OffsetSize); +  } +  case AMDGPUAS::PRIVATE_ADDRESS: +  // Indirect register addressing does not use any offsets. +  default: +    return 0; +  } +} +  // (shl (add x, c1), c2) -> add (shl x, c2), (shl c1, c2)  // This is a variant of @@ -1373,13 +1402,10 @@ SDValue SITargetLowering::performSHLPtrCombine(SDNode *N,    if (!CAdd)      return SDValue(); -  const SIInstrInfo *TII = -      static_cast<const SIInstrInfo *>(Subtarget->getInstrInfo()); -    // If the resulting offset is too large, we can't fold it into the addressing    // mode offset.    APInt Offset = CAdd->getAPIntValue() << CN1->getAPIntValue(); -  if (!TII->canFoldOffset(Offset.getZExtValue(), AddrSpace)) +  if (!canFoldOffset(Offset.getZExtValue(), AddrSpace, *Subtarget))      return SDValue();    SelectionDAG &DAG = DCI.DAG; | 

