Add ir_to_markdown.py utility script. (#6467)

Progress on https://github.com/google/iree/issues/5958, and could be generally useful.

Sample output: https://gist.github.com/ScottTodd/a9de0470eb4cead7a84712c18bff9426.

Note: I get 58-73 MB from compiling `bert_encoder_unrolled_fake_weights.mlir`, which fails to upload to a gist :P
diff --git a/scripts/ir_to_markdown.py b/scripts/ir_to_markdown.py
new file mode 100644
index 0000000..952797c
--- /dev/null
+++ b/scripts/ir_to_markdown.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python3
+
+# Copyright 2021 The IREE Authors
+#
+# Licensed under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+"""Converts a dump of IR text to a markdown file with formatting.
+
+Example usage:
+  # Get a dump of IR from a compiler tool:
+  $ iree-opt \
+    -iree-transformation-pipeline \
+    -iree-hal-target-backends=vmvx \
+    -mlir-disable-threading \
+    -print-ir-after-all \
+    -print-ir-after-change \
+    -mlir-elide-elementsattrs-if-larger=8 \
+    $PWD/iree/samples/models/simple_abs.mlir \
+    2> /tmp/simple_abs_vmvx_pipeline.mlir
+    > /dev/null
+
+  # Convert the IR dump to markdown:
+  $ python3 ir_to_markdown.py \
+    /tmp/simple_abs_vmvx_pipeline.mlir \
+    -o /tmp/simple_abs_vmvx_pipeline.md
+"""
+
+import argparse
+import re
+
+MLIR_START_SEQUENCE = "// -----//"
+MLIR_END_SEQUENCE = "//----- //"
+
+
+def parse_arguments():
+  """Parses command line arguments."""
+
+  parser = argparse.ArgumentParser()
+  parser.add_argument('input_file_path',
+                      type=str,
+                      nargs='?',
+                      metavar="<input_file_path>",
+                      help='Input IR dump (.mlir from -print-ir-after-all)')
+  parser.add_argument('-o,',
+                      '--output',
+                      type=str,
+                      required=True,
+                      metavar="<output>",
+                      help='Output file path (e.g. translation_ir.md)')
+  # TODO(scotttodd): flags for original IR path and compilation command line
+  #                  .md could then show original IR + flags -> output
+  # TODO(scotttodd): flag for markdown flavor (mkdocs, github, etc.)
+  # TODO(scotttodd): flag for diff view (correlate IR before and IR after)?
+
+  return parser.parse_args()
+
+
+def main(args):
+  input_file_path = args.input_file_path
+  output_file_path = args.output
+  print("Converting input file '%s'" % (input_file_path))
+  print("     into output file '%s'" % (output_file_path))
+
+  with open(input_file_path, "r") as input_file:
+    with open(output_file_path, "w") as output_file:
+
+      # Iterate line by line through the input file, collecting text into
+      # blocks and writing them into the output file with markdown formatting
+      # as we go.
+      #
+      # Note: we could parse through and find/replace within the file using
+      # regex (or sed), but iterating this way is easier to understand and
+      # uses a predictable amount of memory.
+
+      current_block_lines = []
+      dump_after_regex = re.compile(MLIR_START_SEQUENCE + "\s(.*)\s" +
+                                    MLIR_END_SEQUENCE)
+
+      def finish_block():
+        nonlocal current_block_lines
+        if len(current_block_lines) != 0:
+          current_block_lines.append("```\n\n")
+          output_file.writelines(current_block_lines)
+          current_block_lines = []
+
+      for input_line in input_file:
+        if input_line == "\n":
+          continue
+
+        if input_line.startswith(MLIR_START_SEQUENCE):
+          finish_block()
+          header_text = dump_after_regex.match(input_line).group(1)
+          current_block_lines.append("### " + header_text + "\n\n")
+          current_block_lines.append("```mlir\n")
+        else:
+          current_block_lines.append(input_line)
+
+      finish_block()
+
+
+if __name__ == '__main__':
+  main(parse_arguments())