nod-ai / SHARK-TestSuite

Temporary home of a test suite we are evaluating
Apache License 2.0
2 stars 29 forks source link

bart-large model support #225

Open AmosLewis opened 5 months ago

AmosLewis commented 5 months ago

torchtolinalg pipeline issue

Related iree issues: https://github.com/iree-org/iree/issues/17021 The following two run should generate same issue, but it turns out not

Run without --torchtolinalg get iree issue1

python ./run.py --torchmlirbuild ../../torch-mlir/build --tolerance 0.001 0.001 --cachedir ./huggingface_cache --ireebuild ../../iree-build -f pytorch -g models --mode onnx --report --tests pytorch/models/bart-large

Coresponding command that run: Use standalone torch-mlir-opt lowering onnx dialect to torch dialect, then use iree-compile lower torch dialect to vm

torch-mlir-opt -convert-torch-onnx-to-torch bart-large.default.torch-onnx.mlir > bart-large.default.pytorch.torch.mlir
iree-compile --iree-input-demote-i64-to-i32 --iree-hal-target-backends=llvm-cpu  bart-large.default.pytorch.torch.mlir > bart-large.default.vmfb
bart-large.default.pytorch.torch.mlir:466:12: error: 'linalg.generic' op inferred input/output operand #1 has shape's dimension #1 to be 16, but found 1
    %378 = torch.aten.add.Tensor %377, %239, %int1_71 : !torch.vtensor<[1,16,9,9],f32>, !torch.vtensor<[?,?,9,9],f32>, !torch.int -> !torch.vtensor<[?,16,9,9],f32>
           ^
