}
```
+The configuration dumped can be passed to `mlir-opt` by specifying
+`-run-reproducer` flag. This will result in parsing the first line configuration
+of the reproducer and adding those to the command line options.
+
### Local Reproducer Generation
An additional flag may be passed to
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/Regex.h"
#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/StringSaver.h"
#include "llvm/Support/ToolOutputFile.h"
using namespace mlir;
"show-dialects", cl::desc("Print the list of registered dialects"),
cl::init(false));
+ static cl::opt<bool> runRepro(
+ "run-reproducer",
+ cl::desc("Append the command line options of the reproducer"),
+ cl::init(false));
+
InitLLVM y(argc, argv);
// Register any command line options.
return failure();
}
+ // Parse reproducer options.
+ BumpPtrAllocator a;
+ StringSaver saver(a);
+ if (runRepro) {
+ auto pair = file->getBuffer().split('\n');
+ if (!pair.first.consume_front("// configuration:")) {
+ llvm::errs() << "Failed to find repro configuration, expect file to "
+ "begin with '// configuration:'\n";
+ return failure();
+ }
+ // Tokenize & parse the first line.
+ SmallVector<const char *, 4> newArgv;
+ newArgv.push_back(argv[0]);
+ llvm::cl::TokenizeGNUCommandLine(pair.first, saver, newArgv);
+ cl::ParseCommandLineOptions(newArgv.size(), &newArgv[0], helpHeader);
+ }
+
auto output = openOutputFile(outputFilename, &errorMessage);
if (!output) {
llvm::errs() << errorMessage << "\n";
--- /dev/null
+// configuration: -mlir-disable-threading=true -pass-pipeline='func(cse,canonicalize)' -print-ir-before=cse -o /dev/null
+
+// Test of the reproducer run option. The first line has to be the
+// configuration (matching what is produced by reproducer).
+
+// RUN: mlir-opt %s -run-reproducer 2>&1 | FileCheck -check-prefix=BEFORE %s
+
+func @foo() {
+ %0 = constant 0 : i32
+ return
+}
+
+func @bar() {
+ return
+}
+
+// BEFORE: *** IR Dump Before{{.*}}CSE ***
+// BEFORE-NEXT: func @foo()
+// BEFORE: *** IR Dump Before{{.*}}CSE ***
+// BEFORE-NEXT: func @bar()
+// BEFORE-NOT: *** IR Dump Before{{.*}}Canonicalizer ***
+// BEFORE-NOT: *** IR Dump After