MLIR 23.0.0git
TargetEnv.cpp
Go to the documentation of this file.
1//===-------------- TosaTarget.cpp - TOSA Target utilities ----------------===//
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
10#include "llvm/Support/FormatVariadic.h"
11
12namespace mlir {
13namespace tosa {
14
15TosaLevel getTosaLevelFromEnum(const Level level) {
16 switch (level) {
17 case Level::eightK:
18 return TOSA_LEVEL_EIGHTK;
19 case Level::none:
20 return TOSA_LEVEL_NONE;
21 }
22 llvm_unreachable("Unknown TOSA level");
23}
24
26 return llvm::formatv("{0}.{1}{2}", version.getMajor(), version.getMinor(),
27 version.isDraft() ? ".draft" : "");
28}
29
30TosaSpecificationVersion getMinVersion(const Profile &profile) {
31 switch (profile) {
32 case Profile::pro_int:
33 case Profile::pro_fp:
34 return TosaSpecificationVersion(1, 0);
35 case Profile::none:
36 return TosaSpecificationVersion(0, 0);
37 }
38 llvm_unreachable("Unknown TOSA profile");
39}
40
41TosaSpecificationVersion getMinVersion(const Extension &extension) {
42 switch (extension) {
43 case Extension::int16:
44 case Extension::int4:
45 case Extension::bf16:
46 case Extension::fp8e4m3:
47 case Extension::fp8e5m2:
48 case Extension::fft:
49 case Extension::variable:
50 case Extension::controlflow:
51 case Extension::doubleround:
52 case Extension::inexactround:
53 case Extension::dynamic:
54 return TosaSpecificationVersion(1, 0);
55 case Extension::mxfp:
56 case Extension::int64:
57 case Extension::mxfp_conv:
58 case Extension::shape:
59 case Extension::mx_common:
60 case Extension::mx_fp4e2m1:
61 case Extension::mx_fp6e2m3:
62 case Extension::mx_fp6e3m2:
63 case Extension::mx_fp8e4m3:
64 case Extension::mx_fp8e5m2:
65 case Extension::mx_int8:
66 return TosaSpecificationVersion(1, 1, true);
67 case Extension::none:
68 return TosaSpecificationVersion(0, 0);
69 }
70 llvm_unreachable("Unknown TOSA extension");
71}
72
74 switch (ext) {
75 case Extension::int16:
76 case Extension::int4:
77 case Extension::doubleround:
78 case Extension::inexactround:
79 return {Profile::pro_int};
80 case Extension::bf16:
81 case Extension::fp8e4m3:
82 case Extension::fp8e5m2:
83 case Extension::fft:
84 case Extension::mxfp:
85 case Extension::mxfp_conv:
86 case Extension::mx_common:
87 case Extension::mx_fp4e2m1:
88 case Extension::mx_fp6e2m3:
89 case Extension::mx_fp6e3m2:
90 case Extension::mx_fp8e4m3:
91 case Extension::mx_fp8e5m2:
92 case Extension::mx_int8:
93 return {Profile::pro_fp};
94 case Extension::variable:
95 case Extension::controlflow:
96 case Extension::dynamic:
97 case Extension::int64:
98 case Extension::shape:
99 return {Profile::pro_fp, Profile::pro_int};
100 case Extension::none:
101 return {};
102 };
103 llvm_unreachable("bad Extension type");
104}
105
107 switch (level) {
108 case Level::eightK:
109 case Level::none:
110 return TosaSpecificationVersion(1, 0);
111 }
112 llvm_unreachable("Unknown TOSA level");
113}
114
115FailureOr<TargetEnv>
116TargetEnv::createTargetEnvFromAttr(TargetEnvAttr targetAttr,
117 Location targetEnvAttrLoc) {
118 if (failed(verifyTargetInformation(targetAttr, targetEnvAttrLoc)))
119 return failure();
120
121 return TargetEnv(targetAttr.getSpecificationVersion(), targetAttr.getLevel(),
122 targetAttr.getProfiles(), targetAttr.getExtensions());
123}
124
125LogicalResult TargetEnv::verifyTargetInformation(TargetEnvAttr targetAttr,
126 Location targetAttrLoc) {
127 TosaSpecificationVersion targetVersion(targetAttr.getSpecificationVersion());
128
129 const auto isCompatibleWithTargetVersion =
130 [&](const auto &targetEnum, Location targetAttrLoc,
131 StringRef enumName) -> LogicalResult {
132 const TosaSpecificationVersion minRequiredVersion =
133 getMinVersion(targetEnum);
134 if (!targetVersion.isBackwardsCompatibleWith(minRequiredVersion))
135 return emitError(targetAttrLoc, enumName)
136 << " '" << stringifyEnum(targetEnum)
137 << "' is not compatible with the target version "
138 << stringifyVersion(targetVersion)
139 << ", minimum required version is "
140 << stringifyVersion(minRequiredVersion);
141 return success();
142 };
143
144 const auto isExtensionCooperativeWithProfile =
145 [&](Extension ext) -> LogicalResult {
146 const auto cooperativeProfiles = getCooperativeProfiles(ext);
147
148 const ArrayRef<Profile> targetProfiles = targetAttr.getProfiles();
149 if (!llvm::any_of(cooperativeProfiles,
150 [&targetProfiles](const auto &profile) {
151 return llvm::is_contained(targetProfiles, profile);
152 }))
153 return emitError(targetAttrLoc)
154 << "use of extension '" << stringifyEnum(ext)
155 << "' requires any of profiles: [" << cooperativeProfiles
156 << "] to be enabled in the target";
157
158 return success();
159 };
160
161 for (const auto &profile : targetAttr.getProfiles())
162 if (failed(
163 isCompatibleWithTargetVersion(profile, targetAttrLoc, "profile")))
164 return failure();
165 for (const auto &extension : targetAttr.getExtensions()) {
166 if (failed(isCompatibleWithTargetVersion(extension, targetAttrLoc,
167 "extension")))
168 return failure();
169 if (failed(isExtensionCooperativeWithProfile(extension)))
170 return failure();
171 }
172 if (failed(isCompatibleWithTargetVersion(targetAttr.getLevel(), targetAttrLoc,
173 "level")))
174 return failure();
175
176 return success();
177}
178
179TargetEnvAttr lookupTargetEnv(Operation *op) {
180 while (op) {
182 if (!op)
183 break;
184
185 if (auto attr = op->getAttrOfType<TargetEnvAttr>(TargetEnvAttr::name))
186 return attr;
187
188 op = op->getParentOp();
189 }
190
191 return {};
192}
193
194TargetEnvAttr getDefaultTargetEnv(MLIRContext *context) {
195 return TargetEnvAttr::get(context, SpecificationVersion::V_1_0, Level::eightK,
196 {Profile::pro_int, Profile::pro_fp}, {});
197}
198
200 if (auto attr = lookupTargetEnv(op))
201 return attr;
202
203 return getDefaultTargetEnv(op->getContext());
204}
205
206} // namespace tosa
207} // namespace mlir
return success()
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition Location.h:76
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:63
Operation is the basic unit of execution within MLIR.
Definition Operation.h:87
AttrClass getAttrOfType(StringAttr name)
Definition Operation.h:575
Operation * getParentOp()
Returns the closest surrounding operation that contains this operation or nullptr if this is a top-le...
Definition Operation.h:251
MLIRContext * getContext()
Return the context this operation is associated with.
Definition Operation.h:233
static Operation * getNearestSymbolTable(Operation *from)
Returns the nearest symbol table from a given operation from.
static FailureOr< TargetEnv > createTargetEnvFromAttr(TargetEnvAttr targetAttr, Location targetEnvAttrLoc)
static LogicalResult verifyTargetInformation(TargetEnvAttr targetAttr, Location targetAttrLoc)
A thin wrapper around the SpecificationVersion enum to represent and provide utilities around the TOS...
Definition TargetEnv.h:60
bool isBackwardsCompatibleWith(TosaSpecificationVersion baseVersion) const
Definition TargetEnv.h:69
llvm::SmallString< 4 > stringifyVersion(TosaSpecificationVersion version)
Definition TargetEnv.cpp:25
TosaLevel getTosaLevelFromEnum(const Level level)
Definition TargetEnv.cpp:15
static constexpr TosaLevel TOSA_LEVEL_EIGHTK
Definition TargetEnv.h:43
static constexpr TosaLevel TOSA_LEVEL_NONE
Definition TargetEnv.h:45
SmallVector< Profile, 2 > getCooperativeProfiles(Extension ext)
Definition TargetEnv.cpp:73
TargetEnvAttr getDefaultTargetEnv(MLIRContext *context)
TosaSpecificationVersion getMinVersion(const Profile &profile)
Definition TargetEnv.cpp:30
TargetEnvAttr lookupTargetEnv(Operation *op)
TargetEnvAttr lookupTargetEnvOrDefault(Operation *op)
Queries the target environment recursively from enclosing symbol table ops containing the given op or...
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.