diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.cpp | 49 | 
1 files changed, 49 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.cpp b/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.cpp new file mode 100644 index 000000000000..f2d62956e25b --- /dev/null +++ b/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUInstrInfo.cpp @@ -0,0 +1,49 @@ +//===-- AMDGPUInstrInfo.cpp - Base class for AMD GPU InstrInfo ------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +/// \file +/// \brief Implementation of the TargetInstrInfo class that is common to all +/// AMD GPUs. +// +//===----------------------------------------------------------------------===// + +#include "AMDGPUInstrInfo.h" +#include "AMDGPU.h" +#include "llvm/CodeGen/MachineMemOperand.h" +#include "llvm/IR/Constants.h" +#include "llvm/IR/Instruction.h" +#include "llvm/IR/Value.h" + +using namespace llvm; + +// Pin the vtable to this file. +//void AMDGPUInstrInfo::anchor() {} + +AMDGPUInstrInfo::AMDGPUInstrInfo(const GCNSubtarget &ST) { } + + +// TODO: Should largely merge with AMDGPUTTIImpl::isSourceOfDivergence. +bool AMDGPUInstrInfo::isUniformMMO(const MachineMemOperand *MMO) { +  const Value *Ptr = MMO->getValue(); +  // UndefValue means this is a load of a kernel input.  These are uniform. +  // Sometimes LDS instructions have constant pointers. +  // If Ptr is null, then that means this mem operand contains a +  // PseudoSourceValue like GOT. +  if (!Ptr || isa<UndefValue>(Ptr) || +      isa<Constant>(Ptr) || isa<GlobalValue>(Ptr)) +    return true; + +  if (MMO->getAddrSpace() == AMDGPUAS::CONSTANT_ADDRESS_32BIT) +    return true; + +  if (const Argument *Arg = dyn_cast<Argument>(Ptr)) +    return AMDGPU::isArgPassedInSGPR(Arg); + +  const Instruction *I = dyn_cast<Instruction>(Ptr); +  return I && I->getMetadata("amdgpu.uniform"); +}  | 
