[Mlir-commits] [mlir] Add a more complete example to mlir-reduce docs (PR #116085)
Jeremy Kun
llvmlistbot at llvm.org
Wed Nov 13 10:05:19 PST 2024
https://github.com/j2kun created https://github.com/llvm/llvm-project/pull/116085
This PR was started because I noticed bugs in the docs:
- The interestingness test checked for an error, but did not redirect stderr to stdout to include it in the pipe.
- The interestingness test pipe ended with grep, but then checked for an exit code of 1 to mark the input as interesting. However, a pipe's overall exit code is the exit code of the rightmost command, and grep's exit code is zero when it detects the query string, and 1 when it does not detect the query string. So the test was backwards.
Then I wanted to test my fixes to be sure I got it right, and I realized that the doc has no properly runnable example. I tried adapting some tests but the use of the `test` dialect gave me some issues, so I felt it would be more straightforward to add a test that only uses builtin dialects. Because I could not find an upstream error to demonstrate, I instead just made the test check for the presence of a particular op, and the example I came up with hits a stack trace in the reduce tool:
```
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: bazel-bin/external/llvm-project/mlir/mlir-reduce /home/j2kun/fhe/heir/query-test.mlir "-reduction-tree=traversal-mode=0 test=query-test.sh"
#0 0x000055f2b0c7f4ad llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /proc/self/cwd/external/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:11
#1 0x000055f2b0c7f99b PrintStackTraceSignalHandler(void*) /proc/self/cwd/external/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
#2 0x000055f2b0c7d056 llvm::sys::RunSignalHandlers() /proc/self/cwd/external/llvm-project/llvm/lib/Support/Signals.cpp:105:5
#3 0x000055f2b0c80095 SignalHandler(int) /proc/self/cwd/external/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
#4 0x00007f16b8d3c520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#5 0x000055f2a66fb5b4 mlir::Operation::getNumOperands() /proc/self/cwd/external/llvm-project/mlir/include/mlir/IR/Operation.h:342:12
#6 0x000055f2b0b43c6a mlir::Operation::clone(mlir::IRMapping&, mlir::Operation::CloneOptions) /proc/self/cwd/external/llvm-project/mlir/lib/IR/Operation.cpp:723:22
#7 0x000055f2afd53ec3 mlir::ReductionNode::initialize(mlir::ModuleOp, mlir::Region&) /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionNode.cpp:42:41
#8 0x000055f2afd53d8b mlir::ReductionNode::ReductionNode(mlir::ReductionNode*, std::vector<std::pair<int, int>, std::allocator<std::pair<int, int>>> const&, llvm::SpecificBumpPtrAllocator<mlir::ReductionNode>&) /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionNode.cpp:34:16
#9 0x000055f2afd54731 mlir::ReductionNode::generateNewVariants()::$_1::operator()(std::vector<std::pair<int, int>, std::allocator<std::pair<int, int>>> const&) const /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionNode.cpp:56:39
#10 0x000055f2afd543d2 mlir::ReductionNode::generateNewVariants() /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionNode.cpp:92:22
#11 0x000055f2afd549fd mlir::ReductionNode::iterator<(mlir::TraversalMode)0>::getNeighbors(mlir::ReductionNode*) /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionNode.cpp:154:16
#12 0x000055f2afd52bed mlir::ReductionNode::BaseIterator<mlir::ReductionNode::iterator<(mlir::TraversalMode)0>>::getNeighbors(mlir::ReductionNode*) /proc/self/cwd/external/llvm-project/mlir/include/mlir/Reducer/ReductionNode.h:135:38
#13 0x000055f2afd4fbc6 mlir::ReductionNode::BaseIterator<mlir::ReductionNode::iterator<(mlir::TraversalMode)0>>::operator++() /proc/self/cwd/external/llvm-project/mlir/include/mlir/Reducer/ReductionNode.h:119:34
#14 0x000055f2afd4e745 llvm::LogicalResult findOptimal<mlir::ReductionNode::iterator<(mlir::TraversalMode)0>>(mlir::ModuleOp, mlir::Region&, mlir::FrozenRewritePatternSet const&, mlir::Tester const&, bool) /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionTreePass.cpp:123:5
#15 0x000055f2afd4e053 llvm::LogicalResult findOptimal<mlir::ReductionNode::iterator<(mlir::TraversalMode)0>>(mlir::ModuleOp, mlir::Region&, mlir::FrozenRewritePatternSet const&, mlir::Tester const&) /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionTreePass.cpp:159:14
#16 0x000055f2afd4dedd (anonymous namespace)::ReductionTreePass::reduceOp(mlir::ModuleOp, mlir::Region&) /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionTreePass.cpp:252:12
#17 0x000055f2afd4d68b (anonymous namespace)::ReductionTreePass::runOnOperation() /proc/self/cwd/external/llvm-project/mlir/lib/Reducer/ReductionTreePass.cpp:238:20
#18 0x000055f2b081b58b mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_1::operator()() const /proc/self/cwd/external/llvm-project/mlir/lib/Pass/Pass.cpp:0:17
#19 0x000055f2b081b525 void llvm::function_ref<void ()>::callback_fn<mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int)::$_1>(long) /proc/self/cwd/external/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:45:5
#20 0x000055f2ae7049d9 llvm::function_ref<void ()>::operator()() const /proc/self/cwd/external/llvm-project/llvm/include/llvm/ADT/STLFunctionalExtras.h:68:5
#21 0x000055f2b081e635 void mlir::MLIRContext::executeAction<mlir::PassExecutionAction, mlir::Pass&>(llvm::function_ref<void ()>, llvm::ArrayRef<mlir::IRUnit>, mlir::Pass&) /proc/self/cwd/external/llvm-project/mlir/include/mlir/IR/MLIRContext.h:281:3
#22 0x000055f2b0815e03 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) /proc/self/cwd/external/llvm-project/mlir/lib/Pass/Pass.cpp:532:17
#23 0x000055f2b08165bf mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) /proc/self/cwd/external/llvm-project/mlir/lib/Pass/Pass.cpp:592:16
#24 0x000055f2b0818998 mlir::PassManager::runPasses(mlir::Operation*, mlir::AnalysisManager) /proc/self/cwd/external/llvm-project/mlir/lib/Pass/Pass.cpp:905:10
#25 0x000055f2b081880e mlir::PassManager::run(mlir::Operation*) /proc/self/cwd/external/llvm-project/mlir/lib/Pass/Pass.cpp:885:60
#26 0x000055f2acdfdadf mlir::mlirReduceMain(int, char**, mlir::MLIRContext&) /proc/self/cwd/external/llvm-project/mlir/lib/Tools/mlir-reduce/MlirReduceMain.cpp:108:17
#27 0x000055f2a65a4464 main /proc/self/cwd/external/llvm-project/mlir/tools/mlir-reduce/mlir-reduce.cpp:40:17
#28 0x00007f16b8d23d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#29 0x00007f16b8d23e40 call_init ./csu/../csu/libc-start.c:128:20
#30 0x00007f16b8d23e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#31 0x000055f2a65a4325 _start (bazel-bin/external/llvm-project/mlir/mlir-reduce+0x52d8325)
[1] 17696 segmentation fault bazel-bin/external/llvm-project/mlir/mlir-reduce
```
@jpienaar do you see anything obvious I'm doing wrong in my example that would cause this stack trace?
>From 4c5b388ffcfb00eb3088474cae7c5a418f30ad59 Mon Sep 17 00:00:00 2001
From: Jeremy Kun <jkun at google.com>
Date: Wed, 13 Nov 2024 10:00:42 -0800
Subject: [PATCH] Add a more complete example to mlir-reduce docs
---
mlir/docs/Tools/mlir-reduce.md | 57 ++++++++++++++++++++++++++++------
1 file changed, 48 insertions(+), 9 deletions(-)
diff --git a/mlir/docs/Tools/mlir-reduce.md b/mlir/docs/Tools/mlir-reduce.md
index b60cdd799ba0c6..e01b57ef0bab45 100644
--- a/mlir/docs/Tools/mlir-reduce.md
+++ b/mlir/docs/Tools/mlir-reduce.md
@@ -26,27 +26,66 @@ to the tree traversal strategy. The different strategies may lead to different
results and different time complexity. You can run as
`-reduction-tree='traversal-mode=0'` to select the mode for example.
+### Example MLIR input
+
+```mlir
+// query-test.mlir
+func.func @func1() {
+ // A func can be pruned if it's not relevant to the error.
+ return
+}
+
+func.func @func2() -> i32 {
+ %0 = arith.constant 1 : i32
+ %1 = arith.constant 2 : i32
+ %2 = arith.constant 2.2 : f32
+ %3 = arith.constant 5.3 : f32
+ %4 = arith.addi %0, %1 : i32
+ %5 = arith.addf %2, %3 : f32
+ %6 = arith.muli %4, %4 : i32
+ %7 = arith.subi %6, %4 : i32
+ %8 = arith.fptosi %5 : f32 to i32
+ %9 = arith.addi %7, %8 : i32
+ return %9 : i32
+}
+```
+
### Write the script for testing interestingness
-As mentioned, you need to provide a command to `mlir-reduce` which identifies
-cases you're interested in. For each intermediate output generated during
-reduction, `mlir-reduce` will run the command over the it, the script should
-returns 1 for interesting case, 0 otherwise. The sample script,
+You need to provide a command to `mlir-reduce` which identifies cases you're
+interested in. For each intermediate output generated during reduction,
+`mlir-reduce` will run the command over the it, the script should returns 1 for
+interesting case, 0 otherwise. For the IR above, a sample script might simply
+look for the presence of the `arith.fptosi` operation. A more realistic script
+would check for the presence of a particular kind of error message in stderr.
```shell
-mlir-opt -convert-vector-to-spirv $1 | grep "failed to materialize"
-if [[ $? -eq 1 ]]; then
+# query-test.sh
+# `2>&1` redirects stderr (where errors and diagnostics are printed) to stdout
+# so it can be piped to grep.
+mlir-opt $1 2>&1 | grep "arith.fptosi"
+
+# grep's exit code is 0 if the queried string is found
+if [[ $? -eq 0 ]]; then
exit 1
else
exit 0
fi
```
-The sample usage will be like, note that the `test` argument is part of the mode
-argument.
+### Running the example
+
+The sample usage will be as follows, noting that the `test` argument is part of
+the mode argument.
```shell
-mlir-reduce $INPUT -reduction-tree='traversal-mode=0 test=$TEST_SCRIPT'
+mlir-reduce query-test.mlir -reduction-tree='traversal-mode=0 test=query-test.sh'
+```
+
+The output:
+
+```
+TODO: the usage above produces a stack trace
```
## Available reduction strategies
More information about the Mlir-commits
mailing list