LLVM 23.0.0git
AMDGPUMCExpr.h
Go to the documentation of this file.
1//===- AMDGPUMCExpr.h - AMDGPU specific MC expression classes ---*- 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#ifndef LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCEXPR_H
10#define LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCEXPR_H
11
12#include "llvm/ADT/ArrayRef.h"
13#include "llvm/MC/MCExpr.h"
14
15namespace llvm {
16
17class Function;
18
19enum class LitModifier { None, Lit, Lit64 };
20
21/// AMDGPU target specific MCExpr operations.
22///
23/// Takes in a minimum of 1 argument to be used with an operation. The supported
24/// operations are:
25/// - (bitwise) or
26/// - max
27///
28/// \note If the 'or'/'max' operations are provided only a single argument, the
29/// operation will act as a no-op and simply resolve as the provided argument.
30///
31class AMDGPUMCExpr : public MCTargetExpr {
32public:
45
46 // Relocation specifiers.
47 enum Specifier {
49 S_GOTPCREL, // symbol@gotpcrel
50 S_GOTPCREL32_LO, // symbol@gotpcrel32@lo
51 S_GOTPCREL32_HI, // symbol@gotpcrel32@hi
52 S_REL32_LO, // symbol@rel32@lo
53 S_REL32_HI, // symbol@rel32@hi
54 S_REL64, // symbol@rel64
55 S_ABS32_LO, // symbol@abs32@lo
56 S_ABS32_HI, // symbol@abs32@hi
57 S_ABS64, // symbol@abs64
58 };
59
60private:
61 VariantKind Kind;
62 MCContext &Ctx;
63 const MCExpr **RawArgs;
65
66 AMDGPUMCExpr(VariantKind Kind, ArrayRef<const MCExpr *> Args, MCContext &Ctx);
67 ~AMDGPUMCExpr() override;
68
69 bool evaluateExtraSGPRs(MCValue &Res, const MCAssembler *Asm) const;
70 bool evaluateTotalNumVGPR(MCValue &Res, const MCAssembler *Asm) const;
71 bool evaluateAlignTo(MCValue &Res, const MCAssembler *Asm) const;
72 bool evaluateOccupancy(MCValue &Res, const MCAssembler *Asm) const;
73 bool evaluateInstPrefSize(MCValue &Res, const MCAssembler *Asm) const;
74
75public:
76 static const AMDGPUMCExpr *
77 create(VariantKind Kind, ArrayRef<const MCExpr *> Args, MCContext &Ctx);
78
79 static const AMDGPUMCExpr *createOr(ArrayRef<const MCExpr *> Args,
80 MCContext &Ctx) {
81 return create(VariantKind::AGVK_Or, Args, Ctx);
82 }
83
84 static const AMDGPUMCExpr *createMax(ArrayRef<const MCExpr *> Args,
85 MCContext &Ctx) {
86 return create(VariantKind::AGVK_Max, Args, Ctx);
87 }
88
89 static const AMDGPUMCExpr *createExtraSGPRs(const MCExpr *VCCUsed,
90 const MCExpr *FlatScrUsed,
91 bool XNACKUsed, MCContext &Ctx);
92
93 static const AMDGPUMCExpr *createTotalNumVGPR(const MCExpr *NumAGPR,
94 const MCExpr *NumVGPR,
95 MCContext &Ctx);
96
97 static const AMDGPUMCExpr *
100 }
101
102 /// Create an expression for instruction prefetch size computation:
103 /// min(divideCeil(CodeSizeBytes, CacheLineSize), (1 << FieldWidth) - 1)
104 /// FieldWidth and CacheLineSize are derived from the subtarget.
105 static const AMDGPUMCExpr *createInstPrefSize(const MCExpr *CodeSizeBytes,
106 MCContext &Ctx);
107
108 static const AMDGPUMCExpr *createLit(LitModifier Lit, int64_t Value,
109 MCContext &Ctx);
110
111 ArrayRef<const MCExpr *> getArgs() const { return Args; }
112 VariantKind getKind() const { return Kind; }
113 MCContext &getCtx() const { return Ctx; }
114 const MCExpr *getSubExpr(size_t Index) const;
115
116 void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override;
118 const MCAssembler *Asm) const override;
119 void visitUsedExpr(MCStreamer &Streamer) const override;
120 MCFragment *findAssociatedFragment() const override;
121
122 static bool classof(const MCExpr *E) {
123 return E->getKind() == MCExpr::Target;
124 }
125 static bool isSymbolUsedInExpression(const MCSymbol *Sym, const MCExpr *E);
126};
127
128namespace AMDGPU {
129// Tries to leverage KnownBits for MCExprs to reduce and limit any composed
130// MCExprs printing. E.g., for an expression such as
131// ((unevaluatable_sym | 1) & 1) won't evaluate due to unevaluatable_sym and
132// would verbosely print the full expression; however, KnownBits should deduce
133// the value to be 1. Particularly useful for AMDGPU metadata MCExprs.
134void printAMDGPUMCExpr(const MCExpr *Expr, raw_ostream &OS,
135 const MCAsmInfo *MAI);
136
137const MCExpr *foldAMDGPUMCExpr(const MCExpr *Expr, MCContext &Ctx);
138
140 return AMDGPUMCExpr::Specifier(SRE->getKind());
141}
142
143LLVM_READONLY bool isLitExpr(const MCExpr *Expr);
144
145LLVM_READONLY int64_t getLitValue(const MCExpr *Expr);
146
148
149} // end namespace AMDGPU
150} // end namespace llvm
151
152#endif // LLVM_LIB_TARGET_AMDGPU_MCTARGETDESC_AMDGPUMCEXPR_H
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_READONLY
Definition Compiler.h:322
AMDGPU target specific MCExpr operations.
ArrayRef< const MCExpr * > getArgs() const
MCFragment * findAssociatedFragment() const override
static const AMDGPUMCExpr * createInstPrefSize(const MCExpr *CodeSizeBytes, MCContext &Ctx)
Create an expression for instruction prefetch size computation: min(divideCeil(CodeSizeBytes,...
static const AMDGPUMCExpr * createMax(ArrayRef< const MCExpr * > Args, MCContext &Ctx)
void visitUsedExpr(MCStreamer &Streamer) const override
static const AMDGPUMCExpr * createTotalNumVGPR(const MCExpr *NumAGPR, const MCExpr *NumVGPR, MCContext &Ctx)
static const AMDGPUMCExpr * createLit(LitModifier Lit, int64_t Value, MCContext &Ctx)
static const AMDGPUMCExpr * create(VariantKind Kind, ArrayRef< const MCExpr * > Args, MCContext &Ctx)
bool evaluateAsRelocatableImpl(MCValue &Res, const MCAssembler *Asm) const override
MCContext & getCtx() const
static const AMDGPUMCExpr * createExtraSGPRs(const MCExpr *VCCUsed, const MCExpr *FlatScrUsed, bool XNACKUsed, MCContext &Ctx)
Allow delayed MCExpr resolve of ExtraSGPRs (in case VCCUsed or FlatScrUsed are unresolvable but neede...
static const AMDGPUMCExpr * createAlignTo(const MCExpr *Value, const MCExpr *Align, MCContext &Ctx)
static const AMDGPUMCExpr * createOr(ArrayRef< const MCExpr * > Args, MCContext &Ctx)
const MCExpr * getSubExpr(size_t Index) const
void printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const override
static bool classof(const MCExpr *E)
VariantKind getKind() const
static bool isSymbolUsedInExpression(const MCSymbol *Sym, const MCExpr *E)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:66
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
@ Target
Target specific expression.
Definition MCExpr.h:46
Streaming machine code generation interface.
Definition MCStreamer.h:222
Represent a reference to a symbol from inside an expression.
Definition MCExpr.h:190
VariantKind getKind() const
Definition MCExpr.h:232
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
LLVM Value Representation.
Definition Value.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
static AMDGPUMCExpr::Specifier getSpecifier(const MCSymbolRefExpr *SRE)
LLVM_READONLY bool isLitExpr(const MCExpr *Expr)
void printAMDGPUMCExpr(const MCExpr *Expr, raw_ostream &OS, const MCAsmInfo *MAI)
LLVM_READONLY AMDGPUMCExpr::VariantKind getExprKind(const MCExpr *Expr)
LLVM_READONLY int64_t getLitValue(const MCExpr *Expr)
const MCExpr * foldAMDGPUMCExpr(const MCExpr *Expr, MCContext &Ctx)
This is an optimization pass for GlobalISel generic memory operations.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39