diff --git a/mlir/lib/Pass/PassStatistics.cpp b/mlir/lib/Pass/PassStatistics.cpp --- a/mlir/lib/Pass/PassStatistics.cpp +++ b/mlir/lib/Pass/PassStatistics.cpp @@ -226,10 +226,12 @@ MutableArrayRef nestedPms = adaptor->getPassManagers(); // Merge the statistics from the async pass managers into the main nested - // pass managers. + // pass managers. Prepare recursively before merging. for (auto &asyncPM : adaptor->getParallelPassManagers()) { - for (unsigned i = 0, e = asyncPM.size(); i != e; ++i) + for (unsigned i = 0, e = asyncPM.size(); i != e; ++i) { + prepareStatistics(asyncPM[i]); asyncPM[i].mergeStatisticsInto(nestedPms[i]); + } } // Prepare the statistics of each of the nested passes. diff --git a/mlir/test/Pass/pipeline-stats-nested.mlir b/mlir/test/Pass/pipeline-stats-nested.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Pass/pipeline-stats-nested.mlir @@ -0,0 +1,24 @@ +// REQUIRES: asserts +// Check that statistics in nested pipelines are not ignored and that this works with and without threading. +// RUN: mlir-opt %s -verify-each=true -pass-pipeline='builtin.module(builtin.module(func.func(test-stats-pass,test-stats-pass)))' -mlir-pass-statistics -mlir-pass-statistics-display=list -mlir-disable-threading 2>&1 | FileCheck -check-prefix=LIST %s +// RUN: mlir-opt %s -verify-each=true -pass-pipeline='builtin.module(builtin.module(func.func(test-stats-pass,test-stats-pass)))' -mlir-pass-statistics -mlir-pass-statistics-display=list 2>&1 | FileCheck -check-prefix=LIST %s + +// RUN: mlir-opt %s -verify-each=true -pass-pipeline='builtin.module(builtin.module(func.func(test-stats-pass,test-stats-pass)))' -mlir-pass-statistics -mlir-pass-statistics-display=pipeline -mlir-disable-threading 2>&1 | FileCheck -check-prefix=PIPELINE %s +// RUN: mlir-opt %s -verify-each=true -pass-pipeline='builtin.module(builtin.module(func.func(test-stats-pass,test-stats-pass)))' -mlir-pass-statistics -mlir-pass-statistics-display=pipeline 2>&1 | FileCheck -check-prefix=PIPELINE %s + +// Check for the correct statistic values. +// Each test-stats-pass will count two ops: the func.func and the func.return . +// LIST: (S) 4 num-ops +// LIST-NEXT: (S) 4 num-ops2 +// PIPELINE: (S) 2 num-ops +// PIPELINE-NEXT: (S) 2 num-ops2 +// PIPELINE: (S) 2 num-ops +// PIPELINE-NEXT: (S) 2 num-ops2 + +module { + module { + func.func @foo() { + return + } + } +}