[Mlir-commits] [mlir] [mlir][linalg] Fix exponential walk of tensor.extract indices (PR #222319)

Jelle Schühmacher llvmlistbot at llvm.org
Wed Sep 9 06:03:09 PDT 2026


jschuhmacher wrote:

Verified below test:

| `arith.muli` ops | before | after |
|---|---|---|
| 20 | 0.03 s | 0.02 s |
| 24 | 0.26 s | 0.02 s |
| 27 | 2.01 s | 0.02 s |
| 30 | 16.10 s | 0.01 s |
| 40 | >300 s, killed | 0.02 s |

which is probably not a good test to add to CI.

```
// RUN: mlir-opt %s -transform-interpreter | FileCheck %s

func.func @vectorize_nd_tensor_extract_deep_index_chain(
    %src: tensor<4xf32>,
    %seed: tensor<8xi32>,
    %output: tensor<8xf32>) -> tensor<8xf32> {
  %res = linalg.generic {
    indexing_maps = [affine_map<(d0) -> (d0)>, affine_map<(d0) -> (d0)>],
    iterator_types = ["parallel"]
  } ins(%seed : tensor<8xi32>) outs(%output : tensor<8xf32>) {
  ^bb0(%in: i32, %out: f32):
    %0 = arith.muli %in, %in : i32
    %1 = arith.muli %0, %0 : i32
    %2 = arith.muli %1, %1 : i32
    %3 = arith.muli %2, %2 : i32
    %4 = arith.muli %3, %3 : i32
    %5 = arith.muli %4, %4 : i32
    %6 = arith.muli %5, %5 : i32
    %7 = arith.muli %6, %6 : i32
    %8 = arith.muli %7, %7 : i32
    %9 = arith.muli %8, %8 : i32
    %10 = arith.muli %9, %9 : i32
    %11 = arith.muli %10, %10 : i32
    %12 = arith.muli %11, %11 : i32
    %13 = arith.muli %12, %12 : i32
    %14 = arith.muli %13, %13 : i32
    %15 = arith.muli %14, %14 : i32
    %16 = arith.muli %15, %15 : i32
    %17 = arith.muli %16, %16 : i32
    %18 = arith.muli %17, %17 : i32
    %19 = arith.muli %18, %18 : i32
    %20 = arith.muli %19, %19 : i32
    %21 = arith.muli %20, %20 : i32
    %22 = arith.muli %21, %21 : i32
    %23 = arith.muli %22, %22 : i32
    %24 = arith.muli %23, %23 : i32
    %25 = arith.muli %24, %24 : i32
    %26 = arith.muli %25, %25 : i32
    %27 = arith.muli %26, %26 : i32
    %28 = arith.muli %27, %27 : i32
    %29 = arith.muli %28, %28 : i32
    %30 = arith.muli %29, %29 : i32
    %31 = arith.muli %30, %30 : i32
    %32 = arith.muli %31, %31 : i32
    %33 = arith.muli %32, %32 : i32
    %34 = arith.muli %33, %33 : i32
    %35 = arith.muli %34, %34 : i32
    %36 = arith.muli %35, %35 : i32
    %37 = arith.muli %36, %36 : i32
    %38 = arith.muli %37, %37 : i32
    %39 = arith.muli %38, %38 : i32
    %idx = arith.index_cast %39 : i32 to index
    %extracted = tensor.extract %src[%idx] : tensor<4xf32>
    linalg.yield %extracted : f32
  } -> tensor<8xf32>
  return %res : tensor<8xf32>
}

// CHECK-LABEL: func.func @vectorize_nd_tensor_extract_deep_index_chain
// CHECK-COUNT-40: arith.muli {{.*}} : vector<8xi32>
// CHECK:          vector.gather

module attributes {transform.with_named_sequence} {
  transform.named_sequence @__transform_main(%arg1: !transform.any_op {transform.readonly}) {
     %0 = transform.structured.match ops{["linalg.generic"]} in %arg1 : (!transform.any_op) -> !transform.any_op
     transform.structured.vectorize %0 vector_sizes [8] vectorize_nd_extract : !transform.any_op
     transform.yield
   }
}
```

https://github.com/llvm/llvm-project/pull/222319


More information about the Mlir-commits mailing list