MLIR
24.0.0git
lib
CAPI
IR
Remarks.cpp
Go to the documentation of this file.
1
//===- Remarks.cpp - C Interface for the MLIR Remark Engine ---------------===//
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
#include "
mlir-c/Remarks.h
"
10
#include "
mlir/CAPI/IR.h
"
11
#include "
mlir/CAPI/Remarks.h
"
12
#include "
mlir/CAPI/Support.h
"
13
#include "
mlir/CAPI/Utils.h
"
14
#include "
mlir/IR/MLIRContext.h
"
15
#include "
mlir/IR/Remarks.h
"
16
#include "
mlir/Remark/RemarkStreamer.h
"
17
#include "llvm/Remarks/RemarkFormat.h"
18
#include "llvm/Support/ErrorHandling.h"
19
20
#include <cassert>
21
#include <memory>
22
23
using namespace
mlir
;
24
using
mlir::remark::detail::Remark
;
25
26
//===----------------------------------------------------------------------===//
27
// Helpers
28
//===----------------------------------------------------------------------===//
29
30
namespace
{
31
/// A streamer forwarding every reported remark to a C callback.
32
class
CallbackRemarkStreamer :
public
remark::detail::MLIRRemarkStreamerBase
{
33
public
:
34
CallbackRemarkStreamer(
MlirRemarkCallback
callback,
void
*userData,
35
void
(*deleteUserData)(
void
*))
36
: callback(callback), userData(userData), deleteUserData(deleteUserData) {
37
}
38
39
~CallbackRemarkStreamer()
override
{
40
if
(deleteUserData)
41
deleteUserData(userData);
42
}
43
44
void
streamOptimizationRemark(
const
Remark
&remark)
override
{
45
callback(
wrap
(&remark), userData);
46
}
47
48
private
:
49
MlirRemarkCallback
callback;
50
void
*userData;
51
void (*deleteUserData)(
void
*);
52
};
53
}
// namespace
54
55
/// Every filter reaches the engine as a (possibly empty) string, as with
56
/// mlir-opt's options: a kind is reported when its own filter or `all` matches.
57
static
remark::RemarkCategories
unwrap
(
MlirRemarkCategories
categories) {
58
return
remark::RemarkCategories
{
59
unwrap
(categories.
all
).str(),
unwrap
(categories.
passed
).str(),
60
unwrap
(categories.
missed
).str(),
unwrap
(categories.
analysis
).str(),
61
unwrap
(categories.
failed
).str()};
62
}
63
64
static
std::unique_ptr<remark::detail::RemarkEmittingPolicyBase>
65
createPolicy
(
MlirRemarkPolicy
policy) {
66
switch
(policy) {
67
case
MlirRemarkPolicyAll
:
68
return
std::make_unique<remark::RemarkEmittingPolicyAll>();
69
case
MlirRemarkPolicyFinal
:
70
return
std::make_unique<remark::RemarkEmittingPolicyFinal>();
71
}
72
llvm_unreachable(
"unknown remark policy"
);
73
}
74
75
static
llvm::remarks::Format
unwrap
(
MlirRemarkFileFormat
format) {
76
switch
(format) {
77
case
MlirRemarkFileFormatYAML
:
78
return
llvm::remarks::Format::YAML;
79
case
MlirRemarkFileFormatBitstream
:
80
return
llvm::remarks::Format::Bitstream;
81
}
82
llvm_unreachable(
"unknown remark file format"
);
83
}
84
85
static
MlirRemarkKind
wrap
(
remark::RemarkKind
kind) {
86
switch
(kind) {
87
case
remark::RemarkKind::RemarkUnknown
:
88
return
MlirRemarkKindUnknown
;
89
case
remark::RemarkKind::RemarkPassed
:
90
return
MlirRemarkKindPassed
;
91
case
remark::RemarkKind::RemarkMissed
:
92
return
MlirRemarkKindMissed
;
93
case
remark::RemarkKind::RemarkFailure
:
94
return
MlirRemarkKindFailure
;
95
case
remark::RemarkKind::RemarkAnalysis
:
96
return
MlirRemarkKindAnalysis
;
97
}
98
llvm_unreachable(
"unknown remark kind"
);
99
}
100
101
//===----------------------------------------------------------------------===//
102
// Enabling and finalizing
103
//===----------------------------------------------------------------------===//
104
105
MlirLogicalResult
mlirContextEnableOptimizationRemarks
(
106
MlirContext context,
MlirRemarkCategories
categories,
107
MlirRemarkPolicy
policy,
bool
printAsEmitRemarks) {
108
MLIRContext
*ctx =
unwrap
(context);
109
if
(ctx->
getRemarkEngine
())
110
return
mlirLogicalResultFailure
();
111
return
wrap
(
remark::enableOptimizationRemarks
(
112
*ctx,
/*streamer=*/
nullptr
,
createPolicy
(policy),
unwrap
(categories),
113
printAsEmitRemarks));
114
}
115
116
MlirLogicalResult
mlirContextEnableOptimizationRemarksToFile
(
117
MlirContext context,
MlirRemarkCategories
categories,
118
MlirRemarkPolicy
policy,
MlirRemarkFileFormat
format,
MlirStringRef
path,
119
bool
printAsEmitRemarks) {
120
MLIRContext
*ctx =
unwrap
(context);
121
if
(ctx->
getRemarkEngine
())
122
return
mlirLogicalResultFailure
();
123
return
wrap
(
remark::enableOptimizationRemarksWithLLVMStreamer
(
124
*ctx,
unwrap
(path),
unwrap
(format),
createPolicy
(policy),
125
unwrap
(categories), printAsEmitRemarks));
126
}
127
128
MlirLogicalResult
mlirContextEnableOptimizationRemarksWithCallback
(
129
MlirContext context,
MlirRemarkCategories
categories,
130
MlirRemarkPolicy
policy,
MlirRemarkCallback
callback,
void
*userData,
131
void
(*deleteUserData)(
void
*),
bool
printAsEmitRemarks) {
132
assert(callback &&
"unexpected null remark callback"
);
133
MLIRContext
*ctx =
unwrap
(context);
134
if
(ctx->
getRemarkEngine
()) {
135
// The caller handed over `userData`; release it as on success.
136
if
(deleteUserData)
137
deleteUserData(userData);
138
return
mlirLogicalResultFailure
();
139
}
140
return
wrap
(
remark::enableOptimizationRemarks
(
141
*ctx,
142
std::make_unique<CallbackRemarkStreamer>(callback, userData,
143
deleteUserData),
144
createPolicy
(policy),
unwrap
(categories), printAsEmitRemarks));
145
}
146
147
void
mlirContextFinalizeOptimizationRemarks
(MlirContext context) {
148
// The engine destructor reports the postponed remarks, then destroys the
149
// streamer.
150
unwrap
(context)->setRemarkEngine(
nullptr
);
151
}
152
153
bool
mlirContextHasRemarkEngine
(MlirContext context) {
154
return
unwrap
(context)->getRemarkEngine() !=
nullptr
;
155
}
156
157
//===----------------------------------------------------------------------===//
158
// Remark accessors
159
//===----------------------------------------------------------------------===//
160
161
MlirRemarkKind
mlirRemarkGetKind
(
MlirRemark
remark
) {
162
return
wrap
(
unwrap
(
remark
)->
getRemarkKind
());
163
}
164
165
MlirStringRef
mlirRemarkGetRemarkName
(
MlirRemark
remark
) {
166
return
wrap
(
unwrap
(
remark
)->getRemarkName());
167
}
168
169
MlirStringRef
mlirRemarkGetCategoryName
(
MlirRemark
remark
) {
170
return
wrap
(
unwrap
(
remark
)->getCategoryName());
171
}
172
173
MlirStringRef
mlirRemarkGetFullCategoryName
(
MlirRemark
remark
) {
174
return
wrap
(
unwrap
(
remark
)->getCombinedCategoryName());
175
}
176
177
MlirStringRef
mlirRemarkGetFunctionName
(
MlirRemark
remark
) {
178
return
wrap
(
unwrap
(
remark
)->getFunction());
179
}
180
181
MlirLocation
mlirRemarkGetLocation
(
MlirRemark
remark
) {
182
return
wrap
(
unwrap
(
remark
)->getLocation());
183
}
184
185
uint64_t
mlirRemarkGetId
(
MlirRemark
remark
) {
186
return
unwrap
(
remark
)->getId().getValue();
187
}
188
189
intptr_t
mlirRemarkGetNumArgs
(
MlirRemark
remark
) {
190
return
static_cast<
intptr_t
>
(
unwrap
(
remark
)->getArgs().size());
191
}
192
193
MlirStringRef
mlirRemarkGetArgKey
(
MlirRemark
remark
,
intptr_t
pos) {
194
ArrayRef<Remark::Arg>
args =
unwrap
(
remark
)->getArgs();
195
assert(pos >= 0 &&
static_cast<
size_t
>
(pos) < args.size() &&
196
"remark argument index out of range"
);
197
return
wrap
(llvm::StringRef(args[pos].key));
198
}
199
200
MlirStringRef
mlirRemarkGetArgValue
(
MlirRemark
remark
,
intptr_t
pos) {
201
ArrayRef<Remark::Arg>
args =
unwrap
(
remark
)->getArgs();
202
assert(pos >= 0 &&
static_cast<
size_t
>
(pos) < args.size() &&
203
"remark argument index out of range"
);
204
return
wrap
(llvm::StringRef(args[pos].val));
205
}
206
207
void
mlirRemarkPrint
(
MlirRemark
remark
,
MlirStringCallback
callback,
208
void
*userData) {
209
detail::CallbackOstream
stream(callback, userData);
210
unwrap
(
remark
)->print(stream);
211
}
212
213
//===----------------------------------------------------------------------===//
214
// Emission
215
//===----------------------------------------------------------------------===//
216
217
bool
mlirEmitOptimizationRemark
(
218
MlirLocation location,
MlirRemarkKind
kind,
MlirStringRef
remarkName,
219
MlirStringRef
categoryName,
MlirStringRef
subCategoryName,
220
MlirStringRef
functionName,
MlirStringRef
message,
intptr_t
numArgs,
221
const
MlirStringRef
*argKeys,
const
MlirStringRef
*argValues) {
222
assert((numArgs == 0 || (argKeys && argValues)) &&
223
"remark arguments require both keys and values"
);
224
Location
loc =
unwrap
(location);
225
remark::RemarkOpts
opts =
remark::RemarkOpts::name
(
unwrap
(remarkName))
226
.
category
(
unwrap
(categoryName))
227
.
subCategory
(
unwrap
(subCategoryName))
228
.
function
(
unwrap
(functionName));
229
remark::detail::InFlightRemark
inFlight;
230
switch
(kind) {
231
case
MlirRemarkKindUnknown
:
232
return
false
;
233
case
MlirRemarkKindPassed
:
234
inFlight =
remark::passed
(loc, opts);
235
break
;
236
case
MlirRemarkKindMissed
:
237
inFlight =
remark::missed
(loc, opts);
238
break
;
239
case
MlirRemarkKindFailure
:
240
inFlight =
remark::failed
(loc, opts);
241
break
;
242
case
MlirRemarkKindAnalysis
:
243
inFlight =
remark::analysis
(loc, opts);
244
break
;
245
}
246
if
(!inFlight)
247
return
false
;
248
if
(message.
length
!= 0)
249
inFlight <<
unwrap
(message);
250
for
(
intptr_t
i = 0; i < numArgs; ++i)
251
inFlight <<
Remark::Arg
(
unwrap
(argKeys[i]),
unwrap
(argValues[i]));
252
// The remark is reported when `inFlight` goes out of scope.
253
return
true
;
254
}
wrap
static MlirRemarkKind wrap(remark::RemarkKind kind)
Definition
Remarks.cpp:85
mlirRemarkGetNumArgs
intptr_t mlirRemarkGetNumArgs(MlirRemark remark)
Returns the number of key/value arguments attached to the remark.
Definition
Remarks.cpp:189
mlirRemarkGetRemarkName
MlirStringRef mlirRemarkGetRemarkName(MlirRemark remark)
Returns the name identifying the remark.
Definition
Remarks.cpp:165
mlirContextFinalizeOptimizationRemarks
void mlirContextFinalizeOptimizationRemarks(MlirContext context)
Finalizes and removes the remark engine of the context: postponed remarks are reported,...
Definition
Remarks.cpp:147
mlirContextEnableOptimizationRemarks
MlirLogicalResult mlirContextEnableOptimizationRemarks(MlirContext context, MlirRemarkCategories categories, MlirRemarkPolicy policy, bool printAsEmitRemarks)
Enables the remark engine on the context without a streamer; when printAsEmitRemarks is set,...
Definition
Remarks.cpp:105
mlirRemarkGetFullCategoryName
MlirStringRef mlirRemarkGetFullCategoryName(MlirRemark remark)
Returns the combined category:subcategory name of the remark.
Definition
Remarks.cpp:173
mlirRemarkPrint
void mlirRemarkPrint(MlirRemark remark, MlirStringCallback callback, void *userData)
Prints the remark in its textual form, [Kind] name | Category:... | / Function=......
Definition
Remarks.cpp:207
mlirRemarkGetId
uint64_t mlirRemarkGetId(MlirRemark remark)
Returns the unique id of the remark within its engine (0 when unset).
Definition
Remarks.cpp:185
mlirContextHasRemarkEngine
bool mlirContextHasRemarkEngine(MlirContext context)
Returns whether the context has a remark engine enabled.
Definition
Remarks.cpp:153
mlirRemarkGetCategoryName
MlirStringRef mlirRemarkGetCategoryName(MlirRemark remark)
Returns the category of the remark (the subject of the filters).
Definition
Remarks.cpp:169
mlirRemarkGetArgValue
MlirStringRef mlirRemarkGetArgValue(MlirRemark remark, intptr_t pos)
Returns the value of the pos-th argument of the remark.
Definition
Remarks.cpp:200
mlirRemarkGetFunctionName
MlirStringRef mlirRemarkGetFunctionName(MlirRemark remark)
Returns the name of the function the remark refers to.
Definition
Remarks.cpp:177
createPolicy
static std::unique_ptr< remark::detail::RemarkEmittingPolicyBase > createPolicy(MlirRemarkPolicy policy)
Definition
Remarks.cpp:65
mlirRemarkGetKind
MlirRemarkKind mlirRemarkGetKind(MlirRemark remark)
Returns the kind of the remark.
Definition
Remarks.cpp:161
mlirContextEnableOptimizationRemarksToFile
MlirLogicalResult mlirContextEnableOptimizationRemarksToFile(MlirContext context, MlirRemarkCategories categories, MlirRemarkPolicy policy, MlirRemarkFileFormat format, MlirStringRef path, bool printAsEmitRemarks)
Enables the remark engine on the context, streaming the reported remarks to the file at path in forma...
Definition
Remarks.cpp:116
mlirContextEnableOptimizationRemarksWithCallback
MlirLogicalResult mlirContextEnableOptimizationRemarksWithCallback(MlirContext context, MlirRemarkCategories categories, MlirRemarkPolicy policy, MlirRemarkCallback callback, void *userData, void(*deleteUserData)(void *), bool printAsEmitRemarks)
Enables the remark engine on the context, delivering every reported remark to callback.
Definition
Remarks.cpp:128
mlirRemarkGetArgKey
MlirStringRef mlirRemarkGetArgKey(MlirRemark remark, intptr_t pos)
Returns the key of the pos-th argument of the remark.
Definition
Remarks.cpp:193
mlirRemarkGetLocation
MlirLocation mlirRemarkGetLocation(MlirRemark remark)
Returns the location of the remark.
Definition
Remarks.cpp:181
mlirEmitOptimizationRemark
bool mlirEmitOptimizationRemark(MlirLocation location, MlirRemarkKind kind, MlirStringRef remarkName, MlirStringRef categoryName, MlirStringRef subCategoryName, MlirStringRef functionName, MlirStringRef message, intptr_t numArgs, const MlirStringRef *argKeys, const MlirStringRef *argValues)
Emits a remark of kind at location through the remark engine of the location's context.
Definition
Remarks.cpp:217
unwrap
static remark::RemarkCategories unwrap(MlirRemarkCategories categories)
Every filter reaches the engine as a (possibly empty) string, as with mlir-opt's options: a kind is r...
Definition
Remarks.cpp:57
getRemarkKind
static remark::RemarkKind getRemarkKind(llvm::DiagnosticKind kind)
Definition
LLVMRemarkImport.cpp:87
MLIRContext.h
RemarkStreamer.h
intptr_t
llvm::ArrayRef
Definition
LLVM.h:40
mlir::Location
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
Definition
Location.h:76
mlir::MLIRContext
MLIRContext is the top-level object for a collection of MLIR operations.
Definition
MLIRContext.h:64
mlir::MLIRContext::getRemarkEngine
remark::detail::RemarkEngine * getRemarkEngine()
Returns the remark engine for this context, or nullptr if none has been set.
Definition
MLIRContext.cpp:417
mlir::detail::CallbackOstream
A simple raw ostream subclass that forwards write_impl calls to the user-supplied callback together w...
Definition
Utils.h:30
mlir::remark::detail::InFlightRemark
A wrapper for linking remarks by query - searches the engine's registry at stream time and links to a...
Definition
Remarks.h:402
mlir::remark::detail::MLIRRemarkStreamerBase
Base class for MLIR remark streamers that is used to stream optimization remarks to the underlying re...
Definition
Remarks.h:452
mlir::remark::detail::Remark
Definition
Remarks.h:148
Utils.h
Remarks.h
MlirRemarkFileFormat
MlirRemarkFileFormat
The serialization format of a remark output file.
Definition
Remarks.h:62
MlirRemarkFileFormatBitstream
@ MlirRemarkFileFormatBitstream
Definition
Remarks.h:64
MlirRemarkFileFormatYAML
@ MlirRemarkFileFormatYAML
Definition
Remarks.h:63
MlirRemarkPolicy
MlirRemarkPolicy
The emitting policy of the remark engine.
Definition
Remarks.h:52
MlirRemarkPolicyFinal
@ MlirRemarkPolicyFinal
Postpone remarks and report the final set when the engine is finalized, grouping related remarks unde...
Definition
Remarks.h:57
MlirRemarkPolicyAll
@ MlirRemarkPolicyAll
Report every remark as it is emitted.
Definition
Remarks.h:54
MlirRemarkCallback
void(* MlirRemarkCallback)(MlirRemark remark, void *userData)
Callback receiving every remark the engine reports.
Definition
Remarks.h:82
MlirRemarkKind
MlirRemarkKind
The outcome a remark describes (see mlir::remark::RemarkKind).
Definition
Remarks.h:38
MlirRemarkKindFailure
@ MlirRemarkKindFailure
The optimization was attempted but failed.
Definition
Remarks.h:45
MlirRemarkKindAnalysis
@ MlirRemarkKindAnalysis
Informational context without a pass/fail outcome.
Definition
Remarks.h:47
MlirRemarkKindMissed
@ MlirRemarkKindMissed
A profitable optimization opportunity was found but not applied.
Definition
Remarks.h:43
MlirRemarkKindUnknown
@ MlirRemarkKindUnknown
Definition
Remarks.h:39
MlirRemarkKindPassed
@ MlirRemarkKindPassed
An optimization was applied.
Definition
Remarks.h:41
mlirLogicalResultFailure
static MlirLogicalResult mlirLogicalResultFailure(void)
Creates a logical result representing a failure.
Definition
Support.h:143
MlirStringCallback
void(* MlirStringCallback)(MlirStringRef, void *)
A callback for returning string references.
Definition
Support.h:110
IR.h
Remarks.h
Support.h
Remarks.h
mlir::remark
Definition
MLIRContext.h:38
mlir::remark::failed
detail::InFlightRemark failed(Location loc, RemarkOpts opts)
Report an optimization remark that failed.
Definition
Remarks.h:734
mlir::remark::missed
detail::InFlightRemark missed(Location loc, RemarkOpts opts)
Report an optimization remark that was missed.
Definition
Remarks.h:728
mlir::remark::analysis
detail::InFlightRemark analysis(Location loc, RemarkOpts opts)
Report an optimization analysis remark.
Definition
Remarks.h:740
mlir::remark::enableOptimizationRemarks
LogicalResult enableOptimizationRemarks(MLIRContext &ctx, std::unique_ptr< remark::detail::MLIRRemarkStreamerBase > streamer, std::unique_ptr< remark::detail::RemarkEmittingPolicyBase > remarkEmittingPolicy, const remark::RemarkCategories &cats, bool printAsEmitRemarks=false)
Setup remarks for the context.
mlir::remark::passed
detail::InFlightRemark passed(Location loc, RemarkOpts opts)
Report an optimization remark that was passed.
Definition
Remarks.h:723
mlir::remark::enableOptimizationRemarksWithLLVMStreamer
LogicalResult enableOptimizationRemarksWithLLVMStreamer(MLIRContext &ctx, StringRef filePath, llvm::remarks::Format fmt, std::unique_ptr< detail::RemarkEmittingPolicyBase > remarkEmittingPolicy, const RemarkCategories &cat, bool printAsEmitRemarks=false)
Enable optimization remarks to a file with the given path and format.
Definition
RemarkStreamer.cpp:58
mlir::remark::RemarkKind
RemarkKind
Categories describe the outcome of an transformation, not the mechanics of emitting/serializing remar...
Definition
Remarks.h:70
mlir::remark::RemarkKind::RemarkPassed
@ RemarkPassed
An optimization was applied.
Definition
Remarks.h:74
mlir::remark::RemarkKind::RemarkAnalysis
@ RemarkAnalysis
Informational context (e.g., analysis numbers) without a pass/fail outcome.
Definition
Remarks.h:85
mlir::remark::RemarkKind::RemarkUnknown
@ RemarkUnknown
Definition
Remarks.h:71
mlir::remark::RemarkKind::RemarkMissed
@ RemarkMissed
A profitable optimization opportunity was found but not applied.
Definition
Remarks.h:77
mlir::remark::RemarkKind::RemarkFailure
@ RemarkFailure
The compiler attempted the optimization but failed (e.g., legality checks, or better opportunites).
Definition
Remarks.h:81
mlir
Include the generated interface declarations.
Definition
ABIRewriteContext.h:32
mlir::DiagnosticSeverity::Remark
@ Remark
Definition
Diagnostics.h:45
MlirLogicalResult
A logical result value, essentially a boolean with named states.
Definition
Support.h:121
MlirRemarkCategories
Regular expressions (llvm::Regex syntax, anchored by the engine) selecting the remark categories to r...
Definition
Remarks.h:72
MlirRemarkCategories::missed
MlirStringRef missed
Definition
Remarks.h:75
MlirRemarkCategories::all
MlirStringRef all
Definition
Remarks.h:73
MlirRemarkCategories::analysis
MlirStringRef analysis
Definition
Remarks.h:76
MlirRemarkCategories::failed
MlirStringRef failed
Definition
Remarks.h:77
MlirRemarkCategories::passed
MlirStringRef passed
Definition
Remarks.h:74
MlirRemark
An opaque reference to a remark.
Definition
Remarks.h:32
MlirStringRef
A pointer to a sized fragment of a string, not necessarily null-terminated.
Definition
Support.h:78
MlirStringRef::length
size_t length
Length of the fragment.
Definition
Support.h:80
Remark::Arg
Definition
Remarks.h:169
mlir::remark::RemarkCategories
Define an the set of categories to accept.
Definition
Remarks.h:64
mlir::remark::RemarkOpts
Options to create a Remark.
Definition
Remarks.h:95
mlir::remark::RemarkOpts::function
RemarkOpts function(StringRef v) const
Return a copy with the function name set.
Definition
Remarks.h:124
mlir::remark::RemarkOpts::subCategory
RemarkOpts subCategory(StringRef v) const
Return a copy with the subcategory set.
Definition
Remarks.h:118
mlir::remark::RemarkOpts::category
RemarkOpts category(StringRef v) const
Return a copy with the category set.
Definition
Remarks.h:112
mlir::remark::RemarkOpts::name
static RemarkOpts name(StringRef n)
Definition
Remarks.h:105
Generated on
for MLIR by
1.14.0