10b57cec5SDimitry Andric //===-- AMDGPUInstrInfo.cpp - Base class for AMD GPU InstrInfo ------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric /// \file
100b57cec5SDimitry Andric /// \brief Implementation of the TargetInstrInfo class that is common to all
110b57cec5SDimitry Andric /// AMD GPUs.
120b57cec5SDimitry Andric //
130b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #include "AMDGPUInstrInfo.h"
16*af732203SDimitry Andric #include "AMDGPU.h"
17*af732203SDimitry Andric #include "llvm/CodeGen/MachineMemOperand.h"
18*af732203SDimitry Andric #include "llvm/IR/Constants.h"
19*af732203SDimitry Andric #include "llvm/IR/Instruction.h"
20*af732203SDimitry Andric #include "llvm/IR/Value.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric using namespace llvm;
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric // Pin the vtable to this file.
250b57cec5SDimitry Andric //void AMDGPUInstrInfo::anchor() {}
260b57cec5SDimitry Andric 
AMDGPUInstrInfo(const GCNSubtarget & ST)270b57cec5SDimitry Andric AMDGPUInstrInfo::AMDGPUInstrInfo(const GCNSubtarget &ST) { }
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric // TODO: Should largely merge with AMDGPUTTIImpl::isSourceOfDivergence.
isUniformMMO(const MachineMemOperand * MMO)310b57cec5SDimitry Andric bool AMDGPUInstrInfo::isUniformMMO(const MachineMemOperand *MMO) {
320b57cec5SDimitry Andric   const Value *Ptr = MMO->getValue();
330b57cec5SDimitry Andric   // UndefValue means this is a load of a kernel input.  These are uniform.
340b57cec5SDimitry Andric   // Sometimes LDS instructions have constant pointers.
350b57cec5SDimitry Andric   // If Ptr is null, then that means this mem operand contains a
360b57cec5SDimitry Andric   // PseudoSourceValue like GOT.
370b57cec5SDimitry Andric   if (!Ptr || isa<UndefValue>(Ptr) ||
380b57cec5SDimitry Andric       isa<Constant>(Ptr) || isa<GlobalValue>(Ptr))
390b57cec5SDimitry Andric     return true;
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric   if (MMO->getAddrSpace() == AMDGPUAS::CONSTANT_ADDRESS_32BIT)
420b57cec5SDimitry Andric     return true;
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   if (const Argument *Arg = dyn_cast<Argument>(Ptr))
450b57cec5SDimitry Andric     return AMDGPU::isArgPassedInSGPR(Arg);
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric   const Instruction *I = dyn_cast<Instruction>(Ptr);
480b57cec5SDimitry Andric   return I && I->getMetadata("amdgpu.uniform");
490b57cec5SDimitry Andric }
50