{
  "project": "nano-dsp-mlir",
  "commit": "ccb09e1b01eb6ae5dd0fe9e6108eeb90d2a08ae5",
  "capture": {
    "capturedAt": "2026-09-27T14:38:42.141Z",
    "host": "darwin-arm64",
    "toolchain": {
      "llvm": "23.1.1",
      "python": "3.11.7",
      "node": "v22.6.0",
      "mojo": "1.1.0",
      "rustc": "1.91.1"
    }
  },
  "artifacts": [
    {
      "id": "nano-tests",
      "kind": "test-run",
      "title": "lit regression suite (check-nanodsp)",
      "runner": "lit",
      "passed": 15,
      "failed": 0,
      "errors": 0,
      "skipped": 0,
      "log": "PASS: NANO-DSP-MLIR :: Dialect/DSP/invalid.mlir (1 of 15)\nPASS: NANO-DSP-MLIR :: Dialect/DSP/canonicalize.mlir (2 of 15)\nPASS: NANO-DSP-MLIR :: Dialect/DSP/ops.mlir (3 of 15)\nPASS: NANO-DSP-MLIR :: Conversion/DSPToLinalg/relu.mlir (4 of 15)\nPASS: NANO-DSP-MLIR :: Conversion/DSPToLinalg/matmul.mlir (5 of 15)\nPASS: NANO-DSP-MLIR :: Conversion/DSPToLinalg/add.mlir (6 of 15)\nPASS: NANO-DSP-MLIR :: Conversion/DSPToLinalg/conv2d.mlir (7 of 15)\nPASS: NANO-DSP-MLIR :: Integration/DSPToLinalg/conv2d-multichannel.mlir (8 of 15)\nPASS: NANO-DSP-MLIR :: Integration/DSPToLinalg/conv2d-strided.mlir (9 of 15)\nPASS: NANO-DSP-MLIR :: Integration/end-to-end.mlir (10 of 15)\nPASS: NANO-DSP-MLIR :: Integration/DSPToLinalg/relu.mlir (11 of 15)\nPASS: NANO-DSP-MLIR :: Integration/DSPToLinalg/matmul.mlir (12 of 15)\nPASS: NANO-DSP-MLIR :: Integration/DSPToLinalg/conv2d.mlir (13 of 15)\nPASS: NANO-DSP-MLIR :: Integration/DSPToLinalg/pipeline.mlir (14 of 15)\nPASS: NANO-DSP-MLIR :: Integration/DSPToLinalg/add.mlir (15 of 15)\n\nTotal Discovered Tests: 15\n  Passed: 15 (100.00%)",
      "provenance": {
        "mode": "captured",
        "command": "lit -v build/test"
      }
    },
    {
      "id": "nano-input",
      "kind": "ir-snapshot",
      "title": "relu(conv2d(image) + bias) integration test",
      "stage": "dsp",
      "text": "// RUN: nanodsp-opt %s -convert-dsp-to-linalg \\\n// RUN: | mlir-opt %stock_lower_to_llvm \\\n// RUN: | mlir-runner -e main --entry-point-result=void \\\n// RUN:     --shared-libs=%mlir_runner_utils --shared-libs=%mlir_c_runner_utils \\\n// RUN: | FileCheck %s\n\nfunc.func private @printMemrefF32(%ptr : tensor<*xf32>)\n\n// relu(blur(image) + bias)\nfunc.func @main() {\n  %in = arith.constant dense<[[[[ 1.0],[ 2.0],[ 3.0],[ 4.0]],\n                               [[ 5.0],[ 6.0],[ 7.0],[ 8.0]],\n                               [[ 9.0],[10.0],[11.0],[12.0]],\n                               [[13.0],[14.0],[15.0],[16.0]]]]> : tensor<1x4x4x1xf32>\n  %k = arith.constant dense<1.0> : tensor<3x3x1x1xf32>\n\n  // conv result is [[54, 63],[90, 99]]; bias drives two lanes negative.\n  %bias = arith.constant dense<[[[[-60.0],[-60.0]],\n                                 [[-60.0],[-60.0]]]]> : tensor<1x2x2x1xf32>\n\n  %c = dsp.conv2d %in, %k : (tensor<1x4x4x1xf32>, tensor<3x3x1x1xf32>) -> tensor<1x2x2x1xf32>\n  %s = dsp.add %c, %bias : tensor<1x2x2x1xf32>\n  %r = dsp.relu %s : tensor<1x2x2x1xf32>\n\n  // 54-60 = -6 -> 0 ; 63-60 =  3 ->  3\n  // 90-60 = 30 -> 30 ; 99-60 = 39 -> 39\n  %u = tensor.cast %r : tensor<1x2x2x1xf32> to tensor<*xf32>\n  call @printMemrefF32(%u) : (tensor<*xf32>) -> ()\n  return\n}\n\n// CHECK: rank = 4 offset = 0 sizes = [1, 2, 2, 1]\n// CHECK: 0\n// CHECK: 3\n// CHECK: 30\n// CHECK: 39",
      "location": {
        "file": "test/Integration/DSPToLinalg/pipeline.mlir",
        "line": 1
      },
      "provenance": {
        "mode": "static",
        "path": "test/Integration/DSPToLinalg/pipeline.mlir"
      }
    },
    {
      "id": "nano-ir-0-parsed",
      "kind": "ir-snapshot",
      "title": "Input as parsed and printed by nanodsp-opt",
      "stage": "dsp",
      "text": "module {\n  func.func private @printMemrefF32(tensor<*xf32>)\n  func.func @main() {\n    %cst = arith.constant dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> : tensor<1x4x4x1xf32>\n    %cst_0 = arith.constant dense<1.000000e+00> : tensor<3x3x1x1xf32>\n    %cst_1 = arith.constant dense<-6.000000e+01> : tensor<1x2x2x1xf32>\n    %0 = dsp.conv2d %cst, %cst_0 : (tensor<1x4x4x1xf32>, tensor<3x3x1x1xf32>) -> tensor<1x2x2x1xf32>\n    %1 = dsp.add %0, %cst_1 : tensor<1x2x2x1xf32>\n    %2 = dsp.relu %1 : tensor<1x2x2x1xf32>\n    %cast = tensor.cast %2 : tensor<1x2x2x1xf32> to tensor<*xf32>\n    call @printMemrefF32(%cast) : (tensor<*xf32>) -> ()\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir"
      }
    },
    {
      "id": "nano-ir-1-convertdsptolinalg",
      "kind": "ir-snapshot",
      "title": "IR after ConvertDSPToLinalg (convert-dsp-to-linalg)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  func.func private @printMemrefF32(tensor<*xf32>)\n  func.func @main() {\n    %cst = arith.constant dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> : tensor<1x4x4x1xf32>\n    %cst_0 = arith.constant dense<1.000000e+00> : tensor<3x3x1x1xf32>\n    %cst_1 = arith.constant dense<-6.000000e+01> : tensor<1x2x2x1xf32>\n    %0 = tensor.empty() : tensor<1x2x2x1xf32>\n    %cst_2 = arith.constant 0.000000e+00 : f32\n    %1 = linalg.fill ins(%cst_2 : f32) outs(%0 : tensor<1x2x2x1xf32>) -> tensor<1x2x2x1xf32>\n    %2 = linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%cst, %cst_0 : tensor<1x4x4x1xf32>, tensor<3x3x1x1xf32>) outs(%1 : tensor<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_4: f32, %out: f32):\n      %7 = arith.mulf %in, %in_4 : f32\n      %8 = arith.addf %out, %7 : f32\n      linalg.yield %8 : f32\n    } -> tensor<1x2x2x1xf32>\n    %3 = tensor.empty() : tensor<1x2x2x1xf32>\n    %4 = linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%2, %cst_1 : tensor<1x2x2x1xf32>, tensor<1x2x2x1xf32>) outs(%3 : tensor<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_4: f32, %out: f32):\n      %7 = arith.addf %in, %in_4 : f32\n      linalg.yield %7 : f32\n    } -> tensor<1x2x2x1xf32>\n    %5 = tensor.empty() : tensor<1x2x2x1xf32>\n    %cst_3 = arith.constant 0.000000e+00 : f32\n    %6 = linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%4 : tensor<1x2x2x1xf32>) outs(%5 : tensor<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %7 = arith.maximumf %in, %cst_3 : f32\n      linalg.yield %7 : f32\n    } -> tensor<1x2x2x1xf32>\n    %cast = tensor.cast %6 : tensor<1x2x2x1xf32> to tensor<*xf32>\n    call @printMemrefF32(%cast) : (tensor<*xf32>) -> ()\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-1-convertdsptolinalg",
      "kind": "pass-event",
      "title": "ConvertDSPToLinalg (convert-dsp-to-linalg)",
      "pass": "ConvertDSPToLinalg (convert-dsp-to-linalg)",
      "index": 1,
      "changed": true,
      "before": "nano-ir-0-parsed",
      "after": "nano-ir-1-convertdsptolinalg",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-2-oneshotbufferizepass",
      "kind": "ir-snapshot",
      "title": "IR after OneShotBufferizePass (one-shot-bufferize)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %1 = memref.get_global @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32>\n    %2 = memref.get_global @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    %cst = arith.constant 0.000000e+00 : f32\n    linalg.fill ins(%cst : f32) outs(%alloc : memref<1x2x2x1xf32>)\n    linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%0, %1 : memref<1x4x4x1xf32>, memref<3x3x1x1xf32>) outs(%alloc : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_3: f32, %out: f32):\n      %3 = arith.mulf %in, %in_3 : f32\n      %4 = arith.addf %out, %3 : f32\n      linalg.yield %4 : f32\n    }\n    %alloc_0 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc, %2 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) outs(%alloc_0 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_3: f32, %out: f32):\n      %3 = arith.addf %in, %in_3 : f32\n      linalg.yield %3 : f32\n    }\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    %cst_2 = arith.constant 0.000000e+00 : f32\n    linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc_0 : memref<1x2x2x1xf32>) outs(%alloc_1 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %3 = arith.maximumf %in, %cst_2 : f32\n      linalg.yield %3 : f32\n    }\n    %cast = memref.cast %alloc_1 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-2-oneshotbufferizepass",
      "kind": "pass-event",
      "title": "OneShotBufferizePass (one-shot-bufferize)",
      "pass": "OneShotBufferizePass (one-shot-bufferize)",
      "index": 2,
      "changed": true,
      "before": "nano-ir-1-convertdsptolinalg",
      "after": "nano-ir-2-oneshotbufferizepass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-3-expandreallocpass",
      "kind": "pass-event",
      "title": "ExpandReallocPass (expand-realloc)",
      "pass": "ExpandReallocPass (expand-realloc)",
      "index": 3,
      "changed": false,
      "before": "nano-ir-2-oneshotbufferizepass",
      "after": "nano-ir-2-oneshotbufferizepass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-4-canonicalizerpass",
      "kind": "ir-snapshot",
      "title": "IR after CanonicalizerPass (canonicalize)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %cst = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %1 = memref.get_global @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32>\n    %2 = memref.get_global @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.fill ins(%cst : f32) outs(%alloc : memref<1x2x2x1xf32>)\n    linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%0, %1 : memref<1x4x4x1xf32>, memref<3x3x1x1xf32>) outs(%alloc : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.mulf %in, %in_2 : f32\n      %4 = arith.addf %out, %3 : f32\n      linalg.yield %4 : f32\n    }\n    %alloc_0 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc, %2 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) outs(%alloc_0 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.addf %in, %in_2 : f32\n      linalg.yield %3 : f32\n    }\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc_0 : memref<1x2x2x1xf32>) outs(%alloc_1 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %3 = arith.maximumf %in, %cst : f32\n      linalg.yield %3 : f32\n    }\n    %cast = memref.cast %alloc_1 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-4-canonicalizerpass",
      "kind": "pass-event",
      "title": "CanonicalizerPass (canonicalize)",
      "pass": "CanonicalizerPass (canonicalize)",
      "index": 4,
      "changed": true,
      "before": "nano-ir-2-oneshotbufferizepass",
      "after": "nano-ir-4-canonicalizerpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-5-ownershipbasedbufferdeallocationpass",
      "kind": "ir-snapshot",
      "title": "IR after OwnershipBasedBufferDeallocationPass (ownership-based-buffer-deallocation)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %true = arith.constant true\n    %true_0 = arith.constant true\n    %true_1 = arith.constant true\n    %cst = arith.constant 0.000000e+00 : f32\n    %false = arith.constant false\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %false_2 = arith.constant false\n    %1 = memref.get_global @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32>\n    %false_3 = arith.constant false\n    %2 = memref.get_global @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.fill ins(%cst : f32) outs(%alloc : memref<1x2x2x1xf32>)\n    linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%0, %1 : memref<1x4x4x1xf32>, memref<3x3x1x1xf32>) outs(%alloc : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_15: f32, %out: f32):\n      %3 = arith.mulf %in, %in_15 : f32\n      %4 = arith.addf %out, %3 : f32\n      linalg.yield %4 : f32\n    }\n    %alloc_4 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc, %2 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) outs(%alloc_4 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_15: f32, %out: f32):\n      %3 = arith.addf %in, %in_15 : f32\n      linalg.yield %3 : f32\n    }\n    %alloc_5 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc_4 : memref<1x2x2x1xf32>) outs(%alloc_5 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %3 = arith.maximumf %in, %cst : f32\n      linalg.yield %3 : f32\n    }\n    %cast = memref.cast %alloc_5 : memref<1x2x2x1xf32> to memref<*xf32>\n    %true_6 = arith.constant true\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    %base_buffer, %offset, %sizes:4, %strides:4 = memref.extract_strided_metadata %alloc : memref<1x2x2x1xf32> -> memref<f32>, index, index, index, index, index, index, index, index, index\n    %base_buffer_7, %offset_8, %sizes_9:4, %strides_10:4 = memref.extract_strided_metadata %alloc_4 : memref<1x2x2x1xf32> -> memref<f32>, index, index, index, index, index, index, index, index, index\n    %base_buffer_11, %offset_12, %sizes_13:4, %strides_14:4 = memref.extract_strided_metadata %alloc_5 : memref<1x2x2x1xf32> -> memref<f32>, index, index, index, index, index, index, index, index, index\n    bufferization.dealloc (%base_buffer, %base_buffer_7, %base_buffer_11 : memref<f32>, memref<f32>, memref<f32>) if (%true_1, %true_0, %true)\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-5-ownershipbasedbufferdeallocationpass",
      "kind": "pass-event",
      "title": "OwnershipBasedBufferDeallocationPass (ownership-based-buffer-deallocation)",
      "pass": "OwnershipBasedBufferDeallocationPass (ownership-based-buffer-deallocation)",
      "index": 5,
      "changed": true,
      "before": "nano-ir-4-canonicalizerpass",
      "after": "nano-ir-5-ownershipbasedbufferdeallocationpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-6-canonicalizerpass",
      "kind": "ir-snapshot",
      "title": "IR after CanonicalizerPass (canonicalize)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %true = arith.constant true\n    %cst = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %1 = memref.get_global @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32>\n    %2 = memref.get_global @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.fill ins(%cst : f32) outs(%alloc : memref<1x2x2x1xf32>)\n    linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%0, %1 : memref<1x4x4x1xf32>, memref<3x3x1x1xf32>) outs(%alloc : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.mulf %in, %in_2 : f32\n      %4 = arith.addf %out, %3 : f32\n      linalg.yield %4 : f32\n    }\n    %alloc_0 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc, %2 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) outs(%alloc_0 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.addf %in, %in_2 : f32\n      linalg.yield %3 : f32\n    }\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc_0 : memref<1x2x2x1xf32>) outs(%alloc_1 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %3 = arith.maximumf %in, %cst : f32\n      linalg.yield %3 : f32\n    }\n    %cast = memref.cast %alloc_1 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    bufferization.dealloc (%alloc, %alloc_0, %alloc_1 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) if (%true, %true, %true)\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-6-canonicalizerpass",
      "kind": "pass-event",
      "title": "CanonicalizerPass (canonicalize)",
      "pass": "CanonicalizerPass (canonicalize)",
      "index": 6,
      "changed": true,
      "before": "nano-ir-5-ownershipbasedbufferdeallocationpass",
      "after": "nano-ir-6-canonicalizerpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-7-bufferdeallocationsimplificationpass",
      "kind": "ir-snapshot",
      "title": "IR after BufferDeallocationSimplificationPass (buffer-deallocation-simplification)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %true = arith.constant true\n    %cst = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %1 = memref.get_global @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32>\n    %2 = memref.get_global @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.fill ins(%cst : f32) outs(%alloc : memref<1x2x2x1xf32>)\n    linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%0, %1 : memref<1x4x4x1xf32>, memref<3x3x1x1xf32>) outs(%alloc : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.mulf %in, %in_2 : f32\n      %4 = arith.addf %out, %3 : f32\n      linalg.yield %4 : f32\n    }\n    %alloc_0 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc, %2 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) outs(%alloc_0 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.addf %in, %in_2 : f32\n      linalg.yield %3 : f32\n    }\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc_0 : memref<1x2x2x1xf32>) outs(%alloc_1 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %3 = arith.maximumf %in, %cst : f32\n      linalg.yield %3 : f32\n    }\n    %cast = memref.cast %alloc_1 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    bufferization.dealloc (%alloc : memref<1x2x2x1xf32>) if (%true)\n    bufferization.dealloc (%alloc_0 : memref<1x2x2x1xf32>) if (%true)\n    bufferization.dealloc (%alloc_1 : memref<1x2x2x1xf32>) if (%true)\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-7-bufferdeallocationsimplificationpass",
      "kind": "pass-event",
      "title": "BufferDeallocationSimplificationPass (buffer-deallocation-simplification)",
      "pass": "BufferDeallocationSimplificationPass (buffer-deallocation-simplification)",
      "index": 7,
      "changed": true,
      "before": "nano-ir-6-canonicalizerpass",
      "after": "nano-ir-7-bufferdeallocationsimplificationpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-8-lowerdeallocationspass",
      "kind": "ir-snapshot",
      "title": "IR after LowerDeallocationsPass (bufferization-lower-deallocations)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %true = arith.constant true\n    %cst = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %1 = memref.get_global @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32>\n    %2 = memref.get_global @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.fill ins(%cst : f32) outs(%alloc : memref<1x2x2x1xf32>)\n    linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%0, %1 : memref<1x4x4x1xf32>, memref<3x3x1x1xf32>) outs(%alloc : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.mulf %in, %in_2 : f32\n      %4 = arith.addf %out, %3 : f32\n      linalg.yield %4 : f32\n    }\n    %alloc_0 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc, %2 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) outs(%alloc_0 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.addf %in, %in_2 : f32\n      linalg.yield %3 : f32\n    }\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc_0 : memref<1x2x2x1xf32>) outs(%alloc_1 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %3 = arith.maximumf %in, %cst : f32\n      linalg.yield %3 : f32\n    }\n    %cast = memref.cast %alloc_1 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    scf.if %true {\n      memref.dealloc %alloc : memref<1x2x2x1xf32>\n    }\n    scf.if %true {\n      memref.dealloc %alloc_0 : memref<1x2x2x1xf32>\n    }\n    scf.if %true {\n      memref.dealloc %alloc_1 : memref<1x2x2x1xf32>\n    }\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-8-lowerdeallocationspass",
      "kind": "pass-event",
      "title": "LowerDeallocationsPass (bufferization-lower-deallocations)",
      "pass": "LowerDeallocationsPass (bufferization-lower-deallocations)",
      "index": 8,
      "changed": true,
      "before": "nano-ir-7-bufferdeallocationsimplificationpass",
      "after": "nano-ir-8-lowerdeallocationspass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-9-csepass",
      "kind": "pass-event",
      "title": "CSEPass (cse)",
      "pass": "CSEPass (cse)",
      "index": 9,
      "changed": false,
      "before": "nano-ir-8-lowerdeallocationspass",
      "after": "nano-ir-8-lowerdeallocationspass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-10-canonicalizerpass",
      "kind": "ir-snapshot",
      "title": "IR after CanonicalizerPass (canonicalize)",
      "stage": "linalg",
      "text": "#map = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1 + d4, d2 + d5, d6)>\n#map1 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d4, d5, d6, d3)>\n#map2 = affine_map<(d0, d1, d2, d3, d4, d5, d6) -> (d0, d1, d2, d3)>\n#map3 = affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %cst = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %1 = memref.get_global @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32>\n    %2 = memref.get_global @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.fill ins(%cst : f32) outs(%alloc : memref<1x2x2x1xf32>)\n    linalg.generic {indexing_maps = [#map, #map1, #map2], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\", \"reduction\", \"reduction\", \"reduction\"]} ins(%0, %1 : memref<1x4x4x1xf32>, memref<3x3x1x1xf32>) outs(%alloc : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.mulf %in, %in_2 : f32\n      %4 = arith.addf %out, %3 : f32\n      linalg.yield %4 : f32\n    }\n    %alloc_0 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc, %2 : memref<1x2x2x1xf32>, memref<1x2x2x1xf32>) outs(%alloc_0 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %in_2: f32, %out: f32):\n      %3 = arith.addf %in, %in_2 : f32\n      linalg.yield %3 : f32\n    }\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    linalg.generic {indexing_maps = [#map3, #map3], iterator_types = [\"parallel\", \"parallel\", \"parallel\", \"parallel\"]} ins(%alloc_0 : memref<1x2x2x1xf32>) outs(%alloc_1 : memref<1x2x2x1xf32>) {\n    ^bb0(%in: f32, %out: f32):\n      %3 = arith.maximumf %in, %cst : f32\n      linalg.yield %3 : f32\n    }\n    %cast = memref.cast %alloc_1 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    memref.dealloc %alloc : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_0 : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_1 : memref<1x2x2x1xf32>\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-10-canonicalizerpass",
      "kind": "pass-event",
      "title": "CanonicalizerPass (canonicalize)",
      "pass": "CanonicalizerPass (canonicalize)",
      "index": 10,
      "changed": true,
      "before": "nano-ir-8-lowerdeallocationspass",
      "after": "nano-ir-10-canonicalizerpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-11-convertlinalgtoloopspass",
      "kind": "ir-snapshot",
      "title": "IR after ConvertLinalgToLoopsPass (convert-linalg-to-loops)",
      "stage": "arith/scf/memref",
      "text": "#map = affine_map<(d0, d1) -> (d0 + d1)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %cst = arith.constant -6.000000e+01 : f32\n    %c3 = arith.constant 3 : index\n    %c2 = arith.constant 2 : index\n    %c1 = arith.constant 1 : index\n    %c0 = arith.constant 0 : index\n    %cst_0 = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    scf.for %arg0 = %c0 to %c1 step %c1 {\n      scf.for %arg1 = %c0 to %c2 step %c1 {\n        scf.for %arg2 = %c0 to %c2 step %c1 {\n          scf.for %arg3 = %c0 to %c1 step %c1 {\n            memref.store %cst_0, %alloc[%arg0, %arg1, %arg2, %arg3] : memref<1x2x2x1xf32>\n          }\n        }\n      }\n    }\n    scf.for %arg0 = %c0 to %c1 step %c1 {\n      scf.for %arg1 = %c0 to %c2 step %c1 {\n        scf.for %arg2 = %c0 to %c2 step %c1 {\n          scf.for %arg3 = %c0 to %c1 step %c1 {\n            scf.for %arg4 = %c0 to %c3 step %c1 {\n              scf.for %arg5 = %c0 to %c3 step %c1 {\n                scf.for %arg6 = %c0 to %c1 step %c1 {\n                  %1 = affine.apply #map(%arg1, %arg4)\n                  %2 = affine.apply #map(%arg2, %arg5)\n                  %3 = memref.load %0[%arg0, %1, %2, %arg6] : memref<1x4x4x1xf32>\n                  %4 = memref.load %alloc[%arg0, %arg1, %arg2, %arg3] : memref<1x2x2x1xf32>\n                  %5 = arith.addf %4, %3 : f32\n                  memref.store %5, %alloc[%arg0, %arg1, %arg2, %arg3] : memref<1x2x2x1xf32>\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    scf.for %arg0 = %c0 to %c1 step %c1 {\n      scf.for %arg1 = %c0 to %c2 step %c1 {\n        scf.for %arg2 = %c0 to %c2 step %c1 {\n          scf.for %arg3 = %c0 to %c1 step %c1 {\n            %1 = memref.load %alloc[%arg0, %arg1, %arg2, %arg3] : memref<1x2x2x1xf32>\n            %2 = arith.addf %1, %cst : f32\n            memref.store %2, %alloc_1[%arg0, %arg1, %arg2, %arg3] : memref<1x2x2x1xf32>\n          }\n        }\n      }\n    }\n    %alloc_2 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    scf.for %arg0 = %c0 to %c1 step %c1 {\n      scf.for %arg1 = %c0 to %c2 step %c1 {\n        scf.for %arg2 = %c0 to %c2 step %c1 {\n          scf.for %arg3 = %c0 to %c1 step %c1 {\n            %1 = memref.load %alloc_1[%arg0, %arg1, %arg2, %arg3] : memref<1x2x2x1xf32>\n            %2 = arith.maximumf %1, %cst_0 : f32\n            memref.store %2, %alloc_2[%arg0, %arg1, %arg2, %arg3] : memref<1x2x2x1xf32>\n          }\n        }\n      }\n    }\n    %cast = memref.cast %alloc_2 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    memref.dealloc %alloc : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_1 : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_2 : memref<1x2x2x1xf32>\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-11-convertlinalgtoloopspass",
      "kind": "pass-event",
      "title": "ConvertLinalgToLoopsPass (convert-linalg-to-loops)",
      "pass": "ConvertLinalgToLoopsPass (convert-linalg-to-loops)",
      "index": 11,
      "changed": true,
      "before": "nano-ir-10-canonicalizerpass",
      "after": "nano-ir-11-convertlinalgtoloopspass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-12-scftocontrolflowpass",
      "kind": "ir-snapshot",
      "title": "IR after SCFToControlFlowPass (convert-scf-to-cf)",
      "stage": "arith/scf/memref",
      "text": "#map = affine_map<(d0, d1) -> (d0 + d1)>\nmodule {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %cst = arith.constant -6.000000e+01 : f32\n    %c3 = arith.constant 3 : index\n    %c2 = arith.constant 2 : index\n    %c1 = arith.constant 1 : index\n    %c0 = arith.constant 0 : index\n    %cst_0 = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb1(%c0 : index)\n  ^bb1(%1: index):  // 2 preds: ^bb0, ^bb11\n    %2 = arith.cmpi slt, %1, %c1 : index\n    cf.cond_br %2, ^bb2, ^bb12\n  ^bb2:  // pred: ^bb1\n    cf.br ^bb3(%c0 : index)\n  ^bb3(%3: index):  // 2 preds: ^bb2, ^bb10\n    %4 = arith.cmpi slt, %3, %c2 : index\n    cf.cond_br %4, ^bb4, ^bb11\n  ^bb4:  // pred: ^bb3\n    cf.br ^bb5(%c0 : index)\n  ^bb5(%5: index):  // 2 preds: ^bb4, ^bb9\n    %6 = arith.cmpi slt, %5, %c2 : index\n    cf.cond_br %6, ^bb6, ^bb10\n  ^bb6:  // pred: ^bb5\n    cf.br ^bb7(%c0 : index)\n  ^bb7(%7: index):  // 2 preds: ^bb6, ^bb8\n    %8 = arith.cmpi slt, %7, %c1 : index\n    cf.cond_br %8, ^bb8, ^bb9\n  ^bb8:  // pred: ^bb7\n    memref.store %cst_0, %alloc[%1, %3, %5, %7] : memref<1x2x2x1xf32>\n    %9 = arith.addi %7, %c1 : index\n    cf.br ^bb7(%9 : index)\n  ^bb9:  // pred: ^bb7\n    %10 = arith.addi %5, %c1 : index\n    cf.br ^bb5(%10 : index)\n  ^bb10:  // pred: ^bb5\n    %11 = arith.addi %3, %c1 : index\n    cf.br ^bb3(%11 : index)\n  ^bb11:  // pred: ^bb3\n    %12 = arith.addi %1, %c1 : index\n    cf.br ^bb1(%12 : index)\n  ^bb12:  // pred: ^bb1\n    cf.br ^bb13(%c0 : index)\n  ^bb13(%13: index):  // 2 preds: ^bb12, ^bb32\n    %14 = arith.cmpi slt, %13, %c1 : index\n    cf.cond_br %14, ^bb14, ^bb33\n  ^bb14:  // pred: ^bb13\n    cf.br ^bb15(%c0 : index)\n  ^bb15(%15: index):  // 2 preds: ^bb14, ^bb31\n    %16 = arith.cmpi slt, %15, %c2 : index\n    cf.cond_br %16, ^bb16, ^bb32\n  ^bb16:  // pred: ^bb15\n    cf.br ^bb17(%c0 : index)\n  ^bb17(%17: index):  // 2 preds: ^bb16, ^bb30\n    %18 = arith.cmpi slt, %17, %c2 : index\n    cf.cond_br %18, ^bb18, ^bb31\n  ^bb18:  // pred: ^bb17\n    cf.br ^bb19(%c0 : index)\n  ^bb19(%19: index):  // 2 preds: ^bb18, ^bb29\n    %20 = arith.cmpi slt, %19, %c1 : index\n    cf.cond_br %20, ^bb20, ^bb30\n  ^bb20:  // pred: ^bb19\n    cf.br ^bb21(%c0 : index)\n  ^bb21(%21: index):  // 2 preds: ^bb20, ^bb28\n    %22 = arith.cmpi slt, %21, %c3 : index\n    cf.cond_br %22, ^bb22, ^bb29\n  ^bb22:  // pred: ^bb21\n    cf.br ^bb23(%c0 : index)\n  ^bb23(%23: index):  // 2 preds: ^bb22, ^bb27\n    %24 = arith.cmpi slt, %23, %c3 : index\n    cf.cond_br %24, ^bb24, ^bb28\n  ^bb24:  // pred: ^bb23\n    cf.br ^bb25(%c0 : index)\n  ^bb25(%25: index):  // 2 preds: ^bb24, ^bb26\n    %26 = arith.cmpi slt, %25, %c1 : index\n    cf.cond_br %26, ^bb26, ^bb27\n  ^bb26:  // pred: ^bb25\n    %27 = affine.apply #map(%15, %21)\n    %28 = affine.apply #map(%17, %23)\n    %29 = memref.load %0[%13, %27, %28, %25] : memref<1x4x4x1xf32>\n    %30 = memref.load %alloc[%13, %15, %17, %19] : memref<1x2x2x1xf32>\n    %31 = arith.addf %30, %29 : f32\n    memref.store %31, %alloc[%13, %15, %17, %19] : memref<1x2x2x1xf32>\n    %32 = arith.addi %25, %c1 : index\n    cf.br ^bb25(%32 : index)\n  ^bb27:  // pred: ^bb25\n    %33 = arith.addi %23, %c1 : index\n    cf.br ^bb23(%33 : index)\n  ^bb28:  // pred: ^bb23\n    %34 = arith.addi %21, %c1 : index\n    cf.br ^bb21(%34 : index)\n  ^bb29:  // pred: ^bb21\n    %35 = arith.addi %19, %c1 : index\n    cf.br ^bb19(%35 : index)\n  ^bb30:  // pred: ^bb19\n    %36 = arith.addi %17, %c1 : index\n    cf.br ^bb17(%36 : index)\n  ^bb31:  // pred: ^bb17\n    %37 = arith.addi %15, %c1 : index\n    cf.br ^bb15(%37 : index)\n  ^bb32:  // pred: ^bb15\n    %38 = arith.addi %13, %c1 : index\n    cf.br ^bb13(%38 : index)\n  ^bb33:  // pred: ^bb13\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb34(%c0 : index)\n  ^bb34(%39: index):  // 2 preds: ^bb33, ^bb44\n    %40 = arith.cmpi slt, %39, %c1 : index\n    cf.cond_br %40, ^bb35, ^bb45\n  ^bb35:  // pred: ^bb34\n    cf.br ^bb36(%c0 : index)\n  ^bb36(%41: index):  // 2 preds: ^bb35, ^bb43\n    %42 = arith.cmpi slt, %41, %c2 : index\n    cf.cond_br %42, ^bb37, ^bb44\n  ^bb37:  // pred: ^bb36\n    cf.br ^bb38(%c0 : index)\n  ^bb38(%43: index):  // 2 preds: ^bb37, ^bb42\n    %44 = arith.cmpi slt, %43, %c2 : index\n    cf.cond_br %44, ^bb39, ^bb43\n  ^bb39:  // pred: ^bb38\n    cf.br ^bb40(%c0 : index)\n  ^bb40(%45: index):  // 2 preds: ^bb39, ^bb41\n    %46 = arith.cmpi slt, %45, %c1 : index\n    cf.cond_br %46, ^bb41, ^bb42\n  ^bb41:  // pred: ^bb40\n    %47 = memref.load %alloc[%39, %41, %43, %45] : memref<1x2x2x1xf32>\n    %48 = arith.addf %47, %cst : f32\n    memref.store %48, %alloc_1[%39, %41, %43, %45] : memref<1x2x2x1xf32>\n    %49 = arith.addi %45, %c1 : index\n    cf.br ^bb40(%49 : index)\n  ^bb42:  // pred: ^bb40\n    %50 = arith.addi %43, %c1 : index\n    cf.br ^bb38(%50 : index)\n  ^bb43:  // pred: ^bb38\n    %51 = arith.addi %41, %c1 : index\n    cf.br ^bb36(%51 : index)\n  ^bb44:  // pred: ^bb36\n    %52 = arith.addi %39, %c1 : index\n    cf.br ^bb34(%52 : index)\n  ^bb45:  // pred: ^bb34\n    %alloc_2 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb46(%c0 : index)\n  ^bb46(%53: index):  // 2 preds: ^bb45, ^bb56\n    %54 = arith.cmpi slt, %53, %c1 : index\n    cf.cond_br %54, ^bb47, ^bb57\n  ^bb47:  // pred: ^bb46\n    cf.br ^bb48(%c0 : index)\n  ^bb48(%55: index):  // 2 preds: ^bb47, ^bb55\n    %56 = arith.cmpi slt, %55, %c2 : index\n    cf.cond_br %56, ^bb49, ^bb56\n  ^bb49:  // pred: ^bb48\n    cf.br ^bb50(%c0 : index)\n  ^bb50(%57: index):  // 2 preds: ^bb49, ^bb54\n    %58 = arith.cmpi slt, %57, %c2 : index\n    cf.cond_br %58, ^bb51, ^bb55\n  ^bb51:  // pred: ^bb50\n    cf.br ^bb52(%c0 : index)\n  ^bb52(%59: index):  // 2 preds: ^bb51, ^bb53\n    %60 = arith.cmpi slt, %59, %c1 : index\n    cf.cond_br %60, ^bb53, ^bb54\n  ^bb53:  // pred: ^bb52\n    %61 = memref.load %alloc_1[%53, %55, %57, %59] : memref<1x2x2x1xf32>\n    %62 = arith.maximumf %61, %cst_0 : f32\n    memref.store %62, %alloc_2[%53, %55, %57, %59] : memref<1x2x2x1xf32>\n    %63 = arith.addi %59, %c1 : index\n    cf.br ^bb52(%63 : index)\n  ^bb54:  // pred: ^bb52\n    %64 = arith.addi %57, %c1 : index\n    cf.br ^bb50(%64 : index)\n  ^bb55:  // pred: ^bb50\n    %65 = arith.addi %55, %c1 : index\n    cf.br ^bb48(%65 : index)\n  ^bb56:  // pred: ^bb48\n    %66 = arith.addi %53, %c1 : index\n    cf.br ^bb46(%66 : index)\n  ^bb57:  // pred: ^bb46\n    %cast = memref.cast %alloc_2 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    memref.dealloc %alloc : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_1 : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_2 : memref<1x2x2x1xf32>\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-12-scftocontrolflowpass",
      "kind": "pass-event",
      "title": "SCFToControlFlowPass (convert-scf-to-cf)",
      "pass": "SCFToControlFlowPass (convert-scf-to-cf)",
      "index": 12,
      "changed": true,
      "before": "nano-ir-11-convertlinalgtoloopspass",
      "after": "nano-ir-12-scftocontrolflowpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-13-expandstridedmetadatapass",
      "kind": "pass-event",
      "title": "ExpandStridedMetadataPass (expand-strided-metadata)",
      "pass": "ExpandStridedMetadataPass (expand-strided-metadata)",
      "index": 13,
      "changed": false,
      "before": "nano-ir-12-scftocontrolflowpass",
      "after": "nano-ir-12-scftocontrolflowpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-14-loweraffinepass",
      "kind": "ir-snapshot",
      "title": "IR after LowerAffinePass (lower-affine)",
      "stage": "arith/scf/memref",
      "text": "module {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %cst = arith.constant -6.000000e+01 : f32\n    %c3 = arith.constant 3 : index\n    %c2 = arith.constant 2 : index\n    %c1 = arith.constant 1 : index\n    %c0 = arith.constant 0 : index\n    %cst_0 = arith.constant 0.000000e+00 : f32\n    %0 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb1(%c0 : index)\n  ^bb1(%1: index):  // 2 preds: ^bb0, ^bb11\n    %2 = arith.cmpi slt, %1, %c1 : index\n    cf.cond_br %2, ^bb2, ^bb12\n  ^bb2:  // pred: ^bb1\n    cf.br ^bb3(%c0 : index)\n  ^bb3(%3: index):  // 2 preds: ^bb2, ^bb10\n    %4 = arith.cmpi slt, %3, %c2 : index\n    cf.cond_br %4, ^bb4, ^bb11\n  ^bb4:  // pred: ^bb3\n    cf.br ^bb5(%c0 : index)\n  ^bb5(%5: index):  // 2 preds: ^bb4, ^bb9\n    %6 = arith.cmpi slt, %5, %c2 : index\n    cf.cond_br %6, ^bb6, ^bb10\n  ^bb6:  // pred: ^bb5\n    cf.br ^bb7(%c0 : index)\n  ^bb7(%7: index):  // 2 preds: ^bb6, ^bb8\n    %8 = arith.cmpi slt, %7, %c1 : index\n    cf.cond_br %8, ^bb8, ^bb9\n  ^bb8:  // pred: ^bb7\n    memref.store %cst_0, %alloc[%1, %3, %5, %7] : memref<1x2x2x1xf32>\n    %9 = arith.addi %7, %c1 : index\n    cf.br ^bb7(%9 : index)\n  ^bb9:  // pred: ^bb7\n    %10 = arith.addi %5, %c1 : index\n    cf.br ^bb5(%10 : index)\n  ^bb10:  // pred: ^bb5\n    %11 = arith.addi %3, %c1 : index\n    cf.br ^bb3(%11 : index)\n  ^bb11:  // pred: ^bb3\n    %12 = arith.addi %1, %c1 : index\n    cf.br ^bb1(%12 : index)\n  ^bb12:  // pred: ^bb1\n    cf.br ^bb13(%c0 : index)\n  ^bb13(%13: index):  // 2 preds: ^bb12, ^bb32\n    %14 = arith.cmpi slt, %13, %c1 : index\n    cf.cond_br %14, ^bb14, ^bb33\n  ^bb14:  // pred: ^bb13\n    cf.br ^bb15(%c0 : index)\n  ^bb15(%15: index):  // 2 preds: ^bb14, ^bb31\n    %16 = arith.cmpi slt, %15, %c2 : index\n    cf.cond_br %16, ^bb16, ^bb32\n  ^bb16:  // pred: ^bb15\n    cf.br ^bb17(%c0 : index)\n  ^bb17(%17: index):  // 2 preds: ^bb16, ^bb30\n    %18 = arith.cmpi slt, %17, %c2 : index\n    cf.cond_br %18, ^bb18, ^bb31\n  ^bb18:  // pred: ^bb17\n    cf.br ^bb19(%c0 : index)\n  ^bb19(%19: index):  // 2 preds: ^bb18, ^bb29\n    %20 = arith.cmpi slt, %19, %c1 : index\n    cf.cond_br %20, ^bb20, ^bb30\n  ^bb20:  // pred: ^bb19\n    cf.br ^bb21(%c0 : index)\n  ^bb21(%21: index):  // 2 preds: ^bb20, ^bb28\n    %22 = arith.cmpi slt, %21, %c3 : index\n    cf.cond_br %22, ^bb22, ^bb29\n  ^bb22:  // pred: ^bb21\n    cf.br ^bb23(%c0 : index)\n  ^bb23(%23: index):  // 2 preds: ^bb22, ^bb27\n    %24 = arith.cmpi slt, %23, %c3 : index\n    cf.cond_br %24, ^bb24, ^bb28\n  ^bb24:  // pred: ^bb23\n    cf.br ^bb25(%c0 : index)\n  ^bb25(%25: index):  // 2 preds: ^bb24, ^bb26\n    %26 = arith.cmpi slt, %25, %c1 : index\n    cf.cond_br %26, ^bb26, ^bb27\n  ^bb26:  // pred: ^bb25\n    %27 = arith.addi %15, %21 : index\n    %28 = arith.addi %17, %23 : index\n    %29 = memref.load %0[%13, %27, %28, %25] : memref<1x4x4x1xf32>\n    %30 = memref.load %alloc[%13, %15, %17, %19] : memref<1x2x2x1xf32>\n    %31 = arith.addf %30, %29 : f32\n    memref.store %31, %alloc[%13, %15, %17, %19] : memref<1x2x2x1xf32>\n    %32 = arith.addi %25, %c1 : index\n    cf.br ^bb25(%32 : index)\n  ^bb27:  // pred: ^bb25\n    %33 = arith.addi %23, %c1 : index\n    cf.br ^bb23(%33 : index)\n  ^bb28:  // pred: ^bb23\n    %34 = arith.addi %21, %c1 : index\n    cf.br ^bb21(%34 : index)\n  ^bb29:  // pred: ^bb21\n    %35 = arith.addi %19, %c1 : index\n    cf.br ^bb19(%35 : index)\n  ^bb30:  // pred: ^bb19\n    %36 = arith.addi %17, %c1 : index\n    cf.br ^bb17(%36 : index)\n  ^bb31:  // pred: ^bb17\n    %37 = arith.addi %15, %c1 : index\n    cf.br ^bb15(%37 : index)\n  ^bb32:  // pred: ^bb15\n    %38 = arith.addi %13, %c1 : index\n    cf.br ^bb13(%38 : index)\n  ^bb33:  // pred: ^bb13\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb34(%c0 : index)\n  ^bb34(%39: index):  // 2 preds: ^bb33, ^bb44\n    %40 = arith.cmpi slt, %39, %c1 : index\n    cf.cond_br %40, ^bb35, ^bb45\n  ^bb35:  // pred: ^bb34\n    cf.br ^bb36(%c0 : index)\n  ^bb36(%41: index):  // 2 preds: ^bb35, ^bb43\n    %42 = arith.cmpi slt, %41, %c2 : index\n    cf.cond_br %42, ^bb37, ^bb44\n  ^bb37:  // pred: ^bb36\n    cf.br ^bb38(%c0 : index)\n  ^bb38(%43: index):  // 2 preds: ^bb37, ^bb42\n    %44 = arith.cmpi slt, %43, %c2 : index\n    cf.cond_br %44, ^bb39, ^bb43\n  ^bb39:  // pred: ^bb38\n    cf.br ^bb40(%c0 : index)\n  ^bb40(%45: index):  // 2 preds: ^bb39, ^bb41\n    %46 = arith.cmpi slt, %45, %c1 : index\n    cf.cond_br %46, ^bb41, ^bb42\n  ^bb41:  // pred: ^bb40\n    %47 = memref.load %alloc[%39, %41, %43, %45] : memref<1x2x2x1xf32>\n    %48 = arith.addf %47, %cst : f32\n    memref.store %48, %alloc_1[%39, %41, %43, %45] : memref<1x2x2x1xf32>\n    %49 = arith.addi %45, %c1 : index\n    cf.br ^bb40(%49 : index)\n  ^bb42:  // pred: ^bb40\n    %50 = arith.addi %43, %c1 : index\n    cf.br ^bb38(%50 : index)\n  ^bb43:  // pred: ^bb38\n    %51 = arith.addi %41, %c1 : index\n    cf.br ^bb36(%51 : index)\n  ^bb44:  // pred: ^bb36\n    %52 = arith.addi %39, %c1 : index\n    cf.br ^bb34(%52 : index)\n  ^bb45:  // pred: ^bb34\n    %alloc_2 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb46(%c0 : index)\n  ^bb46(%53: index):  // 2 preds: ^bb45, ^bb56\n    %54 = arith.cmpi slt, %53, %c1 : index\n    cf.cond_br %54, ^bb47, ^bb57\n  ^bb47:  // pred: ^bb46\n    cf.br ^bb48(%c0 : index)\n  ^bb48(%55: index):  // 2 preds: ^bb47, ^bb55\n    %56 = arith.cmpi slt, %55, %c2 : index\n    cf.cond_br %56, ^bb49, ^bb56\n  ^bb49:  // pred: ^bb48\n    cf.br ^bb50(%c0 : index)\n  ^bb50(%57: index):  // 2 preds: ^bb49, ^bb54\n    %58 = arith.cmpi slt, %57, %c2 : index\n    cf.cond_br %58, ^bb51, ^bb55\n  ^bb51:  // pred: ^bb50\n    cf.br ^bb52(%c0 : index)\n  ^bb52(%59: index):  // 2 preds: ^bb51, ^bb53\n    %60 = arith.cmpi slt, %59, %c1 : index\n    cf.cond_br %60, ^bb53, ^bb54\n  ^bb53:  // pred: ^bb52\n    %61 = memref.load %alloc_1[%53, %55, %57, %59] : memref<1x2x2x1xf32>\n    %62 = arith.maximumf %61, %cst_0 : f32\n    memref.store %62, %alloc_2[%53, %55, %57, %59] : memref<1x2x2x1xf32>\n    %63 = arith.addi %59, %c1 : index\n    cf.br ^bb52(%63 : index)\n  ^bb54:  // pred: ^bb52\n    %64 = arith.addi %57, %c1 : index\n    cf.br ^bb50(%64 : index)\n  ^bb55:  // pred: ^bb50\n    %65 = arith.addi %55, %c1 : index\n    cf.br ^bb48(%65 : index)\n  ^bb56:  // pred: ^bb48\n    %66 = arith.addi %53, %c1 : index\n    cf.br ^bb46(%66 : index)\n  ^bb57:  // pred: ^bb46\n    %cast = memref.cast %alloc_2 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    memref.dealloc %alloc : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_1 : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_2 : memref<1x2x2x1xf32>\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-14-loweraffinepass",
      "kind": "pass-event",
      "title": "LowerAffinePass (lower-affine)",
      "pass": "LowerAffinePass (lower-affine)",
      "index": 14,
      "changed": true,
      "before": "nano-ir-12-scftocontrolflowpass",
      "after": "nano-ir-14-loweraffinepass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-15-arithtollvmconversionpass",
      "kind": "ir-snapshot",
      "title": "IR after ArithToLLVMConversionPass (convert-arith-to-llvm)",
      "stage": "llvm",
      "text": "module {\n  memref.global \"private\" constant @__constant_1x2x2x1xf32 : memref<1x2x2x1xf32> = dense<-6.000000e+01> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_3x3x1x1xf32 : memref<3x3x1x1xf32> = dense<1.000000e+00> {alignment = 64 : i64}\n  memref.global \"private\" constant @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32> = dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> {alignment = 64 : i64}\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %0 = llvm.mlir.constant(-6.000000e+01 : f32) : f32\n    %1 = llvm.mlir.constant(3 : index) : i64\n    %2 = llvm.mlir.constant(2 : index) : i64\n    %3 = llvm.mlir.constant(1 : index) : i64\n    %4 = llvm.mlir.constant(0 : index) : i64\n    %5 = builtin.unrealized_conversion_cast %4 : i64 to index\n    %6 = llvm.mlir.constant(0.000000e+00 : f32) : f32\n    %7 = memref.get_global @__constant_1x4x4x1xf32 : memref<1x4x4x1xf32>\n    %alloc = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb1(%5 : index)\n  ^bb1(%8: index):  // 2 preds: ^bb0, ^bb11\n    %9 = builtin.unrealized_conversion_cast %8 : index to i64\n    %10 = llvm.icmp \"slt\" %9, %3 : i64\n    cf.cond_br %10, ^bb2, ^bb12\n  ^bb2:  // pred: ^bb1\n    cf.br ^bb3(%5 : index)\n  ^bb3(%11: index):  // 2 preds: ^bb2, ^bb10\n    %12 = builtin.unrealized_conversion_cast %11 : index to i64\n    %13 = llvm.icmp \"slt\" %12, %2 : i64\n    cf.cond_br %13, ^bb4, ^bb11\n  ^bb4:  // pred: ^bb3\n    cf.br ^bb5(%5 : index)\n  ^bb5(%14: index):  // 2 preds: ^bb4, ^bb9\n    %15 = builtin.unrealized_conversion_cast %14 : index to i64\n    %16 = llvm.icmp \"slt\" %15, %2 : i64\n    cf.cond_br %16, ^bb6, ^bb10\n  ^bb6:  // pred: ^bb5\n    cf.br ^bb7(%5 : index)\n  ^bb7(%17: index):  // 2 preds: ^bb6, ^bb8\n    %18 = builtin.unrealized_conversion_cast %17 : index to i64\n    %19 = llvm.icmp \"slt\" %18, %3 : i64\n    cf.cond_br %19, ^bb8, ^bb9\n  ^bb8:  // pred: ^bb7\n    memref.store %6, %alloc[%8, %11, %14, %17] : memref<1x2x2x1xf32>\n    %20 = llvm.add %18, %3 : i64\n    %21 = builtin.unrealized_conversion_cast %20 : i64 to index\n    cf.br ^bb7(%21 : index)\n  ^bb9:  // pred: ^bb7\n    %22 = llvm.add %15, %3 : i64\n    %23 = builtin.unrealized_conversion_cast %22 : i64 to index\n    cf.br ^bb5(%23 : index)\n  ^bb10:  // pred: ^bb5\n    %24 = llvm.add %12, %3 : i64\n    %25 = builtin.unrealized_conversion_cast %24 : i64 to index\n    cf.br ^bb3(%25 : index)\n  ^bb11:  // pred: ^bb3\n    %26 = llvm.add %9, %3 : i64\n    %27 = builtin.unrealized_conversion_cast %26 : i64 to index\n    cf.br ^bb1(%27 : index)\n  ^bb12:  // pred: ^bb1\n    cf.br ^bb13(%5 : index)\n  ^bb13(%28: index):  // 2 preds: ^bb12, ^bb32\n    %29 = builtin.unrealized_conversion_cast %28 : index to i64\n    %30 = llvm.icmp \"slt\" %29, %3 : i64\n    cf.cond_br %30, ^bb14, ^bb33\n  ^bb14:  // pred: ^bb13\n    cf.br ^bb15(%5 : index)\n  ^bb15(%31: index):  // 2 preds: ^bb14, ^bb31\n    %32 = builtin.unrealized_conversion_cast %31 : index to i64\n    %33 = llvm.icmp \"slt\" %32, %2 : i64\n    cf.cond_br %33, ^bb16, ^bb32\n  ^bb16:  // pred: ^bb15\n    cf.br ^bb17(%5 : index)\n  ^bb17(%34: index):  // 2 preds: ^bb16, ^bb30\n    %35 = builtin.unrealized_conversion_cast %34 : index to i64\n    %36 = llvm.icmp \"slt\" %35, %2 : i64\n    cf.cond_br %36, ^bb18, ^bb31\n  ^bb18:  // pred: ^bb17\n    cf.br ^bb19(%5 : index)\n  ^bb19(%37: index):  // 2 preds: ^bb18, ^bb29\n    %38 = builtin.unrealized_conversion_cast %37 : index to i64\n    %39 = llvm.icmp \"slt\" %38, %3 : i64\n    cf.cond_br %39, ^bb20, ^bb30\n  ^bb20:  // pred: ^bb19\n    cf.br ^bb21(%5 : index)\n  ^bb21(%40: index):  // 2 preds: ^bb20, ^bb28\n    %41 = builtin.unrealized_conversion_cast %40 : index to i64\n    %42 = llvm.icmp \"slt\" %41, %1 : i64\n    cf.cond_br %42, ^bb22, ^bb29\n  ^bb22:  // pred: ^bb21\n    cf.br ^bb23(%5 : index)\n  ^bb23(%43: index):  // 2 preds: ^bb22, ^bb27\n    %44 = builtin.unrealized_conversion_cast %43 : index to i64\n    %45 = llvm.icmp \"slt\" %44, %1 : i64\n    cf.cond_br %45, ^bb24, ^bb28\n  ^bb24:  // pred: ^bb23\n    cf.br ^bb25(%5 : index)\n  ^bb25(%46: index):  // 2 preds: ^bb24, ^bb26\n    %47 = builtin.unrealized_conversion_cast %46 : index to i64\n    %48 = llvm.icmp \"slt\" %47, %3 : i64\n    cf.cond_br %48, ^bb26, ^bb27\n  ^bb26:  // pred: ^bb25\n    %49 = llvm.add %32, %41 : i64\n    %50 = builtin.unrealized_conversion_cast %49 : i64 to index\n    %51 = llvm.add %35, %44 : i64\n    %52 = builtin.unrealized_conversion_cast %51 : i64 to index\n    %53 = memref.load %7[%28, %50, %52, %46] : memref<1x4x4x1xf32>\n    %54 = memref.load %alloc[%28, %31, %34, %37] : memref<1x2x2x1xf32>\n    %55 = llvm.fadd %54, %53 : f32\n    memref.store %55, %alloc[%28, %31, %34, %37] : memref<1x2x2x1xf32>\n    %56 = llvm.add %47, %3 : i64\n    %57 = builtin.unrealized_conversion_cast %56 : i64 to index\n    cf.br ^bb25(%57 : index)\n  ^bb27:  // pred: ^bb25\n    %58 = llvm.add %44, %3 : i64\n    %59 = builtin.unrealized_conversion_cast %58 : i64 to index\n    cf.br ^bb23(%59 : index)\n  ^bb28:  // pred: ^bb23\n    %60 = llvm.add %41, %3 : i64\n    %61 = builtin.unrealized_conversion_cast %60 : i64 to index\n    cf.br ^bb21(%61 : index)\n  ^bb29:  // pred: ^bb21\n    %62 = llvm.add %38, %3 : i64\n    %63 = builtin.unrealized_conversion_cast %62 : i64 to index\n    cf.br ^bb19(%63 : index)\n  ^bb30:  // pred: ^bb19\n    %64 = llvm.add %35, %3 : i64\n    %65 = builtin.unrealized_conversion_cast %64 : i64 to index\n    cf.br ^bb17(%65 : index)\n  ^bb31:  // pred: ^bb17\n    %66 = llvm.add %32, %3 : i64\n    %67 = builtin.unrealized_conversion_cast %66 : i64 to index\n    cf.br ^bb15(%67 : index)\n  ^bb32:  // pred: ^bb15\n    %68 = llvm.add %29, %3 : i64\n    %69 = builtin.unrealized_conversion_cast %68 : i64 to index\n    cf.br ^bb13(%69 : index)\n  ^bb33:  // pred: ^bb13\n    %alloc_0 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb34(%5 : index)\n  ^bb34(%70: index):  // 2 preds: ^bb33, ^bb44\n    %71 = builtin.unrealized_conversion_cast %70 : index to i64\n    %72 = llvm.icmp \"slt\" %71, %3 : i64\n    cf.cond_br %72, ^bb35, ^bb45\n  ^bb35:  // pred: ^bb34\n    cf.br ^bb36(%5 : index)\n  ^bb36(%73: index):  // 2 preds: ^bb35, ^bb43\n    %74 = builtin.unrealized_conversion_cast %73 : index to i64\n    %75 = llvm.icmp \"slt\" %74, %2 : i64\n    cf.cond_br %75, ^bb37, ^bb44\n  ^bb37:  // pred: ^bb36\n    cf.br ^bb38(%5 : index)\n  ^bb38(%76: index):  // 2 preds: ^bb37, ^bb42\n    %77 = builtin.unrealized_conversion_cast %76 : index to i64\n    %78 = llvm.icmp \"slt\" %77, %2 : i64\n    cf.cond_br %78, ^bb39, ^bb43\n  ^bb39:  // pred: ^bb38\n    cf.br ^bb40(%5 : index)\n  ^bb40(%79: index):  // 2 preds: ^bb39, ^bb41\n    %80 = builtin.unrealized_conversion_cast %79 : index to i64\n    %81 = llvm.icmp \"slt\" %80, %3 : i64\n    cf.cond_br %81, ^bb41, ^bb42\n  ^bb41:  // pred: ^bb40\n    %82 = memref.load %alloc[%70, %73, %76, %79] : memref<1x2x2x1xf32>\n    %83 = llvm.fadd %82, %0 : f32\n    memref.store %83, %alloc_0[%70, %73, %76, %79] : memref<1x2x2x1xf32>\n    %84 = llvm.add %80, %3 : i64\n    %85 = builtin.unrealized_conversion_cast %84 : i64 to index\n    cf.br ^bb40(%85 : index)\n  ^bb42:  // pred: ^bb40\n    %86 = llvm.add %77, %3 : i64\n    %87 = builtin.unrealized_conversion_cast %86 : i64 to index\n    cf.br ^bb38(%87 : index)\n  ^bb43:  // pred: ^bb38\n    %88 = llvm.add %74, %3 : i64\n    %89 = builtin.unrealized_conversion_cast %88 : i64 to index\n    cf.br ^bb36(%89 : index)\n  ^bb44:  // pred: ^bb36\n    %90 = llvm.add %71, %3 : i64\n    %91 = builtin.unrealized_conversion_cast %90 : i64 to index\n    cf.br ^bb34(%91 : index)\n  ^bb45:  // pred: ^bb34\n    %alloc_1 = memref.alloc() {alignment = 64 : i64} : memref<1x2x2x1xf32>\n    cf.br ^bb46(%5 : index)\n  ^bb46(%92: index):  // 2 preds: ^bb45, ^bb56\n    %93 = builtin.unrealized_conversion_cast %92 : index to i64\n    %94 = llvm.icmp \"slt\" %93, %3 : i64\n    cf.cond_br %94, ^bb47, ^bb57\n  ^bb47:  // pred: ^bb46\n    cf.br ^bb48(%5 : index)\n  ^bb48(%95: index):  // 2 preds: ^bb47, ^bb55\n    %96 = builtin.unrealized_conversion_cast %95 : index to i64\n    %97 = llvm.icmp \"slt\" %96, %2 : i64\n    cf.cond_br %97, ^bb49, ^bb56\n  ^bb49:  // pred: ^bb48\n    cf.br ^bb50(%5 : index)\n  ^bb50(%98: index):  // 2 preds: ^bb49, ^bb54\n    %99 = builtin.unrealized_conversion_cast %98 : index to i64\n    %100 = llvm.icmp \"slt\" %99, %2 : i64\n    cf.cond_br %100, ^bb51, ^bb55\n  ^bb51:  // pred: ^bb50\n    cf.br ^bb52(%5 : index)\n  ^bb52(%101: index):  // 2 preds: ^bb51, ^bb53\n    %102 = builtin.unrealized_conversion_cast %101 : index to i64\n    %103 = llvm.icmp \"slt\" %102, %3 : i64\n    cf.cond_br %103, ^bb53, ^bb54\n  ^bb53:  // pred: ^bb52\n    %104 = memref.load %alloc_0[%92, %95, %98, %101] : memref<1x2x2x1xf32>\n    %105 = llvm.intr.maximum(%104, %6) : (f32, f32) -> f32\n    memref.store %105, %alloc_1[%92, %95, %98, %101] : memref<1x2x2x1xf32>\n    %106 = llvm.add %102, %3 : i64\n    %107 = builtin.unrealized_conversion_cast %106 : i64 to index\n    cf.br ^bb52(%107 : index)\n  ^bb54:  // pred: ^bb52\n    %108 = llvm.add %99, %3 : i64\n    %109 = builtin.unrealized_conversion_cast %108 : i64 to index\n    cf.br ^bb50(%109 : index)\n  ^bb55:  // pred: ^bb50\n    %110 = llvm.add %96, %3 : i64\n    %111 = builtin.unrealized_conversion_cast %110 : i64 to index\n    cf.br ^bb48(%111 : index)\n  ^bb56:  // pred: ^bb48\n    %112 = llvm.add %93, %3 : i64\n    %113 = builtin.unrealized_conversion_cast %112 : i64 to index\n    cf.br ^bb46(%113 : index)\n  ^bb57:  // pred: ^bb46\n    %cast = memref.cast %alloc_1 : memref<1x2x2x1xf32> to memref<*xf32>\n    call @printMemrefF32(%cast) : (memref<*xf32>) -> ()\n    memref.dealloc %alloc : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_0 : memref<1x2x2x1xf32>\n    memref.dealloc %alloc_1 : memref<1x2x2x1xf32>\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-15-arithtollvmconversionpass",
      "kind": "pass-event",
      "title": "ArithToLLVMConversionPass (convert-arith-to-llvm)",
      "pass": "ArithToLLVMConversionPass (convert-arith-to-llvm)",
      "index": 15,
      "changed": true,
      "before": "nano-ir-14-loweraffinepass",
      "after": "nano-ir-15-arithtollvmconversionpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-16-finalizememreftollvmconversionpass",
      "kind": "ir-snapshot",
      "title": "IR after FinalizeMemRefToLLVMConversionPass (finalize-memref-to-llvm)",
      "stage": "llvm",
      "text": "module {\n  llvm.func @free(!llvm.ptr)\n  llvm.func @malloc(i64) -> !llvm.ptr\n  llvm.mlir.global private constant @__constant_1x2x2x1xf32(dense<-6.000000e+01> : tensor<1x2x2x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<2 x array<2 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_3x3x1x1xf32(dense<1.000000e+00> : tensor<3x3x1x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<3 x array<3 x array<1 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_1x4x4x1xf32(dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> : tensor<1x4x4x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n  func.func private @printMemrefF32(memref<*xf32>)\n  func.func @main() {\n    %0 = llvm.mlir.constant(-6.000000e+01 : f32) : f32\n    %1 = llvm.mlir.constant(3 : index) : i64\n    %2 = llvm.mlir.constant(2 : index) : i64\n    %3 = llvm.mlir.constant(1 : index) : i64\n    %4 = llvm.mlir.constant(0 : index) : i64\n    %5 = builtin.unrealized_conversion_cast %4 : i64 to index\n    %6 = llvm.mlir.constant(0.000000e+00 : f32) : f32\n    %7 = llvm.mlir.constant(1 : index) : i64\n    %8 = llvm.mlir.constant(4 : index) : i64\n    %9 = llvm.mlir.constant(4 : index) : i64\n    %10 = llvm.mlir.constant(1 : index) : i64\n    %11 = llvm.mlir.constant(1 : index) : i64\n    %12 = llvm.mlir.constant(16 : index) : i64\n    %13 = llvm.mlir.constant(16 : index) : i64\n    %14 = llvm.mlir.zero : !llvm.ptr\n    %15 = llvm.getelementptr %14[%13] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %16 = llvm.ptrtoint %15 : !llvm.ptr to i64\n    %17 = llvm.mlir.addressof @__constant_1x4x4x1xf32 : !llvm.ptr\n    %18 = llvm.getelementptr %17[0, 0, 0, 0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n    %19 = llvm.mlir.constant(3735928559 : index) : i64\n    %20 = llvm.inttoptr %19 : i64 to !llvm.ptr\n    %21 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %22 = llvm.insertvalue %20, %21[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %23 = llvm.insertvalue %18, %22[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %24 = llvm.mlir.constant(0 : index) : i64\n    %25 = llvm.insertvalue %24, %23[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %26 = llvm.insertvalue %7, %25[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %27 = llvm.insertvalue %8, %26[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %28 = llvm.insertvalue %9, %27[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %29 = llvm.insertvalue %10, %28[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %30 = llvm.insertvalue %12, %29[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %31 = llvm.insertvalue %9, %30[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %32 = llvm.insertvalue %10, %31[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %33 = llvm.insertvalue %11, %32[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %34 = llvm.mlir.constant(1 : index) : i64\n    %35 = llvm.mlir.constant(2 : index) : i64\n    %36 = llvm.mlir.constant(2 : index) : i64\n    %37 = llvm.mlir.constant(1 : index) : i64\n    %38 = llvm.mlir.constant(1 : index) : i64\n    %39 = llvm.mlir.constant(4 : index) : i64\n    %40 = llvm.mlir.constant(4 : index) : i64\n    %41 = llvm.mlir.zero : !llvm.ptr\n    %42 = llvm.getelementptr %41[%40] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %43 = llvm.ptrtoint %42 : !llvm.ptr to i64\n    %44 = llvm.mlir.constant(64 : index) : i64\n    %45 = llvm.add %43, %44 : i64\n    %46 = llvm.call @malloc(%45) : (i64) -> !llvm.ptr\n    %47 = llvm.ptrtoint %46 : !llvm.ptr to i64\n    %48 = llvm.mlir.constant(1 : index) : i64\n    %49 = llvm.sub %44, %48 : i64\n    %50 = llvm.add %47, %49 : i64\n    %51 = llvm.urem %50, %44 : i64\n    %52 = llvm.sub %50, %51 : i64\n    %53 = llvm.inttoptr %52 : i64 to !llvm.ptr\n    %54 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %55 = llvm.insertvalue %46, %54[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %56 = llvm.insertvalue %53, %55[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %57 = llvm.mlir.constant(0 : index) : i64\n    %58 = llvm.insertvalue %57, %56[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %59 = llvm.insertvalue %34, %58[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %60 = llvm.insertvalue %35, %59[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %61 = llvm.insertvalue %36, %60[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %62 = llvm.insertvalue %37, %61[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %63 = llvm.insertvalue %39, %62[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %64 = llvm.insertvalue %36, %63[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %65 = llvm.insertvalue %37, %64[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %66 = llvm.insertvalue %38, %65[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    cf.br ^bb1(%5 : index)\n  ^bb1(%67: index):  // 2 preds: ^bb0, ^bb11\n    %68 = builtin.unrealized_conversion_cast %67 : index to i64\n    %69 = builtin.unrealized_conversion_cast %67 : index to i64\n    %70 = llvm.icmp \"slt\" %69, %3 : i64\n    cf.cond_br %70, ^bb2, ^bb12\n  ^bb2:  // pred: ^bb1\n    cf.br ^bb3(%5 : index)\n  ^bb3(%71: index):  // 2 preds: ^bb2, ^bb10\n    %72 = builtin.unrealized_conversion_cast %71 : index to i64\n    %73 = builtin.unrealized_conversion_cast %71 : index to i64\n    %74 = llvm.icmp \"slt\" %73, %2 : i64\n    cf.cond_br %74, ^bb4, ^bb11\n  ^bb4:  // pred: ^bb3\n    cf.br ^bb5(%5 : index)\n  ^bb5(%75: index):  // 2 preds: ^bb4, ^bb9\n    %76 = builtin.unrealized_conversion_cast %75 : index to i64\n    %77 = builtin.unrealized_conversion_cast %75 : index to i64\n    %78 = llvm.icmp \"slt\" %77, %2 : i64\n    cf.cond_br %78, ^bb6, ^bb10\n  ^bb6:  // pred: ^bb5\n    cf.br ^bb7(%5 : index)\n  ^bb7(%79: index):  // 2 preds: ^bb6, ^bb8\n    %80 = builtin.unrealized_conversion_cast %79 : index to i64\n    %81 = builtin.unrealized_conversion_cast %79 : index to i64\n    %82 = llvm.icmp \"slt\" %81, %3 : i64\n    cf.cond_br %82, ^bb8, ^bb9\n  ^bb8:  // pred: ^bb7\n    %83 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %84 = llvm.mlir.constant(4 : index) : i64\n    %85 = llvm.mul %68, %84 overflow<nsw, nuw> : i64\n    %86 = llvm.mlir.constant(2 : index) : i64\n    %87 = llvm.mul %72, %86 overflow<nsw, nuw> : i64\n    %88 = llvm.add %85, %87 overflow<nsw, nuw> : i64\n    %89 = llvm.add %88, %76 overflow<nsw, nuw> : i64\n    %90 = llvm.add %89, %80 overflow<nsw, nuw> : i64\n    %91 = llvm.getelementptr inbounds|nuw %83[%90] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %6, %91 : f32, !llvm.ptr\n    %92 = llvm.add %81, %3 : i64\n    %93 = builtin.unrealized_conversion_cast %92 : i64 to index\n    cf.br ^bb7(%93 : index)\n  ^bb9:  // pred: ^bb7\n    %94 = llvm.add %77, %3 : i64\n    %95 = builtin.unrealized_conversion_cast %94 : i64 to index\n    cf.br ^bb5(%95 : index)\n  ^bb10:  // pred: ^bb5\n    %96 = llvm.add %73, %3 : i64\n    %97 = builtin.unrealized_conversion_cast %96 : i64 to index\n    cf.br ^bb3(%97 : index)\n  ^bb11:  // pred: ^bb3\n    %98 = llvm.add %69, %3 : i64\n    %99 = builtin.unrealized_conversion_cast %98 : i64 to index\n    cf.br ^bb1(%99 : index)\n  ^bb12:  // pred: ^bb1\n    cf.br ^bb13(%5 : index)\n  ^bb13(%100: index):  // 2 preds: ^bb12, ^bb32\n    %101 = builtin.unrealized_conversion_cast %100 : index to i64\n    %102 = builtin.unrealized_conversion_cast %100 : index to i64\n    %103 = llvm.icmp \"slt\" %102, %3 : i64\n    cf.cond_br %103, ^bb14, ^bb33\n  ^bb14:  // pred: ^bb13\n    cf.br ^bb15(%5 : index)\n  ^bb15(%104: index):  // 2 preds: ^bb14, ^bb31\n    %105 = builtin.unrealized_conversion_cast %104 : index to i64\n    %106 = builtin.unrealized_conversion_cast %104 : index to i64\n    %107 = llvm.icmp \"slt\" %106, %2 : i64\n    cf.cond_br %107, ^bb16, ^bb32\n  ^bb16:  // pred: ^bb15\n    cf.br ^bb17(%5 : index)\n  ^bb17(%108: index):  // 2 preds: ^bb16, ^bb30\n    %109 = builtin.unrealized_conversion_cast %108 : index to i64\n    %110 = builtin.unrealized_conversion_cast %108 : index to i64\n    %111 = llvm.icmp \"slt\" %110, %2 : i64\n    cf.cond_br %111, ^bb18, ^bb31\n  ^bb18:  // pred: ^bb17\n    cf.br ^bb19(%5 : index)\n  ^bb19(%112: index):  // 2 preds: ^bb18, ^bb29\n    %113 = builtin.unrealized_conversion_cast %112 : index to i64\n    %114 = builtin.unrealized_conversion_cast %112 : index to i64\n    %115 = llvm.icmp \"slt\" %114, %3 : i64\n    cf.cond_br %115, ^bb20, ^bb30\n  ^bb20:  // pred: ^bb19\n    cf.br ^bb21(%5 : index)\n  ^bb21(%116: index):  // 2 preds: ^bb20, ^bb28\n    %117 = builtin.unrealized_conversion_cast %116 : index to i64\n    %118 = llvm.icmp \"slt\" %117, %1 : i64\n    cf.cond_br %118, ^bb22, ^bb29\n  ^bb22:  // pred: ^bb21\n    cf.br ^bb23(%5 : index)\n  ^bb23(%119: index):  // 2 preds: ^bb22, ^bb27\n    %120 = builtin.unrealized_conversion_cast %119 : index to i64\n    %121 = llvm.icmp \"slt\" %120, %1 : i64\n    cf.cond_br %121, ^bb24, ^bb28\n  ^bb24:  // pred: ^bb23\n    cf.br ^bb25(%5 : index)\n  ^bb25(%122: index):  // 2 preds: ^bb24, ^bb26\n    %123 = builtin.unrealized_conversion_cast %122 : index to i64\n    %124 = builtin.unrealized_conversion_cast %122 : index to i64\n    %125 = llvm.icmp \"slt\" %124, %3 : i64\n    cf.cond_br %125, ^bb26, ^bb27\n  ^bb26:  // pred: ^bb25\n    %126 = llvm.add %106, %117 : i64\n    %127 = builtin.unrealized_conversion_cast %126 : i64 to index\n    %128 = llvm.add %110, %120 : i64\n    %129 = builtin.unrealized_conversion_cast %128 : i64 to index\n    %130 = llvm.extractvalue %33[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %131 = llvm.mlir.constant(16 : index) : i64\n    %132 = llvm.mul %101, %131 overflow<nsw, nuw> : i64\n    %133 = llvm.mlir.constant(4 : index) : i64\n    %134 = llvm.mul %126, %133 overflow<nsw, nuw> : i64\n    %135 = llvm.add %132, %134 overflow<nsw, nuw> : i64\n    %136 = llvm.add %135, %128 overflow<nsw, nuw> : i64\n    %137 = llvm.add %136, %123 overflow<nsw, nuw> : i64\n    %138 = llvm.getelementptr inbounds|nuw %130[%137] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %139 = llvm.load %138 : !llvm.ptr -> f32\n    %140 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %141 = llvm.mlir.constant(4 : index) : i64\n    %142 = llvm.mul %101, %141 overflow<nsw, nuw> : i64\n    %143 = llvm.mlir.constant(2 : index) : i64\n    %144 = llvm.mul %105, %143 overflow<nsw, nuw> : i64\n    %145 = llvm.add %142, %144 overflow<nsw, nuw> : i64\n    %146 = llvm.add %145, %109 overflow<nsw, nuw> : i64\n    %147 = llvm.add %146, %113 overflow<nsw, nuw> : i64\n    %148 = llvm.getelementptr inbounds|nuw %140[%147] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %149 = llvm.load %148 : !llvm.ptr -> f32\n    %150 = llvm.fadd %149, %139 : f32\n    %151 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %152 = llvm.mlir.constant(4 : index) : i64\n    %153 = llvm.mul %101, %152 overflow<nsw, nuw> : i64\n    %154 = llvm.mlir.constant(2 : index) : i64\n    %155 = llvm.mul %105, %154 overflow<nsw, nuw> : i64\n    %156 = llvm.add %153, %155 overflow<nsw, nuw> : i64\n    %157 = llvm.add %156, %109 overflow<nsw, nuw> : i64\n    %158 = llvm.add %157, %113 overflow<nsw, nuw> : i64\n    %159 = llvm.getelementptr inbounds|nuw %151[%158] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %150, %159 : f32, !llvm.ptr\n    %160 = llvm.add %124, %3 : i64\n    %161 = builtin.unrealized_conversion_cast %160 : i64 to index\n    cf.br ^bb25(%161 : index)\n  ^bb27:  // pred: ^bb25\n    %162 = llvm.add %120, %3 : i64\n    %163 = builtin.unrealized_conversion_cast %162 : i64 to index\n    cf.br ^bb23(%163 : index)\n  ^bb28:  // pred: ^bb23\n    %164 = llvm.add %117, %3 : i64\n    %165 = builtin.unrealized_conversion_cast %164 : i64 to index\n    cf.br ^bb21(%165 : index)\n  ^bb29:  // pred: ^bb21\n    %166 = llvm.add %114, %3 : i64\n    %167 = builtin.unrealized_conversion_cast %166 : i64 to index\n    cf.br ^bb19(%167 : index)\n  ^bb30:  // pred: ^bb19\n    %168 = llvm.add %110, %3 : i64\n    %169 = builtin.unrealized_conversion_cast %168 : i64 to index\n    cf.br ^bb17(%169 : index)\n  ^bb31:  // pred: ^bb17\n    %170 = llvm.add %106, %3 : i64\n    %171 = builtin.unrealized_conversion_cast %170 : i64 to index\n    cf.br ^bb15(%171 : index)\n  ^bb32:  // pred: ^bb15\n    %172 = llvm.add %102, %3 : i64\n    %173 = builtin.unrealized_conversion_cast %172 : i64 to index\n    cf.br ^bb13(%173 : index)\n  ^bb33:  // pred: ^bb13\n    %174 = llvm.mlir.constant(1 : index) : i64\n    %175 = llvm.mlir.constant(2 : index) : i64\n    %176 = llvm.mlir.constant(2 : index) : i64\n    %177 = llvm.mlir.constant(1 : index) : i64\n    %178 = llvm.mlir.constant(1 : index) : i64\n    %179 = llvm.mlir.constant(4 : index) : i64\n    %180 = llvm.mlir.constant(4 : index) : i64\n    %181 = llvm.mlir.zero : !llvm.ptr\n    %182 = llvm.getelementptr %181[%180] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %183 = llvm.ptrtoint %182 : !llvm.ptr to i64\n    %184 = llvm.mlir.constant(64 : index) : i64\n    %185 = llvm.add %183, %184 : i64\n    %186 = llvm.call @malloc(%185) : (i64) -> !llvm.ptr\n    %187 = llvm.ptrtoint %186 : !llvm.ptr to i64\n    %188 = llvm.mlir.constant(1 : index) : i64\n    %189 = llvm.sub %184, %188 : i64\n    %190 = llvm.add %187, %189 : i64\n    %191 = llvm.urem %190, %184 : i64\n    %192 = llvm.sub %190, %191 : i64\n    %193 = llvm.inttoptr %192 : i64 to !llvm.ptr\n    %194 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %195 = llvm.insertvalue %186, %194[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %196 = llvm.insertvalue %193, %195[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %197 = llvm.mlir.constant(0 : index) : i64\n    %198 = llvm.insertvalue %197, %196[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %199 = llvm.insertvalue %174, %198[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %200 = llvm.insertvalue %175, %199[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %201 = llvm.insertvalue %176, %200[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %202 = llvm.insertvalue %177, %201[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %203 = llvm.insertvalue %179, %202[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %204 = llvm.insertvalue %176, %203[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %205 = llvm.insertvalue %177, %204[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %206 = llvm.insertvalue %178, %205[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    cf.br ^bb34(%5 : index)\n  ^bb34(%207: index):  // 2 preds: ^bb33, ^bb44\n    %208 = builtin.unrealized_conversion_cast %207 : index to i64\n    %209 = builtin.unrealized_conversion_cast %207 : index to i64\n    %210 = llvm.icmp \"slt\" %209, %3 : i64\n    cf.cond_br %210, ^bb35, ^bb45\n  ^bb35:  // pred: ^bb34\n    cf.br ^bb36(%5 : index)\n  ^bb36(%211: index):  // 2 preds: ^bb35, ^bb43\n    %212 = builtin.unrealized_conversion_cast %211 : index to i64\n    %213 = builtin.unrealized_conversion_cast %211 : index to i64\n    %214 = llvm.icmp \"slt\" %213, %2 : i64\n    cf.cond_br %214, ^bb37, ^bb44\n  ^bb37:  // pred: ^bb36\n    cf.br ^bb38(%5 : index)\n  ^bb38(%215: index):  // 2 preds: ^bb37, ^bb42\n    %216 = builtin.unrealized_conversion_cast %215 : index to i64\n    %217 = builtin.unrealized_conversion_cast %215 : index to i64\n    %218 = llvm.icmp \"slt\" %217, %2 : i64\n    cf.cond_br %218, ^bb39, ^bb43\n  ^bb39:  // pred: ^bb38\n    cf.br ^bb40(%5 : index)\n  ^bb40(%219: index):  // 2 preds: ^bb39, ^bb41\n    %220 = builtin.unrealized_conversion_cast %219 : index to i64\n    %221 = builtin.unrealized_conversion_cast %219 : index to i64\n    %222 = llvm.icmp \"slt\" %221, %3 : i64\n    cf.cond_br %222, ^bb41, ^bb42\n  ^bb41:  // pred: ^bb40\n    %223 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %224 = llvm.mlir.constant(4 : index) : i64\n    %225 = llvm.mul %208, %224 overflow<nsw, nuw> : i64\n    %226 = llvm.mlir.constant(2 : index) : i64\n    %227 = llvm.mul %212, %226 overflow<nsw, nuw> : i64\n    %228 = llvm.add %225, %227 overflow<nsw, nuw> : i64\n    %229 = llvm.add %228, %216 overflow<nsw, nuw> : i64\n    %230 = llvm.add %229, %220 overflow<nsw, nuw> : i64\n    %231 = llvm.getelementptr inbounds|nuw %223[%230] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %232 = llvm.load %231 : !llvm.ptr -> f32\n    %233 = llvm.fadd %232, %0 : f32\n    %234 = llvm.extractvalue %206[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %235 = llvm.mlir.constant(4 : index) : i64\n    %236 = llvm.mul %208, %235 overflow<nsw, nuw> : i64\n    %237 = llvm.mlir.constant(2 : index) : i64\n    %238 = llvm.mul %212, %237 overflow<nsw, nuw> : i64\n    %239 = llvm.add %236, %238 overflow<nsw, nuw> : i64\n    %240 = llvm.add %239, %216 overflow<nsw, nuw> : i64\n    %241 = llvm.add %240, %220 overflow<nsw, nuw> : i64\n    %242 = llvm.getelementptr inbounds|nuw %234[%241] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %233, %242 : f32, !llvm.ptr\n    %243 = llvm.add %221, %3 : i64\n    %244 = builtin.unrealized_conversion_cast %243 : i64 to index\n    cf.br ^bb40(%244 : index)\n  ^bb42:  // pred: ^bb40\n    %245 = llvm.add %217, %3 : i64\n    %246 = builtin.unrealized_conversion_cast %245 : i64 to index\n    cf.br ^bb38(%246 : index)\n  ^bb43:  // pred: ^bb38\n    %247 = llvm.add %213, %3 : i64\n    %248 = builtin.unrealized_conversion_cast %247 : i64 to index\n    cf.br ^bb36(%248 : index)\n  ^bb44:  // pred: ^bb36\n    %249 = llvm.add %209, %3 : i64\n    %250 = builtin.unrealized_conversion_cast %249 : i64 to index\n    cf.br ^bb34(%250 : index)\n  ^bb45:  // pred: ^bb34\n    %251 = llvm.mlir.constant(1 : index) : i64\n    %252 = llvm.mlir.constant(2 : index) : i64\n    %253 = llvm.mlir.constant(2 : index) : i64\n    %254 = llvm.mlir.constant(1 : index) : i64\n    %255 = llvm.mlir.constant(1 : index) : i64\n    %256 = llvm.mlir.constant(4 : index) : i64\n    %257 = llvm.mlir.constant(4 : index) : i64\n    %258 = llvm.mlir.zero : !llvm.ptr\n    %259 = llvm.getelementptr %258[%257] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %260 = llvm.ptrtoint %259 : !llvm.ptr to i64\n    %261 = llvm.mlir.constant(64 : index) : i64\n    %262 = llvm.add %260, %261 : i64\n    %263 = llvm.call @malloc(%262) : (i64) -> !llvm.ptr\n    %264 = llvm.ptrtoint %263 : !llvm.ptr to i64\n    %265 = llvm.mlir.constant(1 : index) : i64\n    %266 = llvm.sub %261, %265 : i64\n    %267 = llvm.add %264, %266 : i64\n    %268 = llvm.urem %267, %261 : i64\n    %269 = llvm.sub %267, %268 : i64\n    %270 = llvm.inttoptr %269 : i64 to !llvm.ptr\n    %271 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %272 = llvm.insertvalue %263, %271[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %273 = llvm.insertvalue %270, %272[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %274 = llvm.mlir.constant(0 : index) : i64\n    %275 = llvm.insertvalue %274, %273[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %276 = llvm.insertvalue %251, %275[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %277 = llvm.insertvalue %252, %276[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %278 = llvm.insertvalue %253, %277[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %279 = llvm.insertvalue %254, %278[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %280 = llvm.insertvalue %256, %279[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %281 = llvm.insertvalue %253, %280[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %282 = llvm.insertvalue %254, %281[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %283 = llvm.insertvalue %255, %282[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    cf.br ^bb46(%5 : index)\n  ^bb46(%284: index):  // 2 preds: ^bb45, ^bb56\n    %285 = builtin.unrealized_conversion_cast %284 : index to i64\n    %286 = builtin.unrealized_conversion_cast %284 : index to i64\n    %287 = llvm.icmp \"slt\" %286, %3 : i64\n    cf.cond_br %287, ^bb47, ^bb57\n  ^bb47:  // pred: ^bb46\n    cf.br ^bb48(%5 : index)\n  ^bb48(%288: index):  // 2 preds: ^bb47, ^bb55\n    %289 = builtin.unrealized_conversion_cast %288 : index to i64\n    %290 = builtin.unrealized_conversion_cast %288 : index to i64\n    %291 = llvm.icmp \"slt\" %290, %2 : i64\n    cf.cond_br %291, ^bb49, ^bb56\n  ^bb49:  // pred: ^bb48\n    cf.br ^bb50(%5 : index)\n  ^bb50(%292: index):  // 2 preds: ^bb49, ^bb54\n    %293 = builtin.unrealized_conversion_cast %292 : index to i64\n    %294 = builtin.unrealized_conversion_cast %292 : index to i64\n    %295 = llvm.icmp \"slt\" %294, %2 : i64\n    cf.cond_br %295, ^bb51, ^bb55\n  ^bb51:  // pred: ^bb50\n    cf.br ^bb52(%5 : index)\n  ^bb52(%296: index):  // 2 preds: ^bb51, ^bb53\n    %297 = builtin.unrealized_conversion_cast %296 : index to i64\n    %298 = builtin.unrealized_conversion_cast %296 : index to i64\n    %299 = llvm.icmp \"slt\" %298, %3 : i64\n    cf.cond_br %299, ^bb53, ^bb54\n  ^bb53:  // pred: ^bb52\n    %300 = llvm.extractvalue %206[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %301 = llvm.mlir.constant(4 : index) : i64\n    %302 = llvm.mul %285, %301 overflow<nsw, nuw> : i64\n    %303 = llvm.mlir.constant(2 : index) : i64\n    %304 = llvm.mul %289, %303 overflow<nsw, nuw> : i64\n    %305 = llvm.add %302, %304 overflow<nsw, nuw> : i64\n    %306 = llvm.add %305, %293 overflow<nsw, nuw> : i64\n    %307 = llvm.add %306, %297 overflow<nsw, nuw> : i64\n    %308 = llvm.getelementptr inbounds|nuw %300[%307] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %309 = llvm.load %308 : !llvm.ptr -> f32\n    %310 = llvm.intr.maximum(%309, %6) : (f32, f32) -> f32\n    %311 = llvm.extractvalue %283[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %312 = llvm.mlir.constant(4 : index) : i64\n    %313 = llvm.mul %285, %312 overflow<nsw, nuw> : i64\n    %314 = llvm.mlir.constant(2 : index) : i64\n    %315 = llvm.mul %289, %314 overflow<nsw, nuw> : i64\n    %316 = llvm.add %313, %315 overflow<nsw, nuw> : i64\n    %317 = llvm.add %316, %293 overflow<nsw, nuw> : i64\n    %318 = llvm.add %317, %297 overflow<nsw, nuw> : i64\n    %319 = llvm.getelementptr inbounds|nuw %311[%318] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %310, %319 : f32, !llvm.ptr\n    %320 = llvm.add %298, %3 : i64\n    %321 = builtin.unrealized_conversion_cast %320 : i64 to index\n    cf.br ^bb52(%321 : index)\n  ^bb54:  // pred: ^bb52\n    %322 = llvm.add %294, %3 : i64\n    %323 = builtin.unrealized_conversion_cast %322 : i64 to index\n    cf.br ^bb50(%323 : index)\n  ^bb55:  // pred: ^bb50\n    %324 = llvm.add %290, %3 : i64\n    %325 = builtin.unrealized_conversion_cast %324 : i64 to index\n    cf.br ^bb48(%325 : index)\n  ^bb56:  // pred: ^bb48\n    %326 = llvm.add %286, %3 : i64\n    %327 = builtin.unrealized_conversion_cast %326 : i64 to index\n    cf.br ^bb46(%327 : index)\n  ^bb57:  // pred: ^bb46\n    %328 = llvm.mlir.constant(1 : index) : i64\n    %329 = llvm.alloca %328 x !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> : (i64) -> !llvm.ptr\n    llvm.store %283, %329 : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>, !llvm.ptr\n    %330 = llvm.mlir.constant(4 : index) : i64\n    %331 = llvm.mlir.poison : !llvm.struct<(i64, ptr)>\n    %332 = llvm.insertvalue %330, %331[0] : !llvm.struct<(i64, ptr)> \n    %333 = llvm.insertvalue %329, %332[1] : !llvm.struct<(i64, ptr)> \n    %334 = builtin.unrealized_conversion_cast %333 : !llvm.struct<(i64, ptr)> to memref<*xf32>\n    call @printMemrefF32(%334) : (memref<*xf32>) -> ()\n    %335 = llvm.extractvalue %66[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%335) : (!llvm.ptr) -> ()\n    %336 = llvm.extractvalue %206[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%336) : (!llvm.ptr) -> ()\n    %337 = llvm.extractvalue %283[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%337) : (!llvm.ptr) -> ()\n    return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-16-finalizememreftollvmconversionpass",
      "kind": "pass-event",
      "title": "FinalizeMemRefToLLVMConversionPass (finalize-memref-to-llvm)",
      "pass": "FinalizeMemRefToLLVMConversionPass (finalize-memref-to-llvm)",
      "index": 16,
      "changed": true,
      "before": "nano-ir-15-arithtollvmconversionpass",
      "after": "nano-ir-16-finalizememreftollvmconversionpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-17-convertfunctollvmpass",
      "kind": "ir-snapshot",
      "title": "IR after ConvertFuncToLLVMPass (convert-func-to-llvm)",
      "stage": "llvm",
      "text": "module {\n  llvm.func @free(!llvm.ptr)\n  llvm.func @malloc(i64) -> !llvm.ptr\n  llvm.mlir.global private constant @__constant_1x2x2x1xf32(dense<-6.000000e+01> : tensor<1x2x2x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<2 x array<2 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_3x3x1x1xf32(dense<1.000000e+00> : tensor<3x3x1x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<3 x array<3 x array<1 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_1x4x4x1xf32(dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> : tensor<1x4x4x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n  llvm.func @printMemrefF32(i64, !llvm.ptr) attributes {sym_visibility = \"private\"}\n  llvm.func @main() {\n    %0 = llvm.mlir.constant(-6.000000e+01 : f32) : f32\n    %1 = llvm.mlir.constant(3 : index) : i64\n    %2 = llvm.mlir.constant(2 : index) : i64\n    %3 = llvm.mlir.constant(1 : index) : i64\n    %4 = llvm.mlir.constant(0 : index) : i64\n    %5 = builtin.unrealized_conversion_cast %4 : i64 to index\n    %6 = llvm.mlir.constant(0.000000e+00 : f32) : f32\n    %7 = llvm.mlir.constant(1 : index) : i64\n    %8 = llvm.mlir.constant(4 : index) : i64\n    %9 = llvm.mlir.constant(4 : index) : i64\n    %10 = llvm.mlir.constant(1 : index) : i64\n    %11 = llvm.mlir.constant(1 : index) : i64\n    %12 = llvm.mlir.constant(16 : index) : i64\n    %13 = llvm.mlir.constant(16 : index) : i64\n    %14 = llvm.mlir.zero : !llvm.ptr\n    %15 = llvm.getelementptr %14[%13] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %16 = llvm.ptrtoint %15 : !llvm.ptr to i64\n    %17 = llvm.mlir.addressof @__constant_1x4x4x1xf32 : !llvm.ptr\n    %18 = llvm.getelementptr %17[0, 0, 0, 0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n    %19 = llvm.mlir.constant(3735928559 : index) : i64\n    %20 = llvm.inttoptr %19 : i64 to !llvm.ptr\n    %21 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %22 = llvm.insertvalue %20, %21[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %23 = llvm.insertvalue %18, %22[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %24 = llvm.mlir.constant(0 : index) : i64\n    %25 = llvm.insertvalue %24, %23[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %26 = llvm.insertvalue %7, %25[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %27 = llvm.insertvalue %8, %26[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %28 = llvm.insertvalue %9, %27[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %29 = llvm.insertvalue %10, %28[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %30 = llvm.insertvalue %12, %29[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %31 = llvm.insertvalue %9, %30[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %32 = llvm.insertvalue %10, %31[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %33 = llvm.insertvalue %11, %32[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %34 = llvm.mlir.constant(1 : index) : i64\n    %35 = llvm.mlir.constant(2 : index) : i64\n    %36 = llvm.mlir.constant(2 : index) : i64\n    %37 = llvm.mlir.constant(1 : index) : i64\n    %38 = llvm.mlir.constant(1 : index) : i64\n    %39 = llvm.mlir.constant(4 : index) : i64\n    %40 = llvm.mlir.constant(4 : index) : i64\n    %41 = llvm.mlir.zero : !llvm.ptr\n    %42 = llvm.getelementptr %41[%40] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %43 = llvm.ptrtoint %42 : !llvm.ptr to i64\n    %44 = llvm.mlir.constant(64 : index) : i64\n    %45 = llvm.add %43, %44 : i64\n    %46 = llvm.call @malloc(%45) : (i64) -> !llvm.ptr\n    %47 = llvm.ptrtoint %46 : !llvm.ptr to i64\n    %48 = llvm.mlir.constant(1 : index) : i64\n    %49 = llvm.sub %44, %48 : i64\n    %50 = llvm.add %47, %49 : i64\n    %51 = llvm.urem %50, %44 : i64\n    %52 = llvm.sub %50, %51 : i64\n    %53 = llvm.inttoptr %52 : i64 to !llvm.ptr\n    %54 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %55 = llvm.insertvalue %46, %54[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %56 = llvm.insertvalue %53, %55[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %57 = llvm.mlir.constant(0 : index) : i64\n    %58 = llvm.insertvalue %57, %56[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %59 = llvm.insertvalue %34, %58[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %60 = llvm.insertvalue %35, %59[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %61 = llvm.insertvalue %36, %60[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %62 = llvm.insertvalue %37, %61[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %63 = llvm.insertvalue %39, %62[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %64 = llvm.insertvalue %36, %63[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %65 = llvm.insertvalue %37, %64[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %66 = llvm.insertvalue %38, %65[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    cf.br ^bb1(%5 : index)\n  ^bb1(%67: index):  // 2 preds: ^bb0, ^bb11\n    %68 = builtin.unrealized_conversion_cast %67 : index to i64\n    %69 = builtin.unrealized_conversion_cast %67 : index to i64\n    %70 = llvm.icmp \"slt\" %69, %3 : i64\n    cf.cond_br %70, ^bb2, ^bb12\n  ^bb2:  // pred: ^bb1\n    cf.br ^bb3(%5 : index)\n  ^bb3(%71: index):  // 2 preds: ^bb2, ^bb10\n    %72 = builtin.unrealized_conversion_cast %71 : index to i64\n    %73 = builtin.unrealized_conversion_cast %71 : index to i64\n    %74 = llvm.icmp \"slt\" %73, %2 : i64\n    cf.cond_br %74, ^bb4, ^bb11\n  ^bb4:  // pred: ^bb3\n    cf.br ^bb5(%5 : index)\n  ^bb5(%75: index):  // 2 preds: ^bb4, ^bb9\n    %76 = builtin.unrealized_conversion_cast %75 : index to i64\n    %77 = builtin.unrealized_conversion_cast %75 : index to i64\n    %78 = llvm.icmp \"slt\" %77, %2 : i64\n    cf.cond_br %78, ^bb6, ^bb10\n  ^bb6:  // pred: ^bb5\n    cf.br ^bb7(%5 : index)\n  ^bb7(%79: index):  // 2 preds: ^bb6, ^bb8\n    %80 = builtin.unrealized_conversion_cast %79 : index to i64\n    %81 = builtin.unrealized_conversion_cast %79 : index to i64\n    %82 = llvm.icmp \"slt\" %81, %3 : i64\n    cf.cond_br %82, ^bb8, ^bb9\n  ^bb8:  // pred: ^bb7\n    %83 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %84 = llvm.mlir.constant(4 : index) : i64\n    %85 = llvm.mul %68, %84 overflow<nsw, nuw> : i64\n    %86 = llvm.mlir.constant(2 : index) : i64\n    %87 = llvm.mul %72, %86 overflow<nsw, nuw> : i64\n    %88 = llvm.add %85, %87 overflow<nsw, nuw> : i64\n    %89 = llvm.add %88, %76 overflow<nsw, nuw> : i64\n    %90 = llvm.add %89, %80 overflow<nsw, nuw> : i64\n    %91 = llvm.getelementptr inbounds|nuw %83[%90] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %6, %91 : f32, !llvm.ptr\n    %92 = llvm.add %81, %3 : i64\n    %93 = builtin.unrealized_conversion_cast %92 : i64 to index\n    cf.br ^bb7(%93 : index)\n  ^bb9:  // pred: ^bb7\n    %94 = llvm.add %77, %3 : i64\n    %95 = builtin.unrealized_conversion_cast %94 : i64 to index\n    cf.br ^bb5(%95 : index)\n  ^bb10:  // pred: ^bb5\n    %96 = llvm.add %73, %3 : i64\n    %97 = builtin.unrealized_conversion_cast %96 : i64 to index\n    cf.br ^bb3(%97 : index)\n  ^bb11:  // pred: ^bb3\n    %98 = llvm.add %69, %3 : i64\n    %99 = builtin.unrealized_conversion_cast %98 : i64 to index\n    cf.br ^bb1(%99 : index)\n  ^bb12:  // pred: ^bb1\n    cf.br ^bb13(%5 : index)\n  ^bb13(%100: index):  // 2 preds: ^bb12, ^bb32\n    %101 = builtin.unrealized_conversion_cast %100 : index to i64\n    %102 = builtin.unrealized_conversion_cast %100 : index to i64\n    %103 = llvm.icmp \"slt\" %102, %3 : i64\n    cf.cond_br %103, ^bb14, ^bb33\n  ^bb14:  // pred: ^bb13\n    cf.br ^bb15(%5 : index)\n  ^bb15(%104: index):  // 2 preds: ^bb14, ^bb31\n    %105 = builtin.unrealized_conversion_cast %104 : index to i64\n    %106 = builtin.unrealized_conversion_cast %104 : index to i64\n    %107 = llvm.icmp \"slt\" %106, %2 : i64\n    cf.cond_br %107, ^bb16, ^bb32\n  ^bb16:  // pred: ^bb15\n    cf.br ^bb17(%5 : index)\n  ^bb17(%108: index):  // 2 preds: ^bb16, ^bb30\n    %109 = builtin.unrealized_conversion_cast %108 : index to i64\n    %110 = builtin.unrealized_conversion_cast %108 : index to i64\n    %111 = llvm.icmp \"slt\" %110, %2 : i64\n    cf.cond_br %111, ^bb18, ^bb31\n  ^bb18:  // pred: ^bb17\n    cf.br ^bb19(%5 : index)\n  ^bb19(%112: index):  // 2 preds: ^bb18, ^bb29\n    %113 = builtin.unrealized_conversion_cast %112 : index to i64\n    %114 = builtin.unrealized_conversion_cast %112 : index to i64\n    %115 = llvm.icmp \"slt\" %114, %3 : i64\n    cf.cond_br %115, ^bb20, ^bb30\n  ^bb20:  // pred: ^bb19\n    cf.br ^bb21(%5 : index)\n  ^bb21(%116: index):  // 2 preds: ^bb20, ^bb28\n    %117 = builtin.unrealized_conversion_cast %116 : index to i64\n    %118 = llvm.icmp \"slt\" %117, %1 : i64\n    cf.cond_br %118, ^bb22, ^bb29\n  ^bb22:  // pred: ^bb21\n    cf.br ^bb23(%5 : index)\n  ^bb23(%119: index):  // 2 preds: ^bb22, ^bb27\n    %120 = builtin.unrealized_conversion_cast %119 : index to i64\n    %121 = llvm.icmp \"slt\" %120, %1 : i64\n    cf.cond_br %121, ^bb24, ^bb28\n  ^bb24:  // pred: ^bb23\n    cf.br ^bb25(%5 : index)\n  ^bb25(%122: index):  // 2 preds: ^bb24, ^bb26\n    %123 = builtin.unrealized_conversion_cast %122 : index to i64\n    %124 = builtin.unrealized_conversion_cast %122 : index to i64\n    %125 = llvm.icmp \"slt\" %124, %3 : i64\n    cf.cond_br %125, ^bb26, ^bb27\n  ^bb26:  // pred: ^bb25\n    %126 = llvm.add %106, %117 : i64\n    %127 = builtin.unrealized_conversion_cast %126 : i64 to index\n    %128 = llvm.add %110, %120 : i64\n    %129 = builtin.unrealized_conversion_cast %128 : i64 to index\n    %130 = llvm.extractvalue %33[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %131 = llvm.mlir.constant(16 : index) : i64\n    %132 = llvm.mul %101, %131 overflow<nsw, nuw> : i64\n    %133 = llvm.mlir.constant(4 : index) : i64\n    %134 = llvm.mul %126, %133 overflow<nsw, nuw> : i64\n    %135 = llvm.add %132, %134 overflow<nsw, nuw> : i64\n    %136 = llvm.add %135, %128 overflow<nsw, nuw> : i64\n    %137 = llvm.add %136, %123 overflow<nsw, nuw> : i64\n    %138 = llvm.getelementptr inbounds|nuw %130[%137] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %139 = llvm.load %138 : !llvm.ptr -> f32\n    %140 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %141 = llvm.mlir.constant(4 : index) : i64\n    %142 = llvm.mul %101, %141 overflow<nsw, nuw> : i64\n    %143 = llvm.mlir.constant(2 : index) : i64\n    %144 = llvm.mul %105, %143 overflow<nsw, nuw> : i64\n    %145 = llvm.add %142, %144 overflow<nsw, nuw> : i64\n    %146 = llvm.add %145, %109 overflow<nsw, nuw> : i64\n    %147 = llvm.add %146, %113 overflow<nsw, nuw> : i64\n    %148 = llvm.getelementptr inbounds|nuw %140[%147] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %149 = llvm.load %148 : !llvm.ptr -> f32\n    %150 = llvm.fadd %149, %139 : f32\n    %151 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %152 = llvm.mlir.constant(4 : index) : i64\n    %153 = llvm.mul %101, %152 overflow<nsw, nuw> : i64\n    %154 = llvm.mlir.constant(2 : index) : i64\n    %155 = llvm.mul %105, %154 overflow<nsw, nuw> : i64\n    %156 = llvm.add %153, %155 overflow<nsw, nuw> : i64\n    %157 = llvm.add %156, %109 overflow<nsw, nuw> : i64\n    %158 = llvm.add %157, %113 overflow<nsw, nuw> : i64\n    %159 = llvm.getelementptr inbounds|nuw %151[%158] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %150, %159 : f32, !llvm.ptr\n    %160 = llvm.add %124, %3 : i64\n    %161 = builtin.unrealized_conversion_cast %160 : i64 to index\n    cf.br ^bb25(%161 : index)\n  ^bb27:  // pred: ^bb25\n    %162 = llvm.add %120, %3 : i64\n    %163 = builtin.unrealized_conversion_cast %162 : i64 to index\n    cf.br ^bb23(%163 : index)\n  ^bb28:  // pred: ^bb23\n    %164 = llvm.add %117, %3 : i64\n    %165 = builtin.unrealized_conversion_cast %164 : i64 to index\n    cf.br ^bb21(%165 : index)\n  ^bb29:  // pred: ^bb21\n    %166 = llvm.add %114, %3 : i64\n    %167 = builtin.unrealized_conversion_cast %166 : i64 to index\n    cf.br ^bb19(%167 : index)\n  ^bb30:  // pred: ^bb19\n    %168 = llvm.add %110, %3 : i64\n    %169 = builtin.unrealized_conversion_cast %168 : i64 to index\n    cf.br ^bb17(%169 : index)\n  ^bb31:  // pred: ^bb17\n    %170 = llvm.add %106, %3 : i64\n    %171 = builtin.unrealized_conversion_cast %170 : i64 to index\n    cf.br ^bb15(%171 : index)\n  ^bb32:  // pred: ^bb15\n    %172 = llvm.add %102, %3 : i64\n    %173 = builtin.unrealized_conversion_cast %172 : i64 to index\n    cf.br ^bb13(%173 : index)\n  ^bb33:  // pred: ^bb13\n    %174 = llvm.mlir.constant(1 : index) : i64\n    %175 = llvm.mlir.constant(2 : index) : i64\n    %176 = llvm.mlir.constant(2 : index) : i64\n    %177 = llvm.mlir.constant(1 : index) : i64\n    %178 = llvm.mlir.constant(1 : index) : i64\n    %179 = llvm.mlir.constant(4 : index) : i64\n    %180 = llvm.mlir.constant(4 : index) : i64\n    %181 = llvm.mlir.zero : !llvm.ptr\n    %182 = llvm.getelementptr %181[%180] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %183 = llvm.ptrtoint %182 : !llvm.ptr to i64\n    %184 = llvm.mlir.constant(64 : index) : i64\n    %185 = llvm.add %183, %184 : i64\n    %186 = llvm.call @malloc(%185) : (i64) -> !llvm.ptr\n    %187 = llvm.ptrtoint %186 : !llvm.ptr to i64\n    %188 = llvm.mlir.constant(1 : index) : i64\n    %189 = llvm.sub %184, %188 : i64\n    %190 = llvm.add %187, %189 : i64\n    %191 = llvm.urem %190, %184 : i64\n    %192 = llvm.sub %190, %191 : i64\n    %193 = llvm.inttoptr %192 : i64 to !llvm.ptr\n    %194 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %195 = llvm.insertvalue %186, %194[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %196 = llvm.insertvalue %193, %195[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %197 = llvm.mlir.constant(0 : index) : i64\n    %198 = llvm.insertvalue %197, %196[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %199 = llvm.insertvalue %174, %198[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %200 = llvm.insertvalue %175, %199[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %201 = llvm.insertvalue %176, %200[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %202 = llvm.insertvalue %177, %201[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %203 = llvm.insertvalue %179, %202[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %204 = llvm.insertvalue %176, %203[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %205 = llvm.insertvalue %177, %204[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %206 = llvm.insertvalue %178, %205[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    cf.br ^bb34(%5 : index)\n  ^bb34(%207: index):  // 2 preds: ^bb33, ^bb44\n    %208 = builtin.unrealized_conversion_cast %207 : index to i64\n    %209 = builtin.unrealized_conversion_cast %207 : index to i64\n    %210 = llvm.icmp \"slt\" %209, %3 : i64\n    cf.cond_br %210, ^bb35, ^bb45\n  ^bb35:  // pred: ^bb34\n    cf.br ^bb36(%5 : index)\n  ^bb36(%211: index):  // 2 preds: ^bb35, ^bb43\n    %212 = builtin.unrealized_conversion_cast %211 : index to i64\n    %213 = builtin.unrealized_conversion_cast %211 : index to i64\n    %214 = llvm.icmp \"slt\" %213, %2 : i64\n    cf.cond_br %214, ^bb37, ^bb44\n  ^bb37:  // pred: ^bb36\n    cf.br ^bb38(%5 : index)\n  ^bb38(%215: index):  // 2 preds: ^bb37, ^bb42\n    %216 = builtin.unrealized_conversion_cast %215 : index to i64\n    %217 = builtin.unrealized_conversion_cast %215 : index to i64\n    %218 = llvm.icmp \"slt\" %217, %2 : i64\n    cf.cond_br %218, ^bb39, ^bb43\n  ^bb39:  // pred: ^bb38\n    cf.br ^bb40(%5 : index)\n  ^bb40(%219: index):  // 2 preds: ^bb39, ^bb41\n    %220 = builtin.unrealized_conversion_cast %219 : index to i64\n    %221 = builtin.unrealized_conversion_cast %219 : index to i64\n    %222 = llvm.icmp \"slt\" %221, %3 : i64\n    cf.cond_br %222, ^bb41, ^bb42\n  ^bb41:  // pred: ^bb40\n    %223 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %224 = llvm.mlir.constant(4 : index) : i64\n    %225 = llvm.mul %208, %224 overflow<nsw, nuw> : i64\n    %226 = llvm.mlir.constant(2 : index) : i64\n    %227 = llvm.mul %212, %226 overflow<nsw, nuw> : i64\n    %228 = llvm.add %225, %227 overflow<nsw, nuw> : i64\n    %229 = llvm.add %228, %216 overflow<nsw, nuw> : i64\n    %230 = llvm.add %229, %220 overflow<nsw, nuw> : i64\n    %231 = llvm.getelementptr inbounds|nuw %223[%230] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %232 = llvm.load %231 : !llvm.ptr -> f32\n    %233 = llvm.fadd %232, %0 : f32\n    %234 = llvm.extractvalue %206[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %235 = llvm.mlir.constant(4 : index) : i64\n    %236 = llvm.mul %208, %235 overflow<nsw, nuw> : i64\n    %237 = llvm.mlir.constant(2 : index) : i64\n    %238 = llvm.mul %212, %237 overflow<nsw, nuw> : i64\n    %239 = llvm.add %236, %238 overflow<nsw, nuw> : i64\n    %240 = llvm.add %239, %216 overflow<nsw, nuw> : i64\n    %241 = llvm.add %240, %220 overflow<nsw, nuw> : i64\n    %242 = llvm.getelementptr inbounds|nuw %234[%241] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %233, %242 : f32, !llvm.ptr\n    %243 = llvm.add %221, %3 : i64\n    %244 = builtin.unrealized_conversion_cast %243 : i64 to index\n    cf.br ^bb40(%244 : index)\n  ^bb42:  // pred: ^bb40\n    %245 = llvm.add %217, %3 : i64\n    %246 = builtin.unrealized_conversion_cast %245 : i64 to index\n    cf.br ^bb38(%246 : index)\n  ^bb43:  // pred: ^bb38\n    %247 = llvm.add %213, %3 : i64\n    %248 = builtin.unrealized_conversion_cast %247 : i64 to index\n    cf.br ^bb36(%248 : index)\n  ^bb44:  // pred: ^bb36\n    %249 = llvm.add %209, %3 : i64\n    %250 = builtin.unrealized_conversion_cast %249 : i64 to index\n    cf.br ^bb34(%250 : index)\n  ^bb45:  // pred: ^bb34\n    %251 = llvm.mlir.constant(1 : index) : i64\n    %252 = llvm.mlir.constant(2 : index) : i64\n    %253 = llvm.mlir.constant(2 : index) : i64\n    %254 = llvm.mlir.constant(1 : index) : i64\n    %255 = llvm.mlir.constant(1 : index) : i64\n    %256 = llvm.mlir.constant(4 : index) : i64\n    %257 = llvm.mlir.constant(4 : index) : i64\n    %258 = llvm.mlir.zero : !llvm.ptr\n    %259 = llvm.getelementptr %258[%257] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %260 = llvm.ptrtoint %259 : !llvm.ptr to i64\n    %261 = llvm.mlir.constant(64 : index) : i64\n    %262 = llvm.add %260, %261 : i64\n    %263 = llvm.call @malloc(%262) : (i64) -> !llvm.ptr\n    %264 = llvm.ptrtoint %263 : !llvm.ptr to i64\n    %265 = llvm.mlir.constant(1 : index) : i64\n    %266 = llvm.sub %261, %265 : i64\n    %267 = llvm.add %264, %266 : i64\n    %268 = llvm.urem %267, %261 : i64\n    %269 = llvm.sub %267, %268 : i64\n    %270 = llvm.inttoptr %269 : i64 to !llvm.ptr\n    %271 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %272 = llvm.insertvalue %263, %271[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %273 = llvm.insertvalue %270, %272[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %274 = llvm.mlir.constant(0 : index) : i64\n    %275 = llvm.insertvalue %274, %273[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %276 = llvm.insertvalue %251, %275[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %277 = llvm.insertvalue %252, %276[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %278 = llvm.insertvalue %253, %277[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %279 = llvm.insertvalue %254, %278[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %280 = llvm.insertvalue %256, %279[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %281 = llvm.insertvalue %253, %280[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %282 = llvm.insertvalue %254, %281[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %283 = llvm.insertvalue %255, %282[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    cf.br ^bb46(%5 : index)\n  ^bb46(%284: index):  // 2 preds: ^bb45, ^bb56\n    %285 = builtin.unrealized_conversion_cast %284 : index to i64\n    %286 = builtin.unrealized_conversion_cast %284 : index to i64\n    %287 = llvm.icmp \"slt\" %286, %3 : i64\n    cf.cond_br %287, ^bb47, ^bb57\n  ^bb47:  // pred: ^bb46\n    cf.br ^bb48(%5 : index)\n  ^bb48(%288: index):  // 2 preds: ^bb47, ^bb55\n    %289 = builtin.unrealized_conversion_cast %288 : index to i64\n    %290 = builtin.unrealized_conversion_cast %288 : index to i64\n    %291 = llvm.icmp \"slt\" %290, %2 : i64\n    cf.cond_br %291, ^bb49, ^bb56\n  ^bb49:  // pred: ^bb48\n    cf.br ^bb50(%5 : index)\n  ^bb50(%292: index):  // 2 preds: ^bb49, ^bb54\n    %293 = builtin.unrealized_conversion_cast %292 : index to i64\n    %294 = builtin.unrealized_conversion_cast %292 : index to i64\n    %295 = llvm.icmp \"slt\" %294, %2 : i64\n    cf.cond_br %295, ^bb51, ^bb55\n  ^bb51:  // pred: ^bb50\n    cf.br ^bb52(%5 : index)\n  ^bb52(%296: index):  // 2 preds: ^bb51, ^bb53\n    %297 = builtin.unrealized_conversion_cast %296 : index to i64\n    %298 = builtin.unrealized_conversion_cast %296 : index to i64\n    %299 = llvm.icmp \"slt\" %298, %3 : i64\n    cf.cond_br %299, ^bb53, ^bb54\n  ^bb53:  // pred: ^bb52\n    %300 = llvm.extractvalue %206[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %301 = llvm.mlir.constant(4 : index) : i64\n    %302 = llvm.mul %285, %301 overflow<nsw, nuw> : i64\n    %303 = llvm.mlir.constant(2 : index) : i64\n    %304 = llvm.mul %289, %303 overflow<nsw, nuw> : i64\n    %305 = llvm.add %302, %304 overflow<nsw, nuw> : i64\n    %306 = llvm.add %305, %293 overflow<nsw, nuw> : i64\n    %307 = llvm.add %306, %297 overflow<nsw, nuw> : i64\n    %308 = llvm.getelementptr inbounds|nuw %300[%307] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %309 = llvm.load %308 : !llvm.ptr -> f32\n    %310 = llvm.intr.maximum(%309, %6) : (f32, f32) -> f32\n    %311 = llvm.extractvalue %283[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %312 = llvm.mlir.constant(4 : index) : i64\n    %313 = llvm.mul %285, %312 overflow<nsw, nuw> : i64\n    %314 = llvm.mlir.constant(2 : index) : i64\n    %315 = llvm.mul %289, %314 overflow<nsw, nuw> : i64\n    %316 = llvm.add %313, %315 overflow<nsw, nuw> : i64\n    %317 = llvm.add %316, %293 overflow<nsw, nuw> : i64\n    %318 = llvm.add %317, %297 overflow<nsw, nuw> : i64\n    %319 = llvm.getelementptr inbounds|nuw %311[%318] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %310, %319 : f32, !llvm.ptr\n    %320 = llvm.add %298, %3 : i64\n    %321 = builtin.unrealized_conversion_cast %320 : i64 to index\n    cf.br ^bb52(%321 : index)\n  ^bb54:  // pred: ^bb52\n    %322 = llvm.add %294, %3 : i64\n    %323 = builtin.unrealized_conversion_cast %322 : i64 to index\n    cf.br ^bb50(%323 : index)\n  ^bb55:  // pred: ^bb50\n    %324 = llvm.add %290, %3 : i64\n    %325 = builtin.unrealized_conversion_cast %324 : i64 to index\n    cf.br ^bb48(%325 : index)\n  ^bb56:  // pred: ^bb48\n    %326 = llvm.add %286, %3 : i64\n    %327 = builtin.unrealized_conversion_cast %326 : i64 to index\n    cf.br ^bb46(%327 : index)\n  ^bb57:  // pred: ^bb46\n    %328 = llvm.mlir.constant(1 : index) : i64\n    %329 = llvm.alloca %328 x !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> : (i64) -> !llvm.ptr\n    llvm.store %283, %329 : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>, !llvm.ptr\n    %330 = llvm.mlir.constant(4 : index) : i64\n    %331 = llvm.mlir.poison : !llvm.struct<(i64, ptr)>\n    %332 = llvm.insertvalue %330, %331[0] : !llvm.struct<(i64, ptr)> \n    %333 = llvm.insertvalue %329, %332[1] : !llvm.struct<(i64, ptr)> \n    %334 = builtin.unrealized_conversion_cast %333 : !llvm.struct<(i64, ptr)> to memref<*xf32>\n    %335 = llvm.extractvalue %333[0] : !llvm.struct<(i64, ptr)> \n    %336 = llvm.extractvalue %333[1] : !llvm.struct<(i64, ptr)> \n    llvm.call @printMemrefF32(%335, %336) : (i64, !llvm.ptr) -> ()\n    %337 = llvm.extractvalue %66[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%337) : (!llvm.ptr) -> ()\n    %338 = llvm.extractvalue %206[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%338) : (!llvm.ptr) -> ()\n    %339 = llvm.extractvalue %283[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%339) : (!llvm.ptr) -> ()\n    llvm.return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-17-convertfunctollvmpass",
      "kind": "pass-event",
      "title": "ConvertFuncToLLVMPass (convert-func-to-llvm)",
      "pass": "ConvertFuncToLLVMPass (convert-func-to-llvm)",
      "index": 17,
      "changed": true,
      "before": "nano-ir-16-finalizememreftollvmconversionpass",
      "after": "nano-ir-17-convertfunctollvmpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-18-convertcontrolflowtollvmpass",
      "kind": "ir-snapshot",
      "title": "IR after ConvertControlFlowToLLVMPass (convert-cf-to-llvm)",
      "stage": "llvm",
      "text": "module {\n  llvm.func @free(!llvm.ptr)\n  llvm.func @malloc(i64) -> !llvm.ptr\n  llvm.mlir.global private constant @__constant_1x2x2x1xf32(dense<-6.000000e+01> : tensor<1x2x2x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<2 x array<2 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_3x3x1x1xf32(dense<1.000000e+00> : tensor<3x3x1x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<3 x array<3 x array<1 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_1x4x4x1xf32(dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> : tensor<1x4x4x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n  llvm.func @printMemrefF32(i64, !llvm.ptr) attributes {sym_visibility = \"private\"}\n  llvm.func @main() {\n    %0 = llvm.mlir.constant(-6.000000e+01 : f32) : f32\n    %1 = llvm.mlir.constant(3 : index) : i64\n    %2 = llvm.mlir.constant(2 : index) : i64\n    %3 = llvm.mlir.constant(1 : index) : i64\n    %4 = llvm.mlir.constant(0 : index) : i64\n    %5 = builtin.unrealized_conversion_cast %4 : i64 to index\n    %6 = llvm.mlir.constant(0.000000e+00 : f32) : f32\n    %7 = llvm.mlir.constant(1 : index) : i64\n    %8 = llvm.mlir.constant(4 : index) : i64\n    %9 = llvm.mlir.constant(4 : index) : i64\n    %10 = llvm.mlir.constant(1 : index) : i64\n    %11 = llvm.mlir.constant(1 : index) : i64\n    %12 = llvm.mlir.constant(16 : index) : i64\n    %13 = llvm.mlir.constant(16 : index) : i64\n    %14 = llvm.mlir.zero : !llvm.ptr\n    %15 = llvm.getelementptr %14[%13] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %16 = llvm.ptrtoint %15 : !llvm.ptr to i64\n    %17 = llvm.mlir.addressof @__constant_1x4x4x1xf32 : !llvm.ptr\n    %18 = llvm.getelementptr %17[0, 0, 0, 0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n    %19 = llvm.mlir.constant(3735928559 : index) : i64\n    %20 = llvm.inttoptr %19 : i64 to !llvm.ptr\n    %21 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %22 = llvm.insertvalue %20, %21[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %23 = llvm.insertvalue %18, %22[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %24 = llvm.mlir.constant(0 : index) : i64\n    %25 = llvm.insertvalue %24, %23[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %26 = llvm.insertvalue %7, %25[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %27 = llvm.insertvalue %8, %26[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %28 = llvm.insertvalue %9, %27[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %29 = llvm.insertvalue %10, %28[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %30 = llvm.insertvalue %12, %29[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %31 = llvm.insertvalue %9, %30[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %32 = llvm.insertvalue %10, %31[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %33 = llvm.insertvalue %11, %32[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %34 = llvm.mlir.constant(1 : index) : i64\n    %35 = llvm.mlir.constant(2 : index) : i64\n    %36 = llvm.mlir.constant(2 : index) : i64\n    %37 = llvm.mlir.constant(1 : index) : i64\n    %38 = llvm.mlir.constant(1 : index) : i64\n    %39 = llvm.mlir.constant(4 : index) : i64\n    %40 = llvm.mlir.constant(4 : index) : i64\n    %41 = llvm.mlir.zero : !llvm.ptr\n    %42 = llvm.getelementptr %41[%40] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %43 = llvm.ptrtoint %42 : !llvm.ptr to i64\n    %44 = llvm.mlir.constant(64 : index) : i64\n    %45 = llvm.add %43, %44 : i64\n    %46 = llvm.call @malloc(%45) : (i64) -> !llvm.ptr\n    %47 = llvm.ptrtoint %46 : !llvm.ptr to i64\n    %48 = llvm.mlir.constant(1 : index) : i64\n    %49 = llvm.sub %44, %48 : i64\n    %50 = llvm.add %47, %49 : i64\n    %51 = llvm.urem %50, %44 : i64\n    %52 = llvm.sub %50, %51 : i64\n    %53 = llvm.inttoptr %52 : i64 to !llvm.ptr\n    %54 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %55 = llvm.insertvalue %46, %54[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %56 = llvm.insertvalue %53, %55[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %57 = llvm.mlir.constant(0 : index) : i64\n    %58 = llvm.insertvalue %57, %56[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %59 = llvm.insertvalue %34, %58[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %60 = llvm.insertvalue %35, %59[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %61 = llvm.insertvalue %36, %60[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %62 = llvm.insertvalue %37, %61[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %63 = llvm.insertvalue %39, %62[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %64 = llvm.insertvalue %36, %63[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %65 = llvm.insertvalue %37, %64[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %66 = llvm.insertvalue %38, %65[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.br ^bb1(%4 : i64)\n  ^bb1(%67: i64):  // 2 preds: ^bb0, ^bb11\n    %68 = builtin.unrealized_conversion_cast %67 : i64 to index\n    %69 = builtin.unrealized_conversion_cast %68 : index to i64\n    %70 = builtin.unrealized_conversion_cast %68 : index to i64\n    %71 = llvm.icmp \"slt\" %70, %3 : i64\n    llvm.cond_br %71, ^bb2, ^bb12\n  ^bb2:  // pred: ^bb1\n    llvm.br ^bb3(%4 : i64)\n  ^bb3(%72: i64):  // 2 preds: ^bb2, ^bb10\n    %73 = builtin.unrealized_conversion_cast %72 : i64 to index\n    %74 = builtin.unrealized_conversion_cast %73 : index to i64\n    %75 = builtin.unrealized_conversion_cast %73 : index to i64\n    %76 = llvm.icmp \"slt\" %75, %2 : i64\n    llvm.cond_br %76, ^bb4, ^bb11\n  ^bb4:  // pred: ^bb3\n    llvm.br ^bb5(%4 : i64)\n  ^bb5(%77: i64):  // 2 preds: ^bb4, ^bb9\n    %78 = builtin.unrealized_conversion_cast %77 : i64 to index\n    %79 = builtin.unrealized_conversion_cast %78 : index to i64\n    %80 = builtin.unrealized_conversion_cast %78 : index to i64\n    %81 = llvm.icmp \"slt\" %80, %2 : i64\n    llvm.cond_br %81, ^bb6, ^bb10\n  ^bb6:  // pred: ^bb5\n    llvm.br ^bb7(%4 : i64)\n  ^bb7(%82: i64):  // 2 preds: ^bb6, ^bb8\n    %83 = builtin.unrealized_conversion_cast %82 : i64 to index\n    %84 = builtin.unrealized_conversion_cast %83 : index to i64\n    %85 = builtin.unrealized_conversion_cast %83 : index to i64\n    %86 = llvm.icmp \"slt\" %85, %3 : i64\n    llvm.cond_br %86, ^bb8, ^bb9\n  ^bb8:  // pred: ^bb7\n    %87 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %88 = llvm.mlir.constant(4 : index) : i64\n    %89 = llvm.mul %69, %88 overflow<nsw, nuw> : i64\n    %90 = llvm.mlir.constant(2 : index) : i64\n    %91 = llvm.mul %74, %90 overflow<nsw, nuw> : i64\n    %92 = llvm.add %89, %91 overflow<nsw, nuw> : i64\n    %93 = llvm.add %92, %79 overflow<nsw, nuw> : i64\n    %94 = llvm.add %93, %84 overflow<nsw, nuw> : i64\n    %95 = llvm.getelementptr inbounds|nuw %87[%94] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %6, %95 : f32, !llvm.ptr\n    %96 = llvm.add %85, %3 : i64\n    %97 = builtin.unrealized_conversion_cast %96 : i64 to index\n    llvm.br ^bb7(%96 : i64)\n  ^bb9:  // pred: ^bb7\n    %98 = llvm.add %80, %3 : i64\n    %99 = builtin.unrealized_conversion_cast %98 : i64 to index\n    llvm.br ^bb5(%98 : i64)\n  ^bb10:  // pred: ^bb5\n    %100 = llvm.add %75, %3 : i64\n    %101 = builtin.unrealized_conversion_cast %100 : i64 to index\n    llvm.br ^bb3(%100 : i64)\n  ^bb11:  // pred: ^bb3\n    %102 = llvm.add %70, %3 : i64\n    %103 = builtin.unrealized_conversion_cast %102 : i64 to index\n    llvm.br ^bb1(%102 : i64)\n  ^bb12:  // pred: ^bb1\n    llvm.br ^bb13(%4 : i64)\n  ^bb13(%104: i64):  // 2 preds: ^bb12, ^bb32\n    %105 = builtin.unrealized_conversion_cast %104 : i64 to index\n    %106 = builtin.unrealized_conversion_cast %105 : index to i64\n    %107 = builtin.unrealized_conversion_cast %105 : index to i64\n    %108 = llvm.icmp \"slt\" %107, %3 : i64\n    llvm.cond_br %108, ^bb14, ^bb33\n  ^bb14:  // pred: ^bb13\n    llvm.br ^bb15(%4 : i64)\n  ^bb15(%109: i64):  // 2 preds: ^bb14, ^bb31\n    %110 = builtin.unrealized_conversion_cast %109 : i64 to index\n    %111 = builtin.unrealized_conversion_cast %110 : index to i64\n    %112 = builtin.unrealized_conversion_cast %110 : index to i64\n    %113 = llvm.icmp \"slt\" %112, %2 : i64\n    llvm.cond_br %113, ^bb16, ^bb32\n  ^bb16:  // pred: ^bb15\n    llvm.br ^bb17(%4 : i64)\n  ^bb17(%114: i64):  // 2 preds: ^bb16, ^bb30\n    %115 = builtin.unrealized_conversion_cast %114 : i64 to index\n    %116 = builtin.unrealized_conversion_cast %115 : index to i64\n    %117 = builtin.unrealized_conversion_cast %115 : index to i64\n    %118 = llvm.icmp \"slt\" %117, %2 : i64\n    llvm.cond_br %118, ^bb18, ^bb31\n  ^bb18:  // pred: ^bb17\n    llvm.br ^bb19(%4 : i64)\n  ^bb19(%119: i64):  // 2 preds: ^bb18, ^bb29\n    %120 = builtin.unrealized_conversion_cast %119 : i64 to index\n    %121 = builtin.unrealized_conversion_cast %120 : index to i64\n    %122 = builtin.unrealized_conversion_cast %120 : index to i64\n    %123 = llvm.icmp \"slt\" %122, %3 : i64\n    llvm.cond_br %123, ^bb20, ^bb30\n  ^bb20:  // pred: ^bb19\n    llvm.br ^bb21(%4 : i64)\n  ^bb21(%124: i64):  // 2 preds: ^bb20, ^bb28\n    %125 = builtin.unrealized_conversion_cast %124 : i64 to index\n    %126 = builtin.unrealized_conversion_cast %125 : index to i64\n    %127 = llvm.icmp \"slt\" %126, %1 : i64\n    llvm.cond_br %127, ^bb22, ^bb29\n  ^bb22:  // pred: ^bb21\n    llvm.br ^bb23(%4 : i64)\n  ^bb23(%128: i64):  // 2 preds: ^bb22, ^bb27\n    %129 = builtin.unrealized_conversion_cast %128 : i64 to index\n    %130 = builtin.unrealized_conversion_cast %129 : index to i64\n    %131 = llvm.icmp \"slt\" %130, %1 : i64\n    llvm.cond_br %131, ^bb24, ^bb28\n  ^bb24:  // pred: ^bb23\n    llvm.br ^bb25(%4 : i64)\n  ^bb25(%132: i64):  // 2 preds: ^bb24, ^bb26\n    %133 = builtin.unrealized_conversion_cast %132 : i64 to index\n    %134 = builtin.unrealized_conversion_cast %133 : index to i64\n    %135 = builtin.unrealized_conversion_cast %133 : index to i64\n    %136 = llvm.icmp \"slt\" %135, %3 : i64\n    llvm.cond_br %136, ^bb26, ^bb27\n  ^bb26:  // pred: ^bb25\n    %137 = llvm.add %112, %126 : i64\n    %138 = builtin.unrealized_conversion_cast %137 : i64 to index\n    %139 = llvm.add %117, %130 : i64\n    %140 = builtin.unrealized_conversion_cast %139 : i64 to index\n    %141 = llvm.extractvalue %33[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %142 = llvm.mlir.constant(16 : index) : i64\n    %143 = llvm.mul %106, %142 overflow<nsw, nuw> : i64\n    %144 = llvm.mlir.constant(4 : index) : i64\n    %145 = llvm.mul %137, %144 overflow<nsw, nuw> : i64\n    %146 = llvm.add %143, %145 overflow<nsw, nuw> : i64\n    %147 = llvm.add %146, %139 overflow<nsw, nuw> : i64\n    %148 = llvm.add %147, %134 overflow<nsw, nuw> : i64\n    %149 = llvm.getelementptr inbounds|nuw %141[%148] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %150 = llvm.load %149 : !llvm.ptr -> f32\n    %151 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %152 = llvm.mlir.constant(4 : index) : i64\n    %153 = llvm.mul %106, %152 overflow<nsw, nuw> : i64\n    %154 = llvm.mlir.constant(2 : index) : i64\n    %155 = llvm.mul %111, %154 overflow<nsw, nuw> : i64\n    %156 = llvm.add %153, %155 overflow<nsw, nuw> : i64\n    %157 = llvm.add %156, %116 overflow<nsw, nuw> : i64\n    %158 = llvm.add %157, %121 overflow<nsw, nuw> : i64\n    %159 = llvm.getelementptr inbounds|nuw %151[%158] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %160 = llvm.load %159 : !llvm.ptr -> f32\n    %161 = llvm.fadd %160, %150 : f32\n    %162 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %163 = llvm.mlir.constant(4 : index) : i64\n    %164 = llvm.mul %106, %163 overflow<nsw, nuw> : i64\n    %165 = llvm.mlir.constant(2 : index) : i64\n    %166 = llvm.mul %111, %165 overflow<nsw, nuw> : i64\n    %167 = llvm.add %164, %166 overflow<nsw, nuw> : i64\n    %168 = llvm.add %167, %116 overflow<nsw, nuw> : i64\n    %169 = llvm.add %168, %121 overflow<nsw, nuw> : i64\n    %170 = llvm.getelementptr inbounds|nuw %162[%169] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %161, %170 : f32, !llvm.ptr\n    %171 = llvm.add %135, %3 : i64\n    %172 = builtin.unrealized_conversion_cast %171 : i64 to index\n    llvm.br ^bb25(%171 : i64)\n  ^bb27:  // pred: ^bb25\n    %173 = llvm.add %130, %3 : i64\n    %174 = builtin.unrealized_conversion_cast %173 : i64 to index\n    llvm.br ^bb23(%173 : i64)\n  ^bb28:  // pred: ^bb23\n    %175 = llvm.add %126, %3 : i64\n    %176 = builtin.unrealized_conversion_cast %175 : i64 to index\n    llvm.br ^bb21(%175 : i64)\n  ^bb29:  // pred: ^bb21\n    %177 = llvm.add %122, %3 : i64\n    %178 = builtin.unrealized_conversion_cast %177 : i64 to index\n    llvm.br ^bb19(%177 : i64)\n  ^bb30:  // pred: ^bb19\n    %179 = llvm.add %117, %3 : i64\n    %180 = builtin.unrealized_conversion_cast %179 : i64 to index\n    llvm.br ^bb17(%179 : i64)\n  ^bb31:  // pred: ^bb17\n    %181 = llvm.add %112, %3 : i64\n    %182 = builtin.unrealized_conversion_cast %181 : i64 to index\n    llvm.br ^bb15(%181 : i64)\n  ^bb32:  // pred: ^bb15\n    %183 = llvm.add %107, %3 : i64\n    %184 = builtin.unrealized_conversion_cast %183 : i64 to index\n    llvm.br ^bb13(%183 : i64)\n  ^bb33:  // pred: ^bb13\n    %185 = llvm.mlir.constant(1 : index) : i64\n    %186 = llvm.mlir.constant(2 : index) : i64\n    %187 = llvm.mlir.constant(2 : index) : i64\n    %188 = llvm.mlir.constant(1 : index) : i64\n    %189 = llvm.mlir.constant(1 : index) : i64\n    %190 = llvm.mlir.constant(4 : index) : i64\n    %191 = llvm.mlir.constant(4 : index) : i64\n    %192 = llvm.mlir.zero : !llvm.ptr\n    %193 = llvm.getelementptr %192[%191] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %194 = llvm.ptrtoint %193 : !llvm.ptr to i64\n    %195 = llvm.mlir.constant(64 : index) : i64\n    %196 = llvm.add %194, %195 : i64\n    %197 = llvm.call @malloc(%196) : (i64) -> !llvm.ptr\n    %198 = llvm.ptrtoint %197 : !llvm.ptr to i64\n    %199 = llvm.mlir.constant(1 : index) : i64\n    %200 = llvm.sub %195, %199 : i64\n    %201 = llvm.add %198, %200 : i64\n    %202 = llvm.urem %201, %195 : i64\n    %203 = llvm.sub %201, %202 : i64\n    %204 = llvm.inttoptr %203 : i64 to !llvm.ptr\n    %205 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %206 = llvm.insertvalue %197, %205[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %207 = llvm.insertvalue %204, %206[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %208 = llvm.mlir.constant(0 : index) : i64\n    %209 = llvm.insertvalue %208, %207[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %210 = llvm.insertvalue %185, %209[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %211 = llvm.insertvalue %186, %210[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %212 = llvm.insertvalue %187, %211[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %213 = llvm.insertvalue %188, %212[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %214 = llvm.insertvalue %190, %213[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %215 = llvm.insertvalue %187, %214[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %216 = llvm.insertvalue %188, %215[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %217 = llvm.insertvalue %189, %216[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.br ^bb34(%4 : i64)\n  ^bb34(%218: i64):  // 2 preds: ^bb33, ^bb44\n    %219 = builtin.unrealized_conversion_cast %218 : i64 to index\n    %220 = builtin.unrealized_conversion_cast %219 : index to i64\n    %221 = builtin.unrealized_conversion_cast %219 : index to i64\n    %222 = llvm.icmp \"slt\" %221, %3 : i64\n    llvm.cond_br %222, ^bb35, ^bb45\n  ^bb35:  // pred: ^bb34\n    llvm.br ^bb36(%4 : i64)\n  ^bb36(%223: i64):  // 2 preds: ^bb35, ^bb43\n    %224 = builtin.unrealized_conversion_cast %223 : i64 to index\n    %225 = builtin.unrealized_conversion_cast %224 : index to i64\n    %226 = builtin.unrealized_conversion_cast %224 : index to i64\n    %227 = llvm.icmp \"slt\" %226, %2 : i64\n    llvm.cond_br %227, ^bb37, ^bb44\n  ^bb37:  // pred: ^bb36\n    llvm.br ^bb38(%4 : i64)\n  ^bb38(%228: i64):  // 2 preds: ^bb37, ^bb42\n    %229 = builtin.unrealized_conversion_cast %228 : i64 to index\n    %230 = builtin.unrealized_conversion_cast %229 : index to i64\n    %231 = builtin.unrealized_conversion_cast %229 : index to i64\n    %232 = llvm.icmp \"slt\" %231, %2 : i64\n    llvm.cond_br %232, ^bb39, ^bb43\n  ^bb39:  // pred: ^bb38\n    llvm.br ^bb40(%4 : i64)\n  ^bb40(%233: i64):  // 2 preds: ^bb39, ^bb41\n    %234 = builtin.unrealized_conversion_cast %233 : i64 to index\n    %235 = builtin.unrealized_conversion_cast %234 : index to i64\n    %236 = builtin.unrealized_conversion_cast %234 : index to i64\n    %237 = llvm.icmp \"slt\" %236, %3 : i64\n    llvm.cond_br %237, ^bb41, ^bb42\n  ^bb41:  // pred: ^bb40\n    %238 = llvm.extractvalue %66[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %239 = llvm.mlir.constant(4 : index) : i64\n    %240 = llvm.mul %220, %239 overflow<nsw, nuw> : i64\n    %241 = llvm.mlir.constant(2 : index) : i64\n    %242 = llvm.mul %225, %241 overflow<nsw, nuw> : i64\n    %243 = llvm.add %240, %242 overflow<nsw, nuw> : i64\n    %244 = llvm.add %243, %230 overflow<nsw, nuw> : i64\n    %245 = llvm.add %244, %235 overflow<nsw, nuw> : i64\n    %246 = llvm.getelementptr inbounds|nuw %238[%245] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %247 = llvm.load %246 : !llvm.ptr -> f32\n    %248 = llvm.fadd %247, %0 : f32\n    %249 = llvm.extractvalue %217[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %250 = llvm.mlir.constant(4 : index) : i64\n    %251 = llvm.mul %220, %250 overflow<nsw, nuw> : i64\n    %252 = llvm.mlir.constant(2 : index) : i64\n    %253 = llvm.mul %225, %252 overflow<nsw, nuw> : i64\n    %254 = llvm.add %251, %253 overflow<nsw, nuw> : i64\n    %255 = llvm.add %254, %230 overflow<nsw, nuw> : i64\n    %256 = llvm.add %255, %235 overflow<nsw, nuw> : i64\n    %257 = llvm.getelementptr inbounds|nuw %249[%256] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %248, %257 : f32, !llvm.ptr\n    %258 = llvm.add %236, %3 : i64\n    %259 = builtin.unrealized_conversion_cast %258 : i64 to index\n    llvm.br ^bb40(%258 : i64)\n  ^bb42:  // pred: ^bb40\n    %260 = llvm.add %231, %3 : i64\n    %261 = builtin.unrealized_conversion_cast %260 : i64 to index\n    llvm.br ^bb38(%260 : i64)\n  ^bb43:  // pred: ^bb38\n    %262 = llvm.add %226, %3 : i64\n    %263 = builtin.unrealized_conversion_cast %262 : i64 to index\n    llvm.br ^bb36(%262 : i64)\n  ^bb44:  // pred: ^bb36\n    %264 = llvm.add %221, %3 : i64\n    %265 = builtin.unrealized_conversion_cast %264 : i64 to index\n    llvm.br ^bb34(%264 : i64)\n  ^bb45:  // pred: ^bb34\n    %266 = llvm.mlir.constant(1 : index) : i64\n    %267 = llvm.mlir.constant(2 : index) : i64\n    %268 = llvm.mlir.constant(2 : index) : i64\n    %269 = llvm.mlir.constant(1 : index) : i64\n    %270 = llvm.mlir.constant(1 : index) : i64\n    %271 = llvm.mlir.constant(4 : index) : i64\n    %272 = llvm.mlir.constant(4 : index) : i64\n    %273 = llvm.mlir.zero : !llvm.ptr\n    %274 = llvm.getelementptr %273[%272] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %275 = llvm.ptrtoint %274 : !llvm.ptr to i64\n    %276 = llvm.mlir.constant(64 : index) : i64\n    %277 = llvm.add %275, %276 : i64\n    %278 = llvm.call @malloc(%277) : (i64) -> !llvm.ptr\n    %279 = llvm.ptrtoint %278 : !llvm.ptr to i64\n    %280 = llvm.mlir.constant(1 : index) : i64\n    %281 = llvm.sub %276, %280 : i64\n    %282 = llvm.add %279, %281 : i64\n    %283 = llvm.urem %282, %276 : i64\n    %284 = llvm.sub %282, %283 : i64\n    %285 = llvm.inttoptr %284 : i64 to !llvm.ptr\n    %286 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %287 = llvm.insertvalue %278, %286[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %288 = llvm.insertvalue %285, %287[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %289 = llvm.mlir.constant(0 : index) : i64\n    %290 = llvm.insertvalue %289, %288[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %291 = llvm.insertvalue %266, %290[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %292 = llvm.insertvalue %267, %291[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %293 = llvm.insertvalue %268, %292[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %294 = llvm.insertvalue %269, %293[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %295 = llvm.insertvalue %271, %294[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %296 = llvm.insertvalue %268, %295[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %297 = llvm.insertvalue %269, %296[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %298 = llvm.insertvalue %270, %297[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.br ^bb46(%4 : i64)\n  ^bb46(%299: i64):  // 2 preds: ^bb45, ^bb56\n    %300 = builtin.unrealized_conversion_cast %299 : i64 to index\n    %301 = builtin.unrealized_conversion_cast %300 : index to i64\n    %302 = builtin.unrealized_conversion_cast %300 : index to i64\n    %303 = llvm.icmp \"slt\" %302, %3 : i64\n    llvm.cond_br %303, ^bb47, ^bb57\n  ^bb47:  // pred: ^bb46\n    llvm.br ^bb48(%4 : i64)\n  ^bb48(%304: i64):  // 2 preds: ^bb47, ^bb55\n    %305 = builtin.unrealized_conversion_cast %304 : i64 to index\n    %306 = builtin.unrealized_conversion_cast %305 : index to i64\n    %307 = builtin.unrealized_conversion_cast %305 : index to i64\n    %308 = llvm.icmp \"slt\" %307, %2 : i64\n    llvm.cond_br %308, ^bb49, ^bb56\n  ^bb49:  // pred: ^bb48\n    llvm.br ^bb50(%4 : i64)\n  ^bb50(%309: i64):  // 2 preds: ^bb49, ^bb54\n    %310 = builtin.unrealized_conversion_cast %309 : i64 to index\n    %311 = builtin.unrealized_conversion_cast %310 : index to i64\n    %312 = builtin.unrealized_conversion_cast %310 : index to i64\n    %313 = llvm.icmp \"slt\" %312, %2 : i64\n    llvm.cond_br %313, ^bb51, ^bb55\n  ^bb51:  // pred: ^bb50\n    llvm.br ^bb52(%4 : i64)\n  ^bb52(%314: i64):  // 2 preds: ^bb51, ^bb53\n    %315 = builtin.unrealized_conversion_cast %314 : i64 to index\n    %316 = builtin.unrealized_conversion_cast %315 : index to i64\n    %317 = builtin.unrealized_conversion_cast %315 : index to i64\n    %318 = llvm.icmp \"slt\" %317, %3 : i64\n    llvm.cond_br %318, ^bb53, ^bb54\n  ^bb53:  // pred: ^bb52\n    %319 = llvm.extractvalue %217[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %320 = llvm.mlir.constant(4 : index) : i64\n    %321 = llvm.mul %301, %320 overflow<nsw, nuw> : i64\n    %322 = llvm.mlir.constant(2 : index) : i64\n    %323 = llvm.mul %306, %322 overflow<nsw, nuw> : i64\n    %324 = llvm.add %321, %323 overflow<nsw, nuw> : i64\n    %325 = llvm.add %324, %311 overflow<nsw, nuw> : i64\n    %326 = llvm.add %325, %316 overflow<nsw, nuw> : i64\n    %327 = llvm.getelementptr inbounds|nuw %319[%326] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %328 = llvm.load %327 : !llvm.ptr -> f32\n    %329 = llvm.intr.maximum(%328, %6) : (f32, f32) -> f32\n    %330 = llvm.extractvalue %298[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %331 = llvm.mlir.constant(4 : index) : i64\n    %332 = llvm.mul %301, %331 overflow<nsw, nuw> : i64\n    %333 = llvm.mlir.constant(2 : index) : i64\n    %334 = llvm.mul %306, %333 overflow<nsw, nuw> : i64\n    %335 = llvm.add %332, %334 overflow<nsw, nuw> : i64\n    %336 = llvm.add %335, %311 overflow<nsw, nuw> : i64\n    %337 = llvm.add %336, %316 overflow<nsw, nuw> : i64\n    %338 = llvm.getelementptr inbounds|nuw %330[%337] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %329, %338 : f32, !llvm.ptr\n    %339 = llvm.add %317, %3 : i64\n    %340 = builtin.unrealized_conversion_cast %339 : i64 to index\n    llvm.br ^bb52(%339 : i64)\n  ^bb54:  // pred: ^bb52\n    %341 = llvm.add %312, %3 : i64\n    %342 = builtin.unrealized_conversion_cast %341 : i64 to index\n    llvm.br ^bb50(%341 : i64)\n  ^bb55:  // pred: ^bb50\n    %343 = llvm.add %307, %3 : i64\n    %344 = builtin.unrealized_conversion_cast %343 : i64 to index\n    llvm.br ^bb48(%343 : i64)\n  ^bb56:  // pred: ^bb48\n    %345 = llvm.add %302, %3 : i64\n    %346 = builtin.unrealized_conversion_cast %345 : i64 to index\n    llvm.br ^bb46(%345 : i64)\n  ^bb57:  // pred: ^bb46\n    %347 = llvm.mlir.constant(1 : index) : i64\n    %348 = llvm.alloca %347 x !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> : (i64) -> !llvm.ptr\n    llvm.store %298, %348 : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>, !llvm.ptr\n    %349 = llvm.mlir.constant(4 : index) : i64\n    %350 = llvm.mlir.poison : !llvm.struct<(i64, ptr)>\n    %351 = llvm.insertvalue %349, %350[0] : !llvm.struct<(i64, ptr)> \n    %352 = llvm.insertvalue %348, %351[1] : !llvm.struct<(i64, ptr)> \n    %353 = builtin.unrealized_conversion_cast %352 : !llvm.struct<(i64, ptr)> to memref<*xf32>\n    %354 = llvm.extractvalue %352[0] : !llvm.struct<(i64, ptr)> \n    %355 = llvm.extractvalue %352[1] : !llvm.struct<(i64, ptr)> \n    llvm.call @printMemrefF32(%354, %355) : (i64, !llvm.ptr) -> ()\n    %356 = llvm.extractvalue %66[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%356) : (!llvm.ptr) -> ()\n    %357 = llvm.extractvalue %217[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%357) : (!llvm.ptr) -> ()\n    %358 = llvm.extractvalue %298[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%358) : (!llvm.ptr) -> ()\n    llvm.return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-18-convertcontrolflowtollvmpass",
      "kind": "pass-event",
      "title": "ConvertControlFlowToLLVMPass (convert-cf-to-llvm)",
      "pass": "ConvertControlFlowToLLVMPass (convert-cf-to-llvm)",
      "index": 18,
      "changed": true,
      "before": "nano-ir-17-convertfunctollvmpass",
      "after": "nano-ir-18-convertcontrolflowtollvmpass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-ir-19-reconcileunrealizedcastspass",
      "kind": "ir-snapshot",
      "title": "IR after ReconcileUnrealizedCastsPass (reconcile-unrealized-casts)",
      "stage": "llvm",
      "text": "module {\n  llvm.func @free(!llvm.ptr)\n  llvm.func @malloc(i64) -> !llvm.ptr\n  llvm.mlir.global private constant @__constant_1x2x2x1xf32(dense<-6.000000e+01> : tensor<1x2x2x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<2 x array<2 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_3x3x1x1xf32(dense<1.000000e+00> : tensor<3x3x1x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<3 x array<3 x array<1 x array<1 x f32>>>>\n  llvm.mlir.global private constant @__constant_1x4x4x1xf32(dense<[[[[1.000000e+00], [2.000000e+00], [3.000000e+00], [4.000000e+00]], [[5.000000e+00], [6.000000e+00], [7.000000e+00], [8.000000e+00]], [[9.000000e+00], [1.000000e+01], [1.100000e+01], [1.200000e+01]], [[1.300000e+01], [1.400000e+01], [1.500000e+01], [1.600000e+01]]]]> : tensor<1x4x4x1xf32>) {addr_space = 0 : i32, alignment = 64 : i64} : !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n  llvm.func @printMemrefF32(i64, !llvm.ptr) attributes {sym_visibility = \"private\"}\n  llvm.func @main() {\n    %0 = llvm.mlir.constant(-6.000000e+01 : f32) : f32\n    %1 = llvm.mlir.constant(3 : index) : i64\n    %2 = llvm.mlir.constant(2 : index) : i64\n    %3 = llvm.mlir.constant(1 : index) : i64\n    %4 = llvm.mlir.constant(0 : index) : i64\n    %5 = llvm.mlir.constant(0.000000e+00 : f32) : f32\n    %6 = llvm.mlir.constant(1 : index) : i64\n    %7 = llvm.mlir.constant(4 : index) : i64\n    %8 = llvm.mlir.constant(4 : index) : i64\n    %9 = llvm.mlir.constant(1 : index) : i64\n    %10 = llvm.mlir.constant(1 : index) : i64\n    %11 = llvm.mlir.constant(16 : index) : i64\n    %12 = llvm.mlir.constant(16 : index) : i64\n    %13 = llvm.mlir.zero : !llvm.ptr\n    %14 = llvm.getelementptr %13[%12] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %15 = llvm.ptrtoint %14 : !llvm.ptr to i64\n    %16 = llvm.mlir.addressof @__constant_1x4x4x1xf32 : !llvm.ptr\n    %17 = llvm.getelementptr %16[0, 0, 0, 0, 0] : (!llvm.ptr) -> !llvm.ptr, !llvm.array<1 x array<4 x array<4 x array<1 x f32>>>>\n    %18 = llvm.mlir.constant(3735928559 : index) : i64\n    %19 = llvm.inttoptr %18 : i64 to !llvm.ptr\n    %20 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %21 = llvm.insertvalue %19, %20[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %22 = llvm.insertvalue %17, %21[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %23 = llvm.mlir.constant(0 : index) : i64\n    %24 = llvm.insertvalue %23, %22[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %25 = llvm.insertvalue %6, %24[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %26 = llvm.insertvalue %7, %25[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %27 = llvm.insertvalue %8, %26[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %28 = llvm.insertvalue %9, %27[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %29 = llvm.insertvalue %11, %28[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %30 = llvm.insertvalue %8, %29[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %31 = llvm.insertvalue %9, %30[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %32 = llvm.insertvalue %10, %31[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %33 = llvm.mlir.constant(1 : index) : i64\n    %34 = llvm.mlir.constant(2 : index) : i64\n    %35 = llvm.mlir.constant(2 : index) : i64\n    %36 = llvm.mlir.constant(1 : index) : i64\n    %37 = llvm.mlir.constant(1 : index) : i64\n    %38 = llvm.mlir.constant(4 : index) : i64\n    %39 = llvm.mlir.constant(4 : index) : i64\n    %40 = llvm.mlir.zero : !llvm.ptr\n    %41 = llvm.getelementptr %40[%39] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %42 = llvm.ptrtoint %41 : !llvm.ptr to i64\n    %43 = llvm.mlir.constant(64 : index) : i64\n    %44 = llvm.add %42, %43 : i64\n    %45 = llvm.call @malloc(%44) : (i64) -> !llvm.ptr\n    %46 = llvm.ptrtoint %45 : !llvm.ptr to i64\n    %47 = llvm.mlir.constant(1 : index) : i64\n    %48 = llvm.sub %43, %47 : i64\n    %49 = llvm.add %46, %48 : i64\n    %50 = llvm.urem %49, %43 : i64\n    %51 = llvm.sub %49, %50 : i64\n    %52 = llvm.inttoptr %51 : i64 to !llvm.ptr\n    %53 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %54 = llvm.insertvalue %45, %53[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %55 = llvm.insertvalue %52, %54[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %56 = llvm.mlir.constant(0 : index) : i64\n    %57 = llvm.insertvalue %56, %55[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %58 = llvm.insertvalue %33, %57[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %59 = llvm.insertvalue %34, %58[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %60 = llvm.insertvalue %35, %59[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %61 = llvm.insertvalue %36, %60[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %62 = llvm.insertvalue %38, %61[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %63 = llvm.insertvalue %35, %62[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %64 = llvm.insertvalue %36, %63[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %65 = llvm.insertvalue %37, %64[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.br ^bb1(%4 : i64)\n  ^bb1(%66: i64):  // 2 preds: ^bb0, ^bb11\n    %67 = llvm.icmp \"slt\" %66, %3 : i64\n    llvm.cond_br %67, ^bb2, ^bb12\n  ^bb2:  // pred: ^bb1\n    llvm.br ^bb3(%4 : i64)\n  ^bb3(%68: i64):  // 2 preds: ^bb2, ^bb10\n    %69 = llvm.icmp \"slt\" %68, %2 : i64\n    llvm.cond_br %69, ^bb4, ^bb11\n  ^bb4:  // pred: ^bb3\n    llvm.br ^bb5(%4 : i64)\n  ^bb5(%70: i64):  // 2 preds: ^bb4, ^bb9\n    %71 = llvm.icmp \"slt\" %70, %2 : i64\n    llvm.cond_br %71, ^bb6, ^bb10\n  ^bb6:  // pred: ^bb5\n    llvm.br ^bb7(%4 : i64)\n  ^bb7(%72: i64):  // 2 preds: ^bb6, ^bb8\n    %73 = llvm.icmp \"slt\" %72, %3 : i64\n    llvm.cond_br %73, ^bb8, ^bb9\n  ^bb8:  // pred: ^bb7\n    %74 = llvm.extractvalue %65[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %75 = llvm.mlir.constant(4 : index) : i64\n    %76 = llvm.mul %66, %75 overflow<nsw, nuw> : i64\n    %77 = llvm.mlir.constant(2 : index) : i64\n    %78 = llvm.mul %68, %77 overflow<nsw, nuw> : i64\n    %79 = llvm.add %76, %78 overflow<nsw, nuw> : i64\n    %80 = llvm.add %79, %70 overflow<nsw, nuw> : i64\n    %81 = llvm.add %80, %72 overflow<nsw, nuw> : i64\n    %82 = llvm.getelementptr inbounds|nuw %74[%81] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %5, %82 : f32, !llvm.ptr\n    %83 = llvm.add %72, %3 : i64\n    llvm.br ^bb7(%83 : i64)\n  ^bb9:  // pred: ^bb7\n    %84 = llvm.add %70, %3 : i64\n    llvm.br ^bb5(%84 : i64)\n  ^bb10:  // pred: ^bb5\n    %85 = llvm.add %68, %3 : i64\n    llvm.br ^bb3(%85 : i64)\n  ^bb11:  // pred: ^bb3\n    %86 = llvm.add %66, %3 : i64\n    llvm.br ^bb1(%86 : i64)\n  ^bb12:  // pred: ^bb1\n    llvm.br ^bb13(%4 : i64)\n  ^bb13(%87: i64):  // 2 preds: ^bb12, ^bb32\n    %88 = llvm.icmp \"slt\" %87, %3 : i64\n    llvm.cond_br %88, ^bb14, ^bb33\n  ^bb14:  // pred: ^bb13\n    llvm.br ^bb15(%4 : i64)\n  ^bb15(%89: i64):  // 2 preds: ^bb14, ^bb31\n    %90 = llvm.icmp \"slt\" %89, %2 : i64\n    llvm.cond_br %90, ^bb16, ^bb32\n  ^bb16:  // pred: ^bb15\n    llvm.br ^bb17(%4 : i64)\n  ^bb17(%91: i64):  // 2 preds: ^bb16, ^bb30\n    %92 = llvm.icmp \"slt\" %91, %2 : i64\n    llvm.cond_br %92, ^bb18, ^bb31\n  ^bb18:  // pred: ^bb17\n    llvm.br ^bb19(%4 : i64)\n  ^bb19(%93: i64):  // 2 preds: ^bb18, ^bb29\n    %94 = llvm.icmp \"slt\" %93, %3 : i64\n    llvm.cond_br %94, ^bb20, ^bb30\n  ^bb20:  // pred: ^bb19\n    llvm.br ^bb21(%4 : i64)\n  ^bb21(%95: i64):  // 2 preds: ^bb20, ^bb28\n    %96 = llvm.icmp \"slt\" %95, %1 : i64\n    llvm.cond_br %96, ^bb22, ^bb29\n  ^bb22:  // pred: ^bb21\n    llvm.br ^bb23(%4 : i64)\n  ^bb23(%97: i64):  // 2 preds: ^bb22, ^bb27\n    %98 = llvm.icmp \"slt\" %97, %1 : i64\n    llvm.cond_br %98, ^bb24, ^bb28\n  ^bb24:  // pred: ^bb23\n    llvm.br ^bb25(%4 : i64)\n  ^bb25(%99: i64):  // 2 preds: ^bb24, ^bb26\n    %100 = llvm.icmp \"slt\" %99, %3 : i64\n    llvm.cond_br %100, ^bb26, ^bb27\n  ^bb26:  // pred: ^bb25\n    %101 = llvm.add %89, %95 : i64\n    %102 = llvm.add %91, %97 : i64\n    %103 = llvm.extractvalue %32[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %104 = llvm.mlir.constant(16 : index) : i64\n    %105 = llvm.mul %87, %104 overflow<nsw, nuw> : i64\n    %106 = llvm.mlir.constant(4 : index) : i64\n    %107 = llvm.mul %101, %106 overflow<nsw, nuw> : i64\n    %108 = llvm.add %105, %107 overflow<nsw, nuw> : i64\n    %109 = llvm.add %108, %102 overflow<nsw, nuw> : i64\n    %110 = llvm.add %109, %99 overflow<nsw, nuw> : i64\n    %111 = llvm.getelementptr inbounds|nuw %103[%110] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %112 = llvm.load %111 : !llvm.ptr -> f32\n    %113 = llvm.extractvalue %65[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %114 = llvm.mlir.constant(4 : index) : i64\n    %115 = llvm.mul %87, %114 overflow<nsw, nuw> : i64\n    %116 = llvm.mlir.constant(2 : index) : i64\n    %117 = llvm.mul %89, %116 overflow<nsw, nuw> : i64\n    %118 = llvm.add %115, %117 overflow<nsw, nuw> : i64\n    %119 = llvm.add %118, %91 overflow<nsw, nuw> : i64\n    %120 = llvm.add %119, %93 overflow<nsw, nuw> : i64\n    %121 = llvm.getelementptr inbounds|nuw %113[%120] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %122 = llvm.load %121 : !llvm.ptr -> f32\n    %123 = llvm.fadd %122, %112 : f32\n    %124 = llvm.extractvalue %65[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %125 = llvm.mlir.constant(4 : index) : i64\n    %126 = llvm.mul %87, %125 overflow<nsw, nuw> : i64\n    %127 = llvm.mlir.constant(2 : index) : i64\n    %128 = llvm.mul %89, %127 overflow<nsw, nuw> : i64\n    %129 = llvm.add %126, %128 overflow<nsw, nuw> : i64\n    %130 = llvm.add %129, %91 overflow<nsw, nuw> : i64\n    %131 = llvm.add %130, %93 overflow<nsw, nuw> : i64\n    %132 = llvm.getelementptr inbounds|nuw %124[%131] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %123, %132 : f32, !llvm.ptr\n    %133 = llvm.add %99, %3 : i64\n    llvm.br ^bb25(%133 : i64)\n  ^bb27:  // pred: ^bb25\n    %134 = llvm.add %97, %3 : i64\n    llvm.br ^bb23(%134 : i64)\n  ^bb28:  // pred: ^bb23\n    %135 = llvm.add %95, %3 : i64\n    llvm.br ^bb21(%135 : i64)\n  ^bb29:  // pred: ^bb21\n    %136 = llvm.add %93, %3 : i64\n    llvm.br ^bb19(%136 : i64)\n  ^bb30:  // pred: ^bb19\n    %137 = llvm.add %91, %3 : i64\n    llvm.br ^bb17(%137 : i64)\n  ^bb31:  // pred: ^bb17\n    %138 = llvm.add %89, %3 : i64\n    llvm.br ^bb15(%138 : i64)\n  ^bb32:  // pred: ^bb15\n    %139 = llvm.add %87, %3 : i64\n    llvm.br ^bb13(%139 : i64)\n  ^bb33:  // pred: ^bb13\n    %140 = llvm.mlir.constant(1 : index) : i64\n    %141 = llvm.mlir.constant(2 : index) : i64\n    %142 = llvm.mlir.constant(2 : index) : i64\n    %143 = llvm.mlir.constant(1 : index) : i64\n    %144 = llvm.mlir.constant(1 : index) : i64\n    %145 = llvm.mlir.constant(4 : index) : i64\n    %146 = llvm.mlir.constant(4 : index) : i64\n    %147 = llvm.mlir.zero : !llvm.ptr\n    %148 = llvm.getelementptr %147[%146] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %149 = llvm.ptrtoint %148 : !llvm.ptr to i64\n    %150 = llvm.mlir.constant(64 : index) : i64\n    %151 = llvm.add %149, %150 : i64\n    %152 = llvm.call @malloc(%151) : (i64) -> !llvm.ptr\n    %153 = llvm.ptrtoint %152 : !llvm.ptr to i64\n    %154 = llvm.mlir.constant(1 : index) : i64\n    %155 = llvm.sub %150, %154 : i64\n    %156 = llvm.add %153, %155 : i64\n    %157 = llvm.urem %156, %150 : i64\n    %158 = llvm.sub %156, %157 : i64\n    %159 = llvm.inttoptr %158 : i64 to !llvm.ptr\n    %160 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %161 = llvm.insertvalue %152, %160[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %162 = llvm.insertvalue %159, %161[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %163 = llvm.mlir.constant(0 : index) : i64\n    %164 = llvm.insertvalue %163, %162[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %165 = llvm.insertvalue %140, %164[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %166 = llvm.insertvalue %141, %165[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %167 = llvm.insertvalue %142, %166[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %168 = llvm.insertvalue %143, %167[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %169 = llvm.insertvalue %145, %168[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %170 = llvm.insertvalue %142, %169[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %171 = llvm.insertvalue %143, %170[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %172 = llvm.insertvalue %144, %171[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.br ^bb34(%4 : i64)\n  ^bb34(%173: i64):  // 2 preds: ^bb33, ^bb44\n    %174 = llvm.icmp \"slt\" %173, %3 : i64\n    llvm.cond_br %174, ^bb35, ^bb45\n  ^bb35:  // pred: ^bb34\n    llvm.br ^bb36(%4 : i64)\n  ^bb36(%175: i64):  // 2 preds: ^bb35, ^bb43\n    %176 = llvm.icmp \"slt\" %175, %2 : i64\n    llvm.cond_br %176, ^bb37, ^bb44\n  ^bb37:  // pred: ^bb36\n    llvm.br ^bb38(%4 : i64)\n  ^bb38(%177: i64):  // 2 preds: ^bb37, ^bb42\n    %178 = llvm.icmp \"slt\" %177, %2 : i64\n    llvm.cond_br %178, ^bb39, ^bb43\n  ^bb39:  // pred: ^bb38\n    llvm.br ^bb40(%4 : i64)\n  ^bb40(%179: i64):  // 2 preds: ^bb39, ^bb41\n    %180 = llvm.icmp \"slt\" %179, %3 : i64\n    llvm.cond_br %180, ^bb41, ^bb42\n  ^bb41:  // pred: ^bb40\n    %181 = llvm.extractvalue %65[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %182 = llvm.mlir.constant(4 : index) : i64\n    %183 = llvm.mul %173, %182 overflow<nsw, nuw> : i64\n    %184 = llvm.mlir.constant(2 : index) : i64\n    %185 = llvm.mul %175, %184 overflow<nsw, nuw> : i64\n    %186 = llvm.add %183, %185 overflow<nsw, nuw> : i64\n    %187 = llvm.add %186, %177 overflow<nsw, nuw> : i64\n    %188 = llvm.add %187, %179 overflow<nsw, nuw> : i64\n    %189 = llvm.getelementptr inbounds|nuw %181[%188] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %190 = llvm.load %189 : !llvm.ptr -> f32\n    %191 = llvm.fadd %190, %0 : f32\n    %192 = llvm.extractvalue %172[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %193 = llvm.mlir.constant(4 : index) : i64\n    %194 = llvm.mul %173, %193 overflow<nsw, nuw> : i64\n    %195 = llvm.mlir.constant(2 : index) : i64\n    %196 = llvm.mul %175, %195 overflow<nsw, nuw> : i64\n    %197 = llvm.add %194, %196 overflow<nsw, nuw> : i64\n    %198 = llvm.add %197, %177 overflow<nsw, nuw> : i64\n    %199 = llvm.add %198, %179 overflow<nsw, nuw> : i64\n    %200 = llvm.getelementptr inbounds|nuw %192[%199] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %191, %200 : f32, !llvm.ptr\n    %201 = llvm.add %179, %3 : i64\n    llvm.br ^bb40(%201 : i64)\n  ^bb42:  // pred: ^bb40\n    %202 = llvm.add %177, %3 : i64\n    llvm.br ^bb38(%202 : i64)\n  ^bb43:  // pred: ^bb38\n    %203 = llvm.add %175, %3 : i64\n    llvm.br ^bb36(%203 : i64)\n  ^bb44:  // pred: ^bb36\n    %204 = llvm.add %173, %3 : i64\n    llvm.br ^bb34(%204 : i64)\n  ^bb45:  // pred: ^bb34\n    %205 = llvm.mlir.constant(1 : index) : i64\n    %206 = llvm.mlir.constant(2 : index) : i64\n    %207 = llvm.mlir.constant(2 : index) : i64\n    %208 = llvm.mlir.constant(1 : index) : i64\n    %209 = llvm.mlir.constant(1 : index) : i64\n    %210 = llvm.mlir.constant(4 : index) : i64\n    %211 = llvm.mlir.constant(4 : index) : i64\n    %212 = llvm.mlir.zero : !llvm.ptr\n    %213 = llvm.getelementptr %212[%211] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %214 = llvm.ptrtoint %213 : !llvm.ptr to i64\n    %215 = llvm.mlir.constant(64 : index) : i64\n    %216 = llvm.add %214, %215 : i64\n    %217 = llvm.call @malloc(%216) : (i64) -> !llvm.ptr\n    %218 = llvm.ptrtoint %217 : !llvm.ptr to i64\n    %219 = llvm.mlir.constant(1 : index) : i64\n    %220 = llvm.sub %215, %219 : i64\n    %221 = llvm.add %218, %220 : i64\n    %222 = llvm.urem %221, %215 : i64\n    %223 = llvm.sub %221, %222 : i64\n    %224 = llvm.inttoptr %223 : i64 to !llvm.ptr\n    %225 = llvm.mlir.poison : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>\n    %226 = llvm.insertvalue %217, %225[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %227 = llvm.insertvalue %224, %226[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %228 = llvm.mlir.constant(0 : index) : i64\n    %229 = llvm.insertvalue %228, %227[2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %230 = llvm.insertvalue %205, %229[3, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %231 = llvm.insertvalue %206, %230[3, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %232 = llvm.insertvalue %207, %231[3, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %233 = llvm.insertvalue %208, %232[3, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %234 = llvm.insertvalue %210, %233[4, 0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %235 = llvm.insertvalue %207, %234[4, 1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %236 = llvm.insertvalue %208, %235[4, 2] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %237 = llvm.insertvalue %209, %236[4, 3] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.br ^bb46(%4 : i64)\n  ^bb46(%238: i64):  // 2 preds: ^bb45, ^bb56\n    %239 = llvm.icmp \"slt\" %238, %3 : i64\n    llvm.cond_br %239, ^bb47, ^bb57\n  ^bb47:  // pred: ^bb46\n    llvm.br ^bb48(%4 : i64)\n  ^bb48(%240: i64):  // 2 preds: ^bb47, ^bb55\n    %241 = llvm.icmp \"slt\" %240, %2 : i64\n    llvm.cond_br %241, ^bb49, ^bb56\n  ^bb49:  // pred: ^bb48\n    llvm.br ^bb50(%4 : i64)\n  ^bb50(%242: i64):  // 2 preds: ^bb49, ^bb54\n    %243 = llvm.icmp \"slt\" %242, %2 : i64\n    llvm.cond_br %243, ^bb51, ^bb55\n  ^bb51:  // pred: ^bb50\n    llvm.br ^bb52(%4 : i64)\n  ^bb52(%244: i64):  // 2 preds: ^bb51, ^bb53\n    %245 = llvm.icmp \"slt\" %244, %3 : i64\n    llvm.cond_br %245, ^bb53, ^bb54\n  ^bb53:  // pred: ^bb52\n    %246 = llvm.extractvalue %172[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %247 = llvm.mlir.constant(4 : index) : i64\n    %248 = llvm.mul %238, %247 overflow<nsw, nuw> : i64\n    %249 = llvm.mlir.constant(2 : index) : i64\n    %250 = llvm.mul %240, %249 overflow<nsw, nuw> : i64\n    %251 = llvm.add %248, %250 overflow<nsw, nuw> : i64\n    %252 = llvm.add %251, %242 overflow<nsw, nuw> : i64\n    %253 = llvm.add %252, %244 overflow<nsw, nuw> : i64\n    %254 = llvm.getelementptr inbounds|nuw %246[%253] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    %255 = llvm.load %254 : !llvm.ptr -> f32\n    %256 = llvm.intr.maximum(%255, %5) : (f32, f32) -> f32\n    %257 = llvm.extractvalue %237[1] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    %258 = llvm.mlir.constant(4 : index) : i64\n    %259 = llvm.mul %238, %258 overflow<nsw, nuw> : i64\n    %260 = llvm.mlir.constant(2 : index) : i64\n    %261 = llvm.mul %240, %260 overflow<nsw, nuw> : i64\n    %262 = llvm.add %259, %261 overflow<nsw, nuw> : i64\n    %263 = llvm.add %262, %242 overflow<nsw, nuw> : i64\n    %264 = llvm.add %263, %244 overflow<nsw, nuw> : i64\n    %265 = llvm.getelementptr inbounds|nuw %257[%264] : (!llvm.ptr, i64) -> !llvm.ptr, f32\n    llvm.store %256, %265 : f32, !llvm.ptr\n    %266 = llvm.add %244, %3 : i64\n    llvm.br ^bb52(%266 : i64)\n  ^bb54:  // pred: ^bb52\n    %267 = llvm.add %242, %3 : i64\n    llvm.br ^bb50(%267 : i64)\n  ^bb55:  // pred: ^bb50\n    %268 = llvm.add %240, %3 : i64\n    llvm.br ^bb48(%268 : i64)\n  ^bb56:  // pred: ^bb48\n    %269 = llvm.add %238, %3 : i64\n    llvm.br ^bb46(%269 : i64)\n  ^bb57:  // pred: ^bb46\n    %270 = llvm.mlir.constant(1 : index) : i64\n    %271 = llvm.alloca %270 x !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> : (i64) -> !llvm.ptr\n    llvm.store %237, %271 : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)>, !llvm.ptr\n    %272 = llvm.mlir.constant(4 : index) : i64\n    %273 = llvm.mlir.poison : !llvm.struct<(i64, ptr)>\n    %274 = llvm.insertvalue %272, %273[0] : !llvm.struct<(i64, ptr)> \n    %275 = llvm.insertvalue %271, %274[1] : !llvm.struct<(i64, ptr)> \n    %276 = llvm.extractvalue %275[0] : !llvm.struct<(i64, ptr)> \n    %277 = llvm.extractvalue %275[1] : !llvm.struct<(i64, ptr)> \n    llvm.call @printMemrefF32(%276, %277) : (i64, !llvm.ptr) -> ()\n    %278 = llvm.extractvalue %65[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%278) : (!llvm.ptr) -> ()\n    %279 = llvm.extractvalue %172[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%279) : (!llvm.ptr) -> ()\n    %280 = llvm.extractvalue %237[0] : !llvm.struct<(ptr, ptr, i64, array<4 x i64>, array<4 x i64>)> \n    llvm.call @free(%280) : (!llvm.ptr) -> ()\n    llvm.return\n  }\n}",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-pass-19-reconcileunrealizedcastspass",
      "kind": "pass-event",
      "title": "ReconcileUnrealizedCastsPass (reconcile-unrealized-casts)",
      "pass": "ReconcileUnrealizedCastsPass (reconcile-unrealized-casts)",
      "index": 19,
      "changed": true,
      "before": "nano-ir-18-convertcontrolflowtollvmpass",
      "after": "nano-ir-19-reconcileunrealizedcastspass",
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-print-ir-after-all --mlir-print-ir-module-scope --mlir-disable-threading -o /dev/null"
      }
    },
    {
      "id": "nano-execution",
      "kind": "execution",
      "title": "Executed with mlir-runner",
      "exitCode": 0,
      "stdout": "Unranked Memref base@ = 0x7c52d4d540 rank = 4 offset = 0 sizes = [1, 2, 2, 1] strides = [4, 2, 1, 1] data = \n[[[[0], \n   [3]], \n  [[30], \n   [39]]]]",
      "expected": [
        "rank = 4 offset = 0 sizes = [1, 2, 2, 1]",
        "0",
        "3",
        "30",
        "39"
      ],
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts | mlir-runner -e main --entry-point-result=void --shared-libs=$LLVM/lib/libmlir_runner_utils.dylib --shared-libs=$LLVM/lib/libmlir_c_runner_utils.dylib"
      }
    },
    {
      "id": "nano-verifier-diagnostics",
      "kind": "diagnostic",
      "title": "Verifier diagnostics for the invalid-op tests",
      "tool": "nanodsp-opt",
      "exitCode": 1,
      "entries": [
        {
          "severity": "error",
          "message": "'dsp.add' op requires the same type for all operands and results",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 5,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.add\"(%arg0, %arg1) : (tensor<2x3xf32>, tensor<3x2xf32>) -> tensor<2x3xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 5,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.add' op operand #0 must be statically shaped tensor of f32, but got 'tensor<?x3xf32>'",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 13,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.add\"(%arg0, %arg1) : (tensor<?x3xf32>, tensor<?x3xf32>) -> tensor<?x3xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 13,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.add' op operand #0 must be statically shaped tensor of f32, but got 'tensor<2x3xi32>'",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 21,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.add\"(%arg0, %arg1) : (tensor<2x3xi32>, tensor<2x3xi32>) -> tensor<2x3xi32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 21,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.matmul' op contraction dimension mismatch: lhs has K=8 but rhs has K=7",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 29,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.matmul\"(%arg0, %arg1) : (tensor<4x8xf32>, tensor<7x16xf32>) -> tensor<4x16xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 29,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.matmul' op result shape must be 4x16, got 4x15",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 37,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.matmul\"(%arg0, %arg1) : (tensor<4x8xf32>, tensor<8x16xf32>) -> tensor<4x15xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 37,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.matmul' op operand #0 must be statically shaped rank-2 tensor of f32, but got 'tensor<4x8x2xf32>'",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 45,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.matmul\"(%arg0, %arg1) : (tensor<4x8x2xf32>, tensor<8x16xf32>) -> tensor<4x16xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 45,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.conv2d' op channel mismatch: input has C=3 but filter has C=5",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 53,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.conv2d\"(%arg0, %arg1) <{dilations = array<i64: 1, 1>, strides = array<i64: 1, 1>}> : (tensor<1x8x8x3xf32>, tensor<3x3x5x4xf32>) -> tensor<1x6x6x4xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 53,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.conv2d' op result shape must be 1x6x6x1, got 'tensor<1x7x6x1xf32>'",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 61,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.conv2d\"(%arg0, %arg1) <{dilations = array<i64: 1, 1>, strides = array<i64: 1, 1>}> : (tensor<1x8x8x1xf32>, tensor<3x3x1x1xf32>) -> tensor<1x7x6x1xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 61,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.conv2d' op dilated filter 3x3 does not fit in input spatial extent 2x2",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 69,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.conv2d\"(%arg0, %arg1) <{dilations = array<i64: 1, 1>, strides = array<i64: 1, 1>}> : (tensor<1x2x2x1xf32>, tensor<3x3x1x1xf32>) -> tensor<1x1x1x1xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 69,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.conv2d' op expected 2 strides, got 3",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 77,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.conv2d\"(%arg0, %arg1) <{dilations = array<i64: 1, 1>, strides = array<i64: 1, 1, 1>}> : (tensor<1x8x8x1xf32>, tensor<3x3x1x1xf32>) -> tensor<1x6x6x1xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 77,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "'dsp.conv2d' op strides must be >= 1, got 0",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 86,
            "column": 8
          }
        },
        {
          "severity": "note",
          "message": "see current operation: %0 = \"dsp.conv2d\"(%arg0, %arg1) <{dilations = array<i64: 1, 1>, strides = array<i64: 0, 1>}> : (tensor<1x8x8x1xf32>, tensor<3x3x1x1xf32>) -> tensor<1x6x6x1xf32>",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 86,
            "column": 8
          }
        },
        {
          "severity": "error",
          "message": "expected error \"requires the same type for all operands and results\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 4,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"op operand #0 must be statically shaped tensor of f32\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 12,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"op operand #0 must be statically shaped tensor of f32\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 20,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"contraction dimension mismatch: lhs has K=8 but rhs has K=7\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 28,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"result shape must be 4x16, got 4x15\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 36,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"op operand #0 must be statically shaped rank-2 tensor of f32\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 44,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"channel mismatch: input has C=3 but filter has C=5\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 52,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"result shape must be 1x6x6x1\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 60,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"dilated filter 3x3 does not fit in input spatial extent 2x2\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 68,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"expected 2 strides, got 3\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 76,
            "column": 6
          }
        },
        {
          "severity": "error",
          "message": "expected error \"strides must be >= 1, got 0\" was not produced",
          "location": {
            "file": "test/Dialect/DSP/invalid.mlir",
            "line": 85,
            "column": 6
          }
        }
      ],
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Dialect/DSP/invalid.mlir -split-input-file -o /dev/null"
      }
    },
    {
      "id": "nano-pass-timing",
      "kind": "profile",
      "title": "Compile-time pass timing",
      "metric": "wall time",
      "unit": "s",
      "total": 0.0071,
      "entries": [
        {
          "name": "Parser",
          "value": 0.001,
          "percent": 14.3,
          "depth": 0
        },
        {
          "name": "ConvertDSPToLinalg",
          "value": 0.0003,
          "percent": 3.9,
          "depth": 0
        },
        {
          "name": "OneShotBufferizePass",
          "value": 0.0003,
          "percent": 4.3,
          "depth": 0
        },
        {
          "name": "ExpandReallocPass",
          "value": 0.0001,
          "percent": 1.2,
          "depth": 0
        },
        {
          "name": "CanonicalizerPass",
          "value": 0.0002,
          "percent": 2.2,
          "depth": 0
        },
        {
          "name": "OwnershipBasedBufferDeallocationPass",
          "value": 0.0001,
          "percent": 1.9,
          "depth": 0
        },
        {
          "name": "CanonicalizerPass",
          "value": 0.0001,
          "percent": 2,
          "depth": 0
        },
        {
          "name": "BufferDeallocationSimplificationPass",
          "value": 0.0001,
          "percent": 1.6,
          "depth": 0
        },
        {
          "name": "LowerDeallocationsPass",
          "value": 0.0001,
          "percent": 1.4,
          "depth": 0
        },
        {
          "name": "CSEPass",
          "value": 0,
          "percent": 0.6,
          "depth": 0
        },
        {
          "name": "(A) DominanceInfo",
          "value": 0,
          "percent": 0,
          "depth": 1
        },
        {
          "name": "CanonicalizerPass",
          "value": 0.0001,
          "percent": 1.9,
          "depth": 0
        },
        {
          "name": "ConvertLinalgToLoopsPass",
          "value": 0.0004,
          "percent": 5.7,
          "depth": 0
        },
        {
          "name": "SCFToControlFlowPass",
          "value": 0.0002,
          "percent": 2.6,
          "depth": 0
        },
        {
          "name": "ExpandStridedMetadataPass",
          "value": 0.0002,
          "percent": 2.8,
          "depth": 0
        },
        {
          "name": "LowerAffinePass",
          "value": 0.0001,
          "percent": 1.9,
          "depth": 0
        },
        {
          "name": "ArithToLLVMConversionPass",
          "value": 0.0004,
          "percent": 5.8,
          "depth": 0
        },
        {
          "name": "FinalizeMemRefToLLVMConversionPass",
          "value": 0.0006,
          "percent": 8,
          "depth": 0
        },
        {
          "name": "(A) DataLayoutAnalysis",
          "value": 0,
          "percent": 0.1,
          "depth": 1
        },
        {
          "name": "ConvertFuncToLLVMPass",
          "value": 0.0003,
          "percent": 4.4,
          "depth": 0
        },
        {
          "name": "(A) DataLayoutAnalysis",
          "value": 0,
          "percent": 0.1,
          "depth": 1
        },
        {
          "name": "ConvertControlFlowToLLVMPass",
          "value": 0.0004,
          "percent": 5.1,
          "depth": 0
        },
        {
          "name": "ReconcileUnrealizedCastsPass",
          "value": 0.0002,
          "percent": 2.5,
          "depth": 0
        },
        {
          "name": "Output",
          "value": 0.0004,
          "percent": 5.3,
          "depth": 0
        },
        {
          "name": "Rest",
          "value": 0.0015,
          "percent": 20.7,
          "depth": 0
        }
      ],
      "provenance": {
        "mode": "captured",
        "command": "nanodsp-opt test/Integration/DSPToLinalg/pipeline.mlir -convert-dsp-to-linalg -one-shot-bufferize=bufferize-function-boundaries -buffer-deallocation-pipeline -convert-linalg-to-loops -convert-scf-to-cf -expand-strided-metadata -lower-affine -convert-arith-to-llvm -finalize-memref-to-llvm -convert-func-to-llvm -convert-cf-to-llvm -reconcile-unrealized-casts --mlir-timing -o /dev/null"
      }
    },
    {
      "id": "nano-mojo-tests",
      "kind": "test-run",
      "title": "Mojo kernel tests",
      "runner": "mojo",
      "passed": 12,
      "failed": 0,
      "errors": 0,
      "skipped": 0,
      "log": "nanodsp: 12 tests passed\n✨ Pixi task (test-mojo): mojo run -I mojo mojo/tests/test_kernels.mojo",
      "provenance": {
        "mode": "captured",
        "command": "pixi run test-mojo"
      }
    },
    {
      "id": "nano-reference-tests",
      "kind": "test-run",
      "title": "C++ reference tests",
      "runner": "c++",
      "passed": 5,
      "failed": 0,
      "errors": 0,
      "skipped": 0,
      "log": "PASS add\nPASS relu\nPASS relu propagates NaN\nPASS matmul\nPASS conv2d",
      "provenance": {
        "mode": "captured",
        "command": "pixi run test-reference"
      }
    },
    {
      "id": "nano-benchmark",
      "kind": "execution",
      "title": "Mojo kernel throughput (untiled, one core, best of 3-5 runs)",
      "exitCode": 0,
      "stdout": "matmul   64 x 64 x 64    0.031 ms   16.91251612903226 GFLOP/s\nmatmul   128 x 128 x 128    0.199 ms   21.076904522613066 GFLOP/s\nmatmul   256 x 256 x 256    1.443 ms   23.25324462924463 GFLOP/s\nmatmul   512 x 512 x 512    13.844 ms   19.39002138110373 GFLOP/s\nconv2d   56 x 56 x 64 -> 64    13.663 ms   15.735259313474346 GFLOP/s\nconv2d   28 x 28 x 128 -> 128    9.178 ms   21.72156373937677 GFLOP/s",
      "provenance": {
        "mode": "captured",
        "command": "pixi run bench"
      }
    }
  ]
}