bart-large.default.pytorch.torch.mlir:466:12: note: see current operation: 
%748 = "linalg.generic"(%746, %642, %747) <{indexing_maps = [affine_map<(d0, d1, d2, d3) -> (0, d1, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>], iterator_types = [#linalg.iterator_type<parallel>, #linalg.iterator_type<parallel>, #linalg.iterator_type<parallel>, #linalg.iterator_type<parallel>], operandSegmentSizes = array<i32: 2, 1>}> ({
^bb0(%arg1: f32, %arg2: f32, %arg3: f32):
  %2708 = "arith.addf"(%arg1, %arg2) <{fastmath = #arith.fastmath<none>}> : (f32, f32) -> f32
  "linalg.yield"(%2708) : (f32) -> ()
}) : (tensor<1x16x9x9xf32>, tensor<1x1x9x9xf32>, tensor<1x16x9x9xf32>) -> tensor<1x16x9x9xf32>

Option2: Run with --torchtolinalg get iree issue2

python ./run.py --torchmlirbuild ../../torch-mlir/build --tolerance 0.001 0.001 --cachedir ./huggingface_cache --ireebuild ../../iree-build -f pytorch -g models --mode onnx --report --tests pytorch/models/bart-large --torchtolinalg

Coresponding command that run: Use standalone torch-mlir-opt lowering onnx dialect to linalg dialect, then use iree-compile lower linalg dialect to vm

torch-mlir-opt -pass-pipeline='builtin.module(func.func(convert-torch-onnx-to-torch),torch-lower-to-backend-contract,func.func(cse,canonicalize),torch-backend-to-linalg-on-tensors-backend-pipeline)' bart-large.default.torch-onnx.mlir > bart-large.default.pytorch.linalg.mlir
iree-compile --iree-input-demote-i64-to-i32 --iree-hal-target-backends=llvm-cpu  bart-large.default.pytorch.linalg.mlir
bart-large.default.pytorch.linalg.mlir:333:11: error: 'tensor.expand_shape' op expected dimension 0 of collapsed type to be dynamic since one or more of the corresponding dimensions in the expanded type is dynamic
    %27 = linalg.generic {indexing_maps = [#map10, #map5], iterator_types = ["parallel", "parallel", "parallel"]} ins(%26 : tensor<?x9x1xf32>) outs(%24 : tensor<?x9x1xf32>) {
          ^
bart-large.default.pytorch.linalg.mlir:22:3: note: called from
  func.func @main_graph(%arg0: tensor<1x9xi64>) -> (tensor<1x9x50265xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>) {
  ^
bart-large.default.pytorch.linalg.mlir:333:11: note: see current operation: %254 = "tensor.expand_shape"(%253) <{reassociation = [[0, 1]]}> : (tensor<9xf32>) -> tensor<?x9xf32>
    %27 = linalg.generic {indexing_maps = [#map10, #map5], iterator_types = ["parallel", "parallel", "parallel"]} ins(%26 : tensor<?x9x1xf32>) outs(%24 : tensor<?x9x1xf32>) {
          ^

Here is the link to download all the mlir files: bart-large.default.torch-onnx.mlir bart-large.default.pytorch.torch.mlir bart-large.default.pytorch.linalg.mlir https://onnxstorage.blob.core.windows.net/onnxstorage/bugcases/torchtolinalgpipelineissue.zip

AmosLewis commented 5 months ago

@bjacob In iree code, what's the difference between: torch-mlir-opt -convert-torch-onnx-to-torch bart-large.default.torch-onnx.mlir > bart-large.default.pytorch.torch.mlir iree-compile --iree-input-demote-i64-to-i32 --iree-hal-target-backends=llvm-cpu bart-large.default.pytorch.torch.mlir > bart-large.default.vmfb And torch-mlir-opt -pass-pipeline='builtin.module(func.func(convert-torch-onnx-to-torch),torch-lower-to-backend-contract,func.func(cse,canonicalize),torch-backend-to-linalg-on-tensors-backend-pipeline)' bart-large.default.torch-onnx.mlir > bart-large.default.pytorch.linalg.mlir iree-compile --iree-input-demote-i64-to-i32 --iree-hal-target-backends=llvm-cpu bart-large.default.pytorch.linalg.mlir > bart-large.default.vmfb

Here is the link to download all the mlir files: bart-large.default.torch-onnx.mlir bart-large.default.pytorch.torch.mlir bart-large.default.pytorch.linalg.mlir https://onnxstorage.blob.core.windows.net/onnxstorage/bugcases/torchtolinalgpipelineissue.zip

bjacob commented 5 months ago

Sorry I'm unfamiliar with torch-mlir and probably not the best person to help here, but here is my best attempt.

Looking into each error specifically,

Run without --torchtolinalg get iree issue1

bart-large.default.pytorch.torch.mlir:466:12: error: 'linalg.generic' op inferred input/output operand #1 has shape's dimension #1 to be 16, but found 1
    %378 = torch.aten.add.Tensor %377, %239, %int1_71 : !torch.vtensor<[1,16,9,9],f32>, !torch.vtensor<[?,?,9,9],f32>, !torch.int -> !torch.vtensor<[?,16,9,9],f32>
           ^
bart-large.default.pytorch.torch.mlir:466:12: note: see current operation: 
%748 = "linalg.generic"(%746, %642, %747) <{indexing_maps = [affine_map<(d0, d1, d2, d3) -> (0, d1, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>, affine_map<(d0, d1, d2, d3) -> (d0, d1, d2, d3)>], iterator_types = [#linalg.iterator_type<parallel>, #linalg.iterator_type<parallel>, #linalg.iterator_type<parallel>, #linalg.iterator_type<parallel>], operandSegmentSizes = array<i32: 2, 1>}> ({
^bb0(%arg1: f32, %arg2: f32, %arg3: f32):
  %2708 = "arith.addf"(%arg1, %arg2) <{fastmath = #arith.fastmath<none>}> : (f32, f32) -> f32
  "linalg.yield"(%2708) : (f32) -> ()
}) : (tensor<1x16x9x9xf32>, tensor<1x1x9x9xf32>, tensor<1x16x9x9xf32>) -> tensor<1x16x9x9xf32>

This is noting that the value %748 is an ill-formed linalg.generic. Indeed I think the error message is correct:

So the size of the dimention indexed by d1 needs to be 16 in Input #0 and also needs to be 1 in Input #1, which is the contradiction that the error message is reporting.

Since this linalg.generic op is being created by torch-mlir, that is a bug in torch-mlir.

Run with --torchtolinalg get iree issue2

bart-large.default.pytorch.linalg.mlir:333:11: error: 'tensor.expand_shape' op expected dimension 0 of collapsed type to be dynamic since one or more of the corresponding dimensions in the expanded type is dynamic
    %27 = linalg.generic {indexing_maps = [#map10, #map5], iterator_types = ["parallel", "parallel", "parallel"]} ins(%26 : tensor<?x9x1xf32>) outs(%24 : tensor<?x9x1xf32>) {
          ^
bart-large.default.pytorch.linalg.mlir:22:3: note: called from
  func.func @main_graph(%arg0: tensor<1x9xi64>) -> (tensor<1x9x50265xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>, tensor<1x16x9x64xf32>) {
  ^
bart-large.default.pytorch.linalg.mlir:333:11: note: see current operation: %254 = "tensor.expand_shape"(%253) <{reassociation = [[0, 1]]}> : (tensor<9xf32>) -> tensor<?x9xf32>
    %27 = linalg.generic {indexing_maps = [#map10, #map5], iterator_types = ["parallel", "parallel", "parallel"]} ins(%26 : tensor<?x9x1xf32>) outs(%24 : tensor<?x9x1xf32>) {
          ^

In this error message, the dumped input is already linalg.generic, so we seem to be further down the lowering chain than in the first variant above. That input generic seems legal to me:

    %27 = linalg.generic {indexing_maps = [#map10, #map5], iterator_types = ["parallel", "parallel", "parallel"]} ins(%26 : tensor<?x9x1xf32>) outs(%24 : tensor<?x9x1xf32>) {

But the error says that its lowering includes an ill-formed tensor.expand_shape:

bart-large.default.pytorch.linalg.mlir:333:11: error: 'tensor.expand_shape' op expected dimension 0 of collapsed type to be dynamic since one or more of the corresponding dimensions in the expanded type is dynamic
[...]
bart-large.default.pytorch.linalg.mlir:333:11: note: see current operation: %254 = "tensor.expand_shape"(%253) <{reassociation = [[0, 1]]}> : (tensor<9xf32>) -> tensor<?x9xf32>

Indeed, the 1D static shape 9xf32 here cannot expand to a 2D shape involving a dynamic dimension, ?x9xf32, so this expand_shape is ill-formed, so whichever pass created it has a bug.

You could find which pass created it by rerunning this iree-compile command with --mlir-print-ir-after-failure (or --mlir-print-ir-after-all if it's not too verbose) and then maybe --mlir-print-ir-before=<pass-arg> (where <pass-arg> is the pass name in lowercase identified by `--mlir-print-ir-after-failure).

AmosLewis commented 4 months ago

@Shukla-Gaurav With iree-compiler bump torch-mlir to onnx.resize patch https://github.com/iree-org/iree/pull/17358: new error about mlir::tensor::ExpandShapeOp:

iree-compile: /home/chi/src/iree/third_party/llvm-project/llvm/include/llvm/ADT/PointerUnion.h:156: T llvm::PointerUnion<mlir::Attribute, mlir::Value>::get() const [PT = <mlir::Attribute, mlir::Value>, T = mlir::Value]: Assertion `isa<T>(*this) && "Invalid accessor called"' failed.
Please report issues to https://github.com/iree-org/iree/issues and include the crash backtrace.
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  libIREECompiler.so 0x00007913b913b8ed llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 61
1  libIREECompiler.so 0x00007913b913bddb
2  libIREECompiler.so 0x00007913b9139e46 llvm::sys::RunSignalHandlers() + 134
3  libIREECompiler.so 0x00007913b913c595
4  libc.so.6          0x00007913ad442520
5  libc.so.6          0x00007913ad4969fc pthread_kill + 300
6  libc.so.6          0x00007913ad442476 raise + 22
7  libc.so.6          0x00007913ad4287f3 abort + 211
8  libc.so.6          0x00007913ad42871b
9  libc.so.6          0x00007913ad439e96
10 libIREECompiler.so 0x00007913b91b6d5c
11 libIREECompiler.so 0x00007913c160323a mlir::inferExpandShapeOutputShape(mlir::OpBuilder&, mlir::Location, mlir::ShapedType, llvm::ArrayRef<llvm::SmallVector<long, 2u>>, llvm::ArrayRef<mlir::OpFoldResult>) + 1066
12 libIREECompiler.so 0x00007913c12d675f mlir::tensor::ExpandShapeOp::inferOutputShape(mlir::OpBuilder&, mlir::Location, mlir::RankedTensorType, llvm::ArrayRef<llvm::SmallVector<long, 2u>>, llvm::ArrayRef<mlir::OpFoldResult>) + 239
13 libIREECompiler.so 0x00007913c12d6b6e mlir::tensor::ExpandShapeOp::build(mlir::OpBuilder&, mlir::OperationState&, mlir::Type, mlir::Value, llvm::ArrayRef<llvm::SmallVector<long, 2u>>) + 238
14 libIREECompiler.so 0x00007913be5141c0
15 libIREECompiler.so 0x00007913bef9bd37
16 libIREECompiler.so 0x00007913bef9ad98 mlir::linalg::dropUnitDims(mlir::RewriterBase&, mlir::linalg::GenericOp, mlir::linalg::ControlDropUnitDims const&) + 3864
17 libIREECompiler.so 0x00007913bef9cac1
18 libIREECompiler.so 0x00007913bbee83fb
19 libIREECompiler.so 0x00007913c0fdfb1e
20 libIREECompiler.so 0x00007913c0fdf975
21 libIREECompiler.so 0x00007913b9054cf9
22 libIREECompiler.so 0x00007913c0fe1345
23 libIREECompiler.so 0x00007913c0fde417 mlir::PatternApplicator::matchAndRewrite(mlir::Operation*, mlir::PatternRewriter&, llvm::function_ref<bool (mlir::Pattern const&)>, llvm::function_ref<void (mlir::Pattern const&)>, llvm::function_ref<mlir::LogicalResult (mlir::Pattern const&)>) + 1463
24 libIREECompiler.so 0x00007913c0f90a63
25 libIREECompiler.so 0x00007913c0f8fd31
26 libIREECompiler.so 0x00007913c0f8fd05
27 libIREECompiler.so 0x00007913b9054cf9
28 libIREECompiler.so 0x00007913c0f8f455
29 libIREECompiler.so 0x00007913c0f8d70d
30 libIREECompiler.so 0x00007913c0f8d3d7 mlir::applyPatternsAndFoldGreedily(mlir::Region&, mlir::FrozenRewritePatternSet const&, mlir::GreedyRewriteConfig, bool*) + 231
31 libIREECompiler.so 0x00007913b9d8d735
32 libIREECompiler.so 0x00007913bcdbedd8
33 libIREECompiler.so 0x00007913b954b05b
34 libIREECompiler.so 0x00007913b954aff5
35 libIREECompiler.so 0x00007913b9054cf9
36 libIREECompiler.so 0x00007913b954de75
37 libIREECompiler.so 0x00007913b95467b3 mlir::detail::OpToOpPassAdaptor::run(mlir::Pass*, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int) + 851
38 libIREECompiler.so 0x00007913b9546d34 mlir::detail::OpToOpPassAdaptor::runPipeline(mlir::OpPassManager&, mlir::Operation*, mlir::AnalysisManager, bool, unsigned int, mlir::PassInstrumentor*, mlir::PassInstrumentation::PipelineParentInfo const*) + 388
39 libIREECompiler.so 0x00007913b954c2e5
40 libIREECompiler.so 0x00007913b954cb19
41 libIREECompiler.so 0x00007913b954ca65
42 libIREECompiler.so 0x00007913b954ca25
43 libIREECompiler.so 0x00007913b954c91d
44 libIREECompiler.so 0x00007913b90b7ea5
45 libIREECompiler.so 0x00007913b93e4615 void std::__invoke_impl<void, std::function<void ()>>(std::__invoke_other, std::function<void ()>&&) + 21
46 libIREECompiler.so 0x00007913b93e45d5 std::__invoke_result<std::function<void ()>>::type std::__invoke<std::function<void ()>>(std::function<void ()>&&) + 21
47 libIREECompiler.so 0x00007913b93e45ad
48 libIREECompiler.so 0x00007913b93e4555
49 libIREECompiler.so 0x00007913b93e451c
50 libIREECompiler.so 0x00007913b93e4430 std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter> std::__invoke_impl<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>&>(std::__invoke_other, std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>&) + 32
51 libIREECompiler.so 0x00007913b93e43b8 std::enable_if<is_invocable_r_v<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>, std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>&>, std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>>::type std::__invoke_r<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter>, std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>&>(std::__future_base::_Task_setter<std::unique_ptr<std::__future_base::_Result<void>, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker<std::tuple<std::function<void ()>>>, void>&) + 40
52 libIREECompiler.so 0x00007913b93e42d0
53 libIREECompiler.so 0x00007913b93e4158
54 libIREECompiler.so 0x00007913b93e3ed9
55 libIREECompiler.so 0x00007913b93e40ff void std::__invoke_impl<void, void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::__invoke_memfun_deref, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) + 127
56 libIREECompiler.so 0x00007913b93e406d std::__invoke_result<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>::type std::__invoke<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) + 45
57 libIREECompiler.so 0x00007913b93e4034
58 libIREECompiler.so 0x00007913b93e4004
59 libIREECompiler.so 0x00007913b93e3fd1
60 libc.so.6          0x00007913ad499ee8
61 libIREECompiler.so 0x00007913b93de8cb
62 libIREECompiler.so 0x00007913b93e3e89 void std::call_once<void (std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*>(std::once_flag&, void (std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*, bool*), std::__future_base::_State_baseV2*&&, std::function<std::unique_ptr<std::__future_base::_Result_base, std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) + 89
63 libIREECompiler.so 0x00007913b93e3c45
64 libIREECompiler.so 0x00007913b93e610b
65 libIREECompiler.so 0x00007913b93e698a
66 libIREECompiler.so 0x00007913b93e696a
67 libIREECompiler.so 0x00007913b93e6935
68 libIREECompiler.so 0x00007913b93e6915
69 libIREECompiler.so 0x00007913b93e68d5
70 libIREECompiler.so 0x00007913b93e674d
71 libIREECompiler.so 0x00007913b90b7ea5
72 libIREECompiler.so 0x00007913b90b5d92 llvm::StdThreadPool::processTasks(llvm::ThreadPoolTaskGroup*) + 514
73 libIREECompiler.so 0x00007913b90b7095
74 libIREECompiler.so 0x00007913b90b7019
75 libIREECompiler.so 0x00007913b90b6fed
76 libIREECompiler.so 0x00007913b90b6f9d
77 libIREECompiler.so 0x00007913b90b6f6d
78 libIREECompiler.so 0x00007913b90b6ebd
79 libIREECompiler.so 0x00007913b90b6e8e
80 libIREECompiler.so 0x00007913b90b6bb5
81 libc.so.6          0x00007913ad494ac3
82 libc.so.6          0x00007913ad526850
Aborted (core dumped)
jinchen62 commented 4 months ago

https://github.com/iree-org/iree/issues/17591