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 return TosaSpecificationVersion(1, 1, true);
60 case Extension::none:
61 return TosaSpecificationVersion(0, 0);
62 }
63 llvm_unreachable("Unknown TOSA extension");
64}
65
67 switch (ext) {
68 case Extension::int16:
69 case Extension::int4:
70 case Extension::doubleround:
71 case Extension::inexactround:
72 return {Profile::pro_int};
73 case Extension::bf16:
74 case Extension::fp8e4m3:
75 case Extension::fp8e5m2:
76 case Extension::fft:
77 case Extension::mxfp:
78 case Extension::mxfp_conv:
79 return {Profile::pro_fp};
80 case Extension::variable:
81 case Extension::controlflow:
82 case Extension::dynamic:
83 case Extension::int64:
84 case Extension::shape:
85 return {Profile::pro_fp, Profile::pro_int};
86 case Extension::none:
87 return {};
88 };
89 llvm_unreachable("bad Extension type");
90}
91
93 switch (level) {
94 case Level::eightK:
95 case Level::none:
96 return TosaSpecificationVersion(1, 0);
97 }
98 llvm_unreachable("Unknown TOSA level");
99}
100
101FailureOr<TargetEnv>
102TargetEnv::createTargetEnvFromAttr(TargetEnvAttr targetAttr,
103 Location targetEnvAttrLoc) {
104 if (failed(verifyTargetInformation(targetAttr, targetEnvAttrLoc)))
105 return failure();
106
107 return TargetEnv(targetAttr.getSpecificationVersion(), targetAttr.getLevel(),
108 targetAttr.getProfiles(), targetAttr.getExtensions());
109}
110
111LogicalResult TargetEnv::verifyTargetInformation(TargetEnvAttr targetAttr,
112 Location targetAttrLoc) {
113 TosaSpecificationVersion targetVersion(targetAttr.getSpecificationVersion());
114
115 const auto isCompatibleWithTargetVersion =
116 [&](const auto &targetEnum, Location targetAttrLoc,
117 StringRef enumName) -> LogicalResult {
118 const TosaSpecificationVersion minRequiredVersion =
119 getMinVersion(targetEnum);
120 if (!targetVersion.isBackwardsCompatibleWith(minRequiredVersion))
121 return emitError(targetAttrLoc, enumName)
122 << " '" << stringifyEnum(targetEnum)
123 << "' is not compatible with the target version "
124 << stringifyVersion(targetVersion)
125 << ", minimum required version is "
126 << stringifyVersion(minRequiredVersion);
127 return success();
128 };
129
130 const auto isExtensionCooperativeWithProfile =
131 [&](Extension ext) -> LogicalResult {
132 const auto cooperativeProfiles = getCooperativeProfiles(ext);
133
134 const ArrayRef<Profile> targetProfiles = targetAttr.getProfiles();
135 if (!llvm::any_of(cooperativeProfiles,
136 [&targetProfiles](const auto &profile) {
137 return llvm::is_contained(targetProfiles, profile);
138 }))
139 return emitError(targetAttrLoc)
140 << "use of extension '" << stringifyEnum(ext)
141 << "' requires any of profiles: [" << cooperativeProfiles
142 << "] to be enabled in the target";
143
144 return success();
145 };
146
147 for (const auto &profile : targetAttr.getProfiles())
148 if (failed(
149 isCompatibleWithTargetVersion(profile, targetAttrLoc, "profile")))
150 return failure();
151 for (const auto &extension : targetAttr.getExtensions()) {
152 if (failed(isCompatibleWithTargetVersion(extension, targetAttrLoc,
153 "extension")))
154 return failure();
155 if (failed(isExtensionCooperativeWithProfile(extension)))
156 return failure();
157 }
158 if (failed(isCompatibleWithTargetVersion(targetAttr.getLevel(), targetAttrLoc,
159 "level")))
160 return failure();
161
162 return success();
163}
164
165TargetEnvAttr lookupTargetEnv(Operation *op) {
166 while (op) {
168 if (!op)
169 break;
170
171 if (auto attr = op->getAttrOfType<TargetEnvAttr>(TargetEnvAttr::name))
172 return attr;
173
174 op = op->getParentOp();
175 }
176
177 return {};
178}
179
180TargetEnvAttr getDefaultTargetEnv(MLIRContext *context) {
181 return TargetEnvAttr::get(context, SpecificationVersion::V_1_0, Level::eightK,
182 {Profile::pro_int, Profile::pro_fp}, {});
183}
184
186 if (auto attr = lookupTargetEnv(op))
187 return attr;
188
189 return getDefaultTargetEnv(op->getContext());
190}
191
192} // namespace tosa
193} // 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:66
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.