LLVM 17.0.0git
AMDGPUMCInstLower.h
Go to the documentation of this file.
1//===- AMDGPUMCInstLower.h - Lower MachineInstr to MCInst ------*- C++ -*--===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file
10/// Header of lower AMDGPU MachineInstrs to their corresponding MCInst.
11//
12//===----------------------------------------------------------------------===//
13//
14
15#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMCINSTLOWER_H
16#define LLVM_LIB_TARGET_AMDGPU_AMDGPUMCINSTLOWER_H
17
18#include "AMDGPUTargetMachine.h"
19#include "llvm/IR/Constants.h"
21
22namespace llvm {
23class AsmPrinter;
24class MCContext;
25} // namespace llvm
26
27using namespace llvm;
28
30 MCContext &Ctx;
31 const TargetSubtargetInfo &ST;
32 const AsmPrinter ≈
33
34public:
36 const AsmPrinter &AP);
37
38 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const;
39
40 /// Lower a MachineInstr to an MCInst
41 void lower(const MachineInstr *MI, MCInst &OutMI) const;
42};
43
44namespace {
45static inline const MCExpr *lowerAddrSpaceCast(const TargetMachine &TM,
46 const Constant *CV,
47 MCContext &OutContext) {
48 // TargetMachine does not support llvm-style cast. Use C++-style cast.
49 // This is safe since TM is always of type AMDGPUTargetMachine or its
50 // derived class.
51 auto &AT = static_cast<const AMDGPUTargetMachine &>(TM);
52 auto *CE = dyn_cast<ConstantExpr>(CV);
53
54 // Lower null pointers in private and local address space.
55 // Clang generates addrspacecast for null pointers in private and local
56 // address space, which needs to be lowered.
57 if (CE && CE->getOpcode() == Instruction::AddrSpaceCast) {
58 auto Op = CE->getOperand(0);
59 auto SrcAddr = Op->getType()->getPointerAddressSpace();
60 if (Op->isNullValue() && AT.getNullPointerValue(SrcAddr) == 0) {
61 auto DstAddr = CE->getType()->getPointerAddressSpace();
62 return MCConstantExpr::create(AT.getNullPointerValue(DstAddr),
63 OutContext);
64 }
65 }
66 return nullptr;
67}
68} // namespace
69#endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMCINSTLOWER_H
The AMDGPU TargetMachine interface definition for hw codegen targets.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
IRTranslator LLVM IR MI
const char LLVMTargetMachineRef TM
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const
void lower(const MachineInstr *MI, MCInst &OutMI) const
Lower a MachineInstr to an MCInst.
This class is intended to be used as a driving class for all asm writers.
Definition: AsmPrinter.h:84
This is an important base class in LLVM.
Definition: Constant.h:41
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Definition: MCExpr.cpp:194
Context object for machine code objects.
Definition: MCContext.h:76
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
Instances of this class represent operands of the MCInst class.
Definition: MCInst.h:36
Representation of each machine instruction.
Definition: MachineInstr.h:68
MachineOperand class - Representation of each machine instruction operand.
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:78
TargetSubtargetInfo - Generic base class for all target subtargets.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18