blob: 0e43b4fe9461f468d4b38131ab8d73bb7f4b1606 [file] [log] [blame]
//===- AMDGPUMCInstLower.h - Lower AMDGPU MachineInstr to an MCInst -------===//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
/// \file
/// Header of lower AMDGPU MachineInstrs to their corresponding MCInst.
#include "AMDGPUTargetMachine.h"
#include "llvm/IR/Constants.h"
#include "llvm/Support/Casting.h"
namespace llvm {
class AsmPrinter;
class MCContext;
} // namespace llvm
using namespace llvm;
class AMDGPUMCInstLower {
MCContext &Ctx;
const TargetSubtargetInfo &ST;
const AsmPrinter ≈
AMDGPUMCInstLower(MCContext &ctx, const TargetSubtargetInfo &ST,
const AsmPrinter &AP);
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const;
/// Lower a MachineInstr to an MCInst
void lower(const MachineInstr *MI, MCInst &OutMI) const;
namespace {
static inline const MCExpr *lowerAddrSpaceCast(const TargetMachine &TM,
const Constant *CV,
MCContext &OutContext) {
// TargetMachine does not support llvm-style cast. Use C++-style cast.
// This is safe since TM is always of type AMDGPUTargetMachine or its
// derived class.
auto &AT = static_cast<const AMDGPUTargetMachine &>(TM);
auto *CE = dyn_cast<ConstantExpr>(CV);
// Lower null pointers in private and local address space.
// Clang generates addrspacecast for null pointers in private and local
// address space, which needs to be lowered.
if (CE && CE->getOpcode() == Instruction::AddrSpaceCast) {
auto Op = CE->getOperand(0);
auto SrcAddr = Op->getType()->getPointerAddressSpace();
if (Op->isNullValue() && AT.getNullPointerValue(SrcAddr) == 0) {
auto DstAddr = CE->getType()->getPointerAddressSpace();
return MCConstantExpr::create(AT.getNullPointerValue(DstAddr),
return nullptr;
} // namespace