The test changes are mostly GlobalISel specific regressions. GlobalISel is still relying on isUniformMMO, but it doesn't really have an excuse for doing so. These should be avoidable with new regbankselect. There is an additional regression for addrspacecast for cov4. We probably ought to be using a separate PseudoSourceValue for the access of the queue pointer.
56 lines
1.8 KiB
C++
56 lines
1.8 KiB
C++
//===-- 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/MachineInstr.h"
|
|
#include "llvm/CodeGen/MachineMemOperand.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include "llvm/IR/Instruction.h"
|
|
#include "llvm/IR/Value.h"
|
|
|
|
using namespace llvm;
|
|
|
|
Intrinsic::ID AMDGPU::getIntrinsicID(const MachineInstr &I) {
|
|
return I.getOperand(I.getNumExplicitDefs()).getIntrinsicID();
|
|
}
|
|
|
|
// TODO: Should largely merge with AMDGPUTTIImpl::isSourceOfDivergence.
|
|
bool AMDGPU::isUniformMMO(const MachineMemOperand *MMO) {
|
|
const Value *Ptr = MMO->getValue();
|
|
if (!Ptr) {
|
|
if (const PseudoSourceValue *PSV = MMO->getPseudoValue()) {
|
|
return PSV->isConstantPool() || PSV->isStack() || PSV->isGOT() ||
|
|
PSV->isJumpTable();
|
|
}
|
|
|
|
// Unknown value.
|
|
return false;
|
|
}
|
|
|
|
// UndefValue means this is a load of a kernel input. These are uniform.
|
|
// Sometimes LDS instructions have constant pointers.
|
|
if (isa<UndefValue, Constant, 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");
|
|
}
|