@@ -146,7 +146,11 @@ void showPayloads_() {
146
146
// / @param config The configuration defining the context to build.
147
147
// / @return The constructed TargetSystem.
148
148
llvm::Expected<qssc::hal::TargetSystem &>
149
- buildTarget_ (MLIRContext *context, const qssc::config::QSSConfig &config) {
149
+ buildTarget_ (MLIRContext *context, const qssc::config::QSSConfig &config,
150
+ mlir::TimingScope &timing) {
151
+
152
+ mlir::TimingScope const buildTargetTiming = timing.nest (" build-target" );
153
+
150
154
const auto &targetName = config.getTargetName ();
151
155
const auto &targetConfigPath = config.getTargetConfigPath ();
152
156
@@ -193,13 +197,18 @@ llvm::Error generateQEM_(
193
197
const QSSConfig &config,
194
198
qssc::hal::compile::TargetCompilationManager *targetCompilationManager,
195
199
std::unique_ptr<qssc::payload::Payload> payload, mlir::ModuleOp moduleOp,
196
- llvm::raw_ostream *ostream) {
200
+ llvm::raw_ostream *ostream, mlir::TimingScope &timing ) {
197
201
202
+ mlir::TimingScope buildQEMTiming = timing.nest (" build-qem" );
203
+ targetCompilationManager->enableTiming (buildQEMTiming);
198
204
if (auto err = targetCompilationManager->compilePayload (
199
205
moduleOp, *payload,
200
206
/* doCompileMLIR=*/ !config.shouldBypassPayloadTargetCompilation ()))
201
207
return err;
208
+ targetCompilationManager->disableTiming ();
202
209
210
+ mlir::TimingScope const writePayloadTiming =
211
+ buildQEMTiming.nest (" write-payload" );
203
212
if (config.shouldEmitPlaintextPayload ())
204
213
payload->writePlain (*ostream);
205
214
else
@@ -223,7 +232,6 @@ llvm::Error buildPassManager_(mlir::PassManager &pm, bool verifyPasses) {
223
232
return llvm::createStringError (
224
233
llvm::inconvertibleErrorCode (),
225
234
" Unable to apply pass manager command line options" );
226
- mlir::applyDefaultTimingPassManagerCLOptions (pm);
227
235
228
236
// Configure verifier
229
237
pm.enableVerifier (verifyPasses);
@@ -232,9 +240,13 @@ llvm::Error buildPassManager_(mlir::PassManager &pm, bool verifyPasses) {
232
240
}
233
241
234
242
llvm::Error buildPassManager (const QSSConfig &config, mlir::PassManager &pm,
235
- ErrorHandler errorHandler, bool verifyPasses) {
243
+ ErrorHandler errorHandler, bool verifyPasses,
244
+ mlir::TimingScope &timing) {
236
245
if (auto err = buildPassManager_ (pm, verifyPasses))
237
246
return err;
247
+
248
+ pm.enableTiming (timing);
249
+
238
250
// Build the provided pipeline.
239
251
if (failed (config.setupPassPipeline (pm)))
240
252
return llvm::createStringError (llvm::inconvertibleErrorCode (),
@@ -254,20 +266,26 @@ llvm::Error emitMLIR_(
254
266
llvm::raw_ostream *ostream, mlir::MLIRContext &context,
255
267
mlir::ModuleOp moduleOp, const QSSConfig &config,
256
268
qssc::hal::compile::ThreadedCompilationManager &targetCompilationManager,
257
- ErrorHandler errorHandler) {
269
+ ErrorHandler errorHandler, mlir::TimingScope &timing) {
270
+
271
+ mlir::TimingScope emitMlirTiming = timing.nest (" emit-mlir" );
272
+
258
273
if (config.shouldCompileTargetIR ()) {
259
274
// Check if we can run the target compilation scheduler.
260
275
if (config.shouldAddTargetPasses ()) {
276
+ targetCompilationManager.enableTiming (emitMlirTiming);
261
277
if (auto err = targetCompilationManager.compileMLIR (moduleOp))
262
278
return llvm::joinErrors (
263
279
llvm::createStringError (llvm::inconvertibleErrorCode (),
264
280
" Failure while preparing target passes" ),
265
281
std::move (err));
282
+ targetCompilationManager.disableTiming ();
266
283
}
267
284
}
268
285
269
286
// Print the output.
270
287
dumpMLIR_ (ostream, moduleOp);
288
+
271
289
return llvm::Error::success ();
272
290
}
273
291
@@ -280,7 +298,8 @@ llvm::Error emitMLIR_(
280
298
llvm::Error emitQEM_ (
281
299
const QSSConfig &config, llvm::raw_ostream *ostream,
282
300
std::unique_ptr<qssc::payload::Payload> payload, mlir::ModuleOp moduleOp,
283
- qssc::hal::compile::ThreadedCompilationManager &targetCompilationManager) {
301
+ qssc::hal::compile::ThreadedCompilationManager &targetCompilationManager,
302
+ mlir::TimingScope &timing) {
284
303
if (config.shouldIncludeSource ()) {
285
304
if (config.isDirectInput ()) {
286
305
if (config.getInputType () == InputType::QASM)
@@ -308,7 +327,7 @@ llvm::Error emitQEM_(
308
327
}
309
328
310
329
if (auto err = generateQEM_ (config, &targetCompilationManager,
311
- std::move (payload), moduleOp, ostream))
330
+ std::move (payload), moduleOp, ostream, timing ))
312
331
return err;
313
332
314
333
return llvm::Error::success ();
@@ -400,11 +419,13 @@ llvm::Error compile_(int argc, char const **argv, std::string *outputString,
400
419
// Instantiate after parsing command line options.
401
420
MLIRContext context{};
402
421
422
+ mlir::TimingScope buildConfigTiming = timing.nest (" build-config" );
403
423
auto configResult = qssc::config::buildToolConfig ();
404
424
if (auto err = configResult.takeError ())
405
425
return err;
406
426
qssc::config::QSSConfig const config = configResult.get ();
407
427
qssc::config::setContextConfig (&context, config);
428
+ buildConfigTiming.stop ();
408
429
409
430
// Populate the context
410
431
context.appendDialectRegistry (registry);
@@ -432,7 +453,7 @@ llvm::Error compile_(int argc, char const **argv, std::string *outputString,
432
453
}
433
454
434
455
// Build the target for compilation
435
- auto targetResult = buildTarget_ (&context, config);
456
+ auto targetResult = buildTarget_ (&context, config, timing );
436
457
if (auto err = targetResult.takeError ())
437
458
return err;
438
459
auto &target = targetResult.get ();
@@ -508,6 +529,9 @@ llvm::Error compile_(int argc, char const **argv, std::string *outputString,
508
529
mlir::ModuleOp moduleOp;
509
530
510
531
if (config.getInputType () == InputType::QASM) {
532
+
533
+ mlir::TimingScope loadQASM3Timing = timing.nest (" load-qasm3" );
534
+
511
535
if (config.getEmitAction () >= EmitAction::MLIR) {
512
536
moduleOp = mlir::ModuleOp::create (FileLineColLoc::get (
513
537
&context,
@@ -519,7 +543,8 @@ llvm::Error compile_(int argc, char const **argv, std::string *outputString,
519
543
config.getInputSource ().str (), !config.isDirectInput (),
520
544
config.getEmitAction () == EmitAction::AST,
521
545
config.getEmitAction () == EmitAction::ASTPretty,
522
- config.getEmitAction () >= EmitAction::MLIR, moduleOp, diagnosticCb))
546
+ config.getEmitAction () >= EmitAction::MLIR, moduleOp, diagnosticCb,
547
+ loadQASM3Timing))
523
548
return frontendError;
524
549
525
550
if (config.getEmitAction () < EmitAction::MLIR)
@@ -528,6 +553,8 @@ llvm::Error compile_(int argc, char const **argv, std::string *outputString,
528
553
529
554
if (config.getInputType () == InputType::MLIR) {
530
555
556
+ mlir::TimingScope mlirParserTiming = timing.nest (" parse-mlir" );
557
+
531
558
// Tell sourceMgr about this buffer, which is what the parser will pick up.
532
559
auto sourceMgr = std::make_shared<llvm::SourceMgr>();
533
560
sourceMgr->AddNewSourceBuffer (std::move (file), llvm::SMLoc ());
@@ -552,11 +579,10 @@ llvm::Error compile_(int argc, char const **argv, std::string *outputString,
552
579
reproOptions.attachResourceParser (parseConfig);
553
580
554
581
// Parse the input file and reset the context threading state.
555
- mlir::TimingScope parserTiming = timing.nest (" Parser" );
556
582
mlir::OwningOpRef<Operation *> op = mlir::parseSourceFileForTool (
557
583
sourceMgr, parseConfig, !config.shouldUseExplicitModule ());
558
584
559
- parserTiming .stop ();
585
+ mlirParserTiming .stop ();
560
586
561
587
if (!op)
562
588
return llvm::createStringError (llvm::inconvertibleErrorCode (),
@@ -606,25 +632,30 @@ llvm::Error compile_(int argc, char const **argv, std::string *outputString,
606
632
" Unable to apply target compilation options." );
607
633
608
634
// Run additional passes specified on the command line
635
+
636
+ mlir::TimingScope commandLinePassesTiming =
637
+ timing.nest (" command-line-passes" );
609
638
mlir::PassManager pm (&context);
610
- if (auto err = buildPassManager (config, pm, errorHandler, verifyPasses))
639
+ if (auto err = buildPassManager (config, pm, errorHandler, verifyPasses,
640
+ commandLinePassesTiming))
611
641
return err;
612
642
613
643
if (pm.size () && failed (pm.run (moduleOp)))
614
644
return llvm::createStringError (llvm::inconvertibleErrorCode (),
615
645
" Problems running the compiler pipeline!" );
646
+ commandLinePassesTiming.stop ();
616
647
617
648
// Prepare outputs
618
649
if (config.getEmitAction () == EmitAction::MLIR) {
619
650
if (auto err = emitMLIR_ (ostream, context, moduleOp, config,
620
- targetCompilationManager, errorHandler))
651
+ targetCompilationManager, errorHandler, timing ))
621
652
return err;
622
653
}
623
654
624
655
if (config.getEmitAction () == EmitAction::QEM ||
625
656
config.getEmitAction () == EmitAction::QEQEM) {
626
657
if (auto err = emitQEM_ (config, ostream, std::move (payload), moduleOp,
627
- targetCompilationManager))
658
+ targetCompilationManager, timing ))
628
659
return err;
629
660
}
630
661
0 commit comments