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
16 return llvm::formatv("{0}.{1}", version.getMajor(), version.getMinor());
17}
18
19TosaSpecificationVersion getMinVersion(const Profile &profile) {
20 switch (profile) {
21 case Profile::pro_int:
22 case Profile::pro_fp:
23 return TosaSpecificationVersion(1, 0);
24 case Profile::none:
25 return TosaSpecificationVersion(0, 0);
26 }
27 llvm_unreachable("Unknown TOSA profile");
28}
29
30TosaSpecificationVersion getMinVersion(const Extension &extension) {
31 switch (extension) {
32 case Extension::int16:
33 case Extension::int4:
34 case Extension::bf16:
35 case Extension::fp8e4m3:
36 case Extension::fp8e5m2:
37 case Extension::fft:
38 case Extension::variable:
39 case Extension::controlflow:
40 case Extension::doubleround:
41 case Extension::inexactround:
42 case Extension::dynamic:
43 return TosaSpecificationVersion(1, 0);
44 case Extension::mxfp:
45 case Extension::int64:
46 case Extension::mxfp_conv:
47 case Extension::shape:
48 return TosaSpecificationVersion(1, 1);
49 case Extension::none:
50 return TosaSpecificationVersion(0, 0);
51 }
52 llvm_unreachable("Unknown TOSA extension");
53}
54
56 switch (ext) {
57 case Extension::int16:
58 case Extension::int4:
59 case Extension::doubleround:
60 case Extension::inexactround:
61 return {Profile::pro_int};
62 case Extension::bf16:
63 case Extension::fp8e4m3:
64 case Extension::fp8e5m2:
65 case Extension::fft:
66 case Extension::mxfp:
67 case Extension::mxfp_conv:
68 return {Profile::pro_fp};
69 case Extension::variable:
70 case Extension::controlflow:
71 case Extension::dynamic:
72 case Extension::int64:
73 case Extension::shape:
74 return {Profile::pro_fp, Profile::pro_int};
75 case Extension::none:
76 return {};
77 };
78 llvm_unreachable("bad Extension type");
79}
80
82 switch (level) {
83 case Level::eightK:
84 case Level::none:
85 return TosaSpecificationVersion(1, 0);
86 }
87 llvm_unreachable("Unknown TOSA level");
88}
89
90FailureOr<TargetEnv>
91TargetEnv::createTargetEnvFromAttr(TargetEnvAttr targetAttr,
92 Location targetEnvAttrLoc) {
93 if (failed(verifyTargetInformation(targetAttr, targetEnvAttrLoc)))
94 return failure();
95
96 return TargetEnv(targetAttr.getSpecificationVersion(), targetAttr.getLevel(),
97 targetAttr.getProfiles(), targetAttr.getExtensions());
98}
99
100LogicalResult TargetEnv::verifyTargetInformation(TargetEnvAttr targetAttr,
101 Location targetAttrLoc) {
102 TosaSpecificationVersion targetVersion(targetAttr.getSpecificationVersion());
103
104 const auto isCompatibleWithTargetVersion =
105 [&](const auto &targetEnum, Location targetAttrLoc,
106 StringRef enumName) -> LogicalResult {
107 const TosaSpecificationVersion minRequiredVersion =
108 getMinVersion(targetEnum);
109 if (!targetVersion.isBackwardsCompatibleWith(minRequiredVersion))
110 return emitError(targetAttrLoc, enumName)
111 << " '" << stringifyEnum(targetEnum)
112 << "' is not compatible with the target version "
113 << stringifyVersion(targetVersion)
114 << ", minimum required version is "
115 << stringifyVersion(minRequiredVersion);
116 return success();
117 };
118
119 const auto isExtensionCooperativeWithProfile =
120 [&](Extension ext) -> LogicalResult {
121 const auto cooperativeProfiles = getCooperativeProfiles(ext);
122
123 const ArrayRef<Profile> targetProfiles = targetAttr.getProfiles();
124 if (!llvm::any_of(cooperativeProfiles,
125 [&targetProfiles](const auto &profile) {
126 return llvm::is_contained(targetProfiles, profile);
127 }))
128 return emitError(targetAttrLoc)
129 << "use of extension '" << stringifyEnum(ext)
130 << "' requires any of profiles: [" << cooperativeProfiles
131 << "] to be enabled in the target";
132
133 return success();
134 };
135
136 for (const auto &profile : targetAttr.getProfiles())
137 if (failed(
138 isCompatibleWithTargetVersion(profile, targetAttrLoc, "profile")))
139 return failure();
140 for (const auto &extension : targetAttr.getExtensions()) {
141 if (failed(isCompatibleWithTargetVersion(extension, targetAttrLoc,
142 "extension")))
143 return failure();
144 if (failed(isExtensionCooperativeWithProfile(extension)))
145 return failure();
146 }
147 if (failed(isCompatibleWithTargetVersion(targetAttr.getLevel(), targetAttrLoc,
148 "level")))
149 return failure();
150
151 return success();
152}
153
154TargetEnvAttr lookupTargetEnv(Operation *op) {
155 while (op) {
157 if (!op)
158 break;
159
160 if (auto attr = op->getAttrOfType<TargetEnvAttr>(TargetEnvAttr::name))
161 return attr;
162
163 op = op->getParentOp();
164 }
165
166 return {};
167}
168
169TargetEnvAttr getDefaultTargetEnv(MLIRContext *context) {
170 return TargetEnvAttr::get(context, SpecificationVersion::V_1_0, Level::eightK,
171 {Profile::pro_int, Profile::pro_fp}, {});
172}
173
175 if (auto attr = lookupTargetEnv(op))
176 return attr;
177
178 return getDefaultTargetEnv(op->getContext());
179}
180
181} // namespace tosa
182} // 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:88
AttrClass getAttrOfType(StringAttr name)
Definition Operation.h:579
Operation * getParentOp()
Returns the closest surrounding operation that contains this operation or nullptr if this is a top-le...
Definition Operation.h:255
MLIRContext * getContext()
Return the context this operation is associated with.
Definition Operation.h:237
static Operation * getNearestSymbolTable(Operation *from)
Returns the nearest symbol table from a given operation from.
static FailureOr< TargetEnv > createTargetEnvFromAttr(TargetEnvAttr targetAttr, Location targetEnvAttrLoc)
Definition TargetEnv.cpp:91
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:58
bool isBackwardsCompatibleWith(TosaSpecificationVersion baseVersion) const
Definition TargetEnv.h:67
llvm::SmallString< 4 > stringifyVersion(TosaSpecificationVersion version)
Definition TargetEnv.cpp:15
SmallVector< Profile, 2 > getCooperativeProfiles(Extension ext)
Definition TargetEnv.cpp:55
TargetEnvAttr getDefaultTargetEnv(MLIRContext *context)
TosaSpecificationVersion getMinVersion(const Profile &profile)
Definition TargetEnv.cpp:19
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.