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 AndricAMDGPUInstrInfo::AMDGPUInstrInfo(const GCNSubtarget &ST) { } 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // TODO: Should largely merge with AMDGPUTTIImpl::isSourceOfDivergence. isUniformMMO(const MachineMemOperand * MMO)310b57cec5SDimitry Andricbool 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