1 //===- AMDGPUMCInstLower.h - Lower MachineInstr to MCInst ------*- C++ -*--===//
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
7 //===----------------------------------------------------------------------===//
10 /// Header of lower AMDGPU MachineInstrs to their corresponding MCInst.
12 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPUMCINSTLOWER_H
16 #define LLVM_LIB_TARGET_AMDGPU_AMDGPUMCINSTLOWER_H
18 #include "AMDGPUTargetMachine.h"
19 #include "llvm/IR/Constants.h"
20 #include "llvm/Support/Casting.h"
29 class AMDGPUMCInstLower
{
31 const TargetSubtargetInfo
&ST
;
35 AMDGPUMCInstLower(MCContext
&ctx
, const TargetSubtargetInfo
&ST
,
36 const AsmPrinter
&AP
);
38 bool lowerOperand(const MachineOperand
&MO
, MCOperand
&MCOp
) const;
40 /// Lower a MachineInstr to an MCInst
41 void lower(const MachineInstr
*MI
, MCInst
&OutMI
) const;
45 static inline const MCExpr
*lowerAddrSpaceCast(const TargetMachine
&TM
,
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
51 auto &AT
= static_cast<const AMDGPUTargetMachine
&>(TM
);
52 auto *CE
= dyn_cast
<ConstantExpr
>(CV
);
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
),
69 #endif // LLVM_LIB_TARGET_AMDGPU_AMDGPUMCINSTLOWER_H