@@ -27,7 +27,7 @@ namespace mlir {
2727// / Defines different remark kinds that can be used to categorize remarks.
2828enum class RemarkKind {
2929 OptimizationRemarkUnknown = 0 ,
30- OptimizationRemarkPass ,
30+ OptimizationRemarkPassed ,
3131 OptimizationRemarkMissed,
3232 OptimizationRemarkFailure,
3333 OptimizationRemarkAnalysis,
@@ -143,7 +143,7 @@ class RemarkBase : public llvm::DiagnosticInfo {
143143 switch (remarkKind) {
144144 case RemarkKind::OptimizationRemarkUnknown:
145145 return llvm::DiagnosticKind::DK_Generic;
146- case RemarkKind::OptimizationRemarkPass :
146+ case RemarkKind::OptimizationRemarkPassed :
147147 return llvm::DiagnosticKind::DK_OptimizationRemark;
148148 case RemarkKind::OptimizationRemarkMissed:
149149 return llvm::DiagnosticKind::DK_OptimizationRemarkMissed;
@@ -156,51 +156,19 @@ class RemarkBase : public llvm::DiagnosticInfo {
156156 }
157157};
158158
159- // clang-format off
160- template <class RemarkT >
161- decltype (auto ) operator<<(
162- RemarkT &&r,
163- std::enable_if_t <std::is_base_of_v<RemarkBase,
164- std::remove_reference_t <RemarkT>>,
165- StringRef>
166- s) {
159+ inline RemarkBase &operator <<(RemarkBase &r, StringRef s) {
167160 r.insert (s);
168- return std::forward<RemarkT>(r);
169- }
170-
171- template <class RemarkT >
172- decltype (auto ) operator<<(
173- RemarkT &&r,
174- std::enable_if_t <std::is_base_of_v<RemarkBase,
175- std::remove_reference_t <RemarkT>>,
176- RemarkBase::RemarkKeyValue>
177- a) {
178- r.insert (std::move (a));
179- return std::forward<RemarkT>(r);
161+ return r;
180162}
181-
182- template <class RemarkT >
183- decltype (auto ) operator<<(
184- RemarkT &&r,
185- std::enable_if_t <std::is_base_of_v<RemarkBase,
186- std::remove_reference_t <RemarkT>>,
187- RemarkBase::SetIsVerbose>
188- v) {
189- r.insert (v);
190- return std::forward<RemarkT>(r);
163+ inline RemarkBase &&operator <<(RemarkBase &&r, StringRef s) {
164+ r.insert (s);
165+ return std::move (r);
191166}
192-
193- template <class RemarkT >
194- decltype (auto ) operator<<(
195- RemarkT &&r,
196- std::enable_if_t <std::is_base_of_v<RemarkBase,
197- std::remove_reference_t <RemarkT>>,
198- RemarkBase::SetExtraArgs>
199- ea) {
200- r.insert (ea);
201- return std::forward<RemarkT>(r);
167+ inline RemarkBase &operator <<(RemarkBase &r,
168+ const RemarkBase::RemarkKeyValue &kv) {
169+ r.insert (kv);
170+ return r;
202171}
203- // clang-format on
204172
205173// ===----------------------------------------------------------------------===//
206174// Shorthand aliases for different kinds of remarks.
@@ -209,16 +177,17 @@ decltype(auto) operator<<(
209177template <RemarkKind K, DiagnosticSeverity S>
210178class OptRemarkBase final : public RemarkBase {
211179public:
212- explicit OptRemarkBase (Location loc, StringRef passName, StringRef remarkName)
213- : RemarkBase(K, S, passName.data(), remarkName, loc) {}
180+ explicit OptRemarkBase (Location loc, StringRef passName,
181+ StringRef categoryName)
182+ : RemarkBase(K, S, passName.data(), categoryName, loc) {}
214183
215184 bool isEnabled () const override { return true ; }
216185};
217186
218187using OptRemarkAnalysis = OptRemarkBase<RemarkKind::OptimizationRemarkAnalysis,
219188 DiagnosticSeverity::Remark>;
220189
221- using OptRemarkPass = OptRemarkBase<RemarkKind::OptimizationRemarkPass ,
190+ using OptRemarkPass = OptRemarkBase<RemarkKind::OptimizationRemarkPassed ,
222191 DiagnosticSeverity::Remark>;
223192
224193using OptRemarkMissed = OptRemarkBase<RemarkKind::OptimizationRemarkMissed,
@@ -241,8 +210,8 @@ class RemarkEngine;
241210class InFlightRemark {
242211public:
243212 explicit InFlightRemark (RemarkBase *diag) : remark(diag) {}
244- InFlightRemark (RemarkEngine &eng, RemarkBase * diag)
245- : owner(&eng), remark(diag) {}
213+ InFlightRemark (RemarkEngine &eng, std::unique_ptr< RemarkBase> diag)
214+ : owner(&eng), remark(std::move( diag) ) {}
246215
247216 InFlightRemark () = default ; // empty ctor
248217
@@ -287,7 +256,8 @@ class MLIRRemarkStreamer {
287256
288257class RemarkEngine {
289258private:
290- // / The category for missed optimization remarks.
259+ // / Regex that filters missed optimization remarks: only matching one are
260+ // / reported.
291261 std::optional<llvm::Regex> missFilter;
292262 // / The category for passed optimization remarks.
293263 std::optional<llvm::Regex> passFilter;
@@ -299,16 +269,17 @@ class RemarkEngine {
299269 std::unique_ptr<llvm::ToolOutputFile> remarksFile;
300270 // / The MLIR remark streamer that will be used to emit the remarks.
301271 std::unique_ptr<MLIRRemarkStreamer> remarkStreamer;
272+ // / The LLVM remark streamer that will be used to emit the remarks.
302273 std::unique_ptr<llvm::remarks::RemarkStreamer> llvmRemarkStreamer;
303274 // / When is enabled, engine also prints remarks as mlir::emitRemarks.
304- bool printAsEmitRemarks;
275+ bool printAsEmitRemarks = false ;
276+
305277 // / The main MLIR remark streamer that will be used to emit the remarks.
306278 MLIRRemarkStreamer *getLLVMRemarkStreamer () { return remarkStreamer.get (); }
307279 const MLIRRemarkStreamer *getLLVMRemarkStreamer () const {
308280 return remarkStreamer.get ();
309281 }
310- void
311- setLLVMRemarkStreamer (std::unique_ptr<MLIRRemarkStreamer> remarkStreamer) {
282+ void setRemarkStreamer (std::unique_ptr<MLIRRemarkStreamer> remarkStreamer) {
312283 this ->remarkStreamer = std::move (remarkStreamer);
313284 }
314285
@@ -361,8 +332,12 @@ class RemarkEngine {
361332 bool (RemarkEngine::*isEnabled)(StringRef) const );
362333
363334public:
335+ // / Default constructor is deleted, use the other constructor.
364336 RemarkEngine () = delete;
365- // / Constructs Remark engine with optional category names
337+
338+ // / Constructs Remark engine with optional category names. If a category
339+ // / name is not provided, it is not enabled. The category names are used to
340+ // / filter the remarks that are emitted.
366341 RemarkEngine (bool printAsEmitRemarks,
367342 std::optional<std::string> categoryPassName = std::nullopt ,
368343 std::optional<std::string> categoryMissName = std::nullopt ,
@@ -374,7 +349,8 @@ class RemarkEngine {
374349 ~RemarkEngine ();
375350
376351 // / Setup the remark engine with the given output path and format.
377- llvm::Error initialize (StringRef outputPath, StringRef outputFormat);
352+ LogicalResult initialize (StringRef outputPath, llvm::remarks::Format fmt,
353+ std::string *errMsg);
378354
379355 // / Report a diagnostic remark.
380356 void report (const RemarkBase &&diag);
@@ -406,14 +382,13 @@ using Suggestion = RemarkBase::RemarkKeyValue;
406382inline Suggestion suggest (StringRef txt) { return {" Suggestion" , txt}; }
407383
408384template <typename Fn, typename ... Args>
409- [[nodiscard]] inline InFlightRemark withEngine (Fn fn, Location loc,
410- Args &&...args) {
385+ inline InFlightRemark withEngine (Fn fn, Location loc, Args &&...args) {
411386 MLIRContext *ctx = loc->getContext ();
412387
413- auto & enginePtr = ctx->getRemarkEngine ();
388+ RemarkEngine * enginePtr = ctx->getRemarkEngine ();
414389
415- if (RemarkEngine *eng = enginePtr. get () )
416- return (eng ->*fn)(loc, std::forward<Args>(args)...);
390+ if (enginePtr)
391+ return (enginePtr ->*fn)(loc, std::forward<Args>(args)...);
417392
418393 return {};
419394}
0 commit comments