[mlir][vector] Remove bit-width logic tests by newling · Pull Request #143007 · llvm/llvm-project (original) (raw)

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Conversation5 Commits1 Checks13 Files changed

Conversation

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters

[ Show hidden characters]({{ revealButtonHref }})

newling

I would like to remove (this PR) or alternatively modify (I can post another PR if this is preferred) the logic around bit width specific linearization.

My first question is -- does anyone rely on bit-width relevant linearization logic being unchanged?

Problem encountered

for a large inner bit-with threshold extract 3x4xf32 -> 4xf32 and extract 3x2x2xf32 -> 2x2f32 are both linearized to the same shuffle. But for an intermediate threshold (100, say), only extract 3x2x2xf32 -> 2x2f32 is linearized (because 4x32 > threshold > 2x32). This is unintuitive to me -- I'd expect the decision to linearize to be based on whether the result of linearization is acceptable.

In theory, as someone who doesn't use the bit width logic at all in legalization, this shouldn't be a problem for me. And it mostly isn't, but I would like to introduce an intermediate step, where extract 3x4xf32 -> 4xf32 and extract 3x2x2xf32 -> 2x2f32 both first lower to extract_strided_slice 12xf32 -> 4xf32 before being converted to shuffle. But adding this pattern causes an issue in the bit-width specific tests, where extracts don't lower completely to shuffle.

Alternative

I can alternatively change the bit width logic to be based on the total number of elements in the vector (which is invariant to shape changes) instead of the inner dimension size.

@newling

@newling newling marked this pull request as ready for review

June 5, 2025 16:38

@llvmbot

@llvm/pr-subscribers-mlir-vector

Author: James Newling (newling)

Changes

I would like to remove (this PR) or alternatively modify (I can post another PR if this is preferred) the logic around bit width specific linearization.

My first question is -- does anyone rely on bit-width relevant linearization logic being unchanged?

Problem encountered

for a large inner bit-with threshold extract 3x4xf32 -> 4xf32 and extract 3x2x2xf32 -> 2x2f32 are both linearized to the same shuffle. But for an intermediate threshold (100, say), only extract 3x2x2xf32 -> 2x2f32 is linearized (because 4x32 > threshold > 2x32). This is unintuitive to me -- I'd expect the decision to linearize to be based on whether the result of linearization is acceptable.

In theory, as someone who doesn't use the bit width logic at all in legalization, this shouldn't be a problem for me. And it mostly isn't, but I would like to introduce an intermediate step, where extract 3x4xf32 -> 4xf32 and extract 3x2x2xf32 -> 2x2f32 both first lower to extract_strided_slice 12xf32 -> 4xf32 before being converted to shuffle. But adding this pattern causes an issue in the bit-width specific tests, where extracts don't lower completely to shuffle.

Alternative

I can alternatively change the bit width logic to be based on the total number of elements in the vector (which is invariant to shape changes) instead of the inner dimension size.


Full diff: https://github.com/llvm/llvm-project/pull/143007.diff

2 Files Affected:

diff --git a/mlir/test/Dialect/Vector/linearize-subject-to-bitwidth.mlir b/mlir/test/Dialect/Vector/linearize-subject-to-bitwidth.mlir deleted file mode 100644 index 739fb2fb8b68b..0000000000000 --- a/mlir/test/Dialect/Vector/linearize-subject-to-bitwidth.mlir +++ /dev/null @@ -1,58 +0,0 @@ -// RUN: mlir-opt %s -split-input-file -test-bit-width-constrained-vector-linearize=target-vector-bitwidth=128 | FileCheck %s --check-prefixes=ALL,BW-128 -// RUN: mlir-opt %s -split-input-file -test-bit-width-constrained-vector-linearize=target-vector-bitwidth=0 | FileCheck %s --check-prefixes=ALL,BW-0

-// A vector<2x2xf32> has inner-most dimension with 64-bits. Check that at -// bitwidth threshold 128 (>= 64), operations are linearized, and at -// bitwidth threshold 0 (< 64), operations are not linearized.

-// ALL-LABEL: test_result_bitwidth_64 -func.func @test_result_bitwidth_64(%arg0: vector<2x2xf32>) -> vector<2x2xf32> {

-}

-// -----

-// The logic for the insert op with regards to the bitwidth threshold is -// different to the other ops, so we test it here. Specifically, the logic -// is based on the bitwidth of the value to store.

-// ALL-LABEL: test_vector_insert -// ALL-SAME: (%[[DEST:.]]: vector<2x8x4xf32>, %[[SRC:.]]: vector<8x4xf32>) -> vector<2x8x4xf32> { -func.func @test_vector_insert(%arg0: vector<2x8x4xf32>, %arg1: vector<8x4xf32>) -> vector<2x8x4xf32> {

-/// Get the set of operand/result types to check for sufficiently -/// small inner-most dimension size. -static SmallVector<std::pair<Type, unsigned>> -getTypeBitWidthBoundPairs(Operation *op, unsigned targetBitWidth) {

-}

-struct TestVectorBitWidthLinearize final - : public PassWrapper<TestVectorBitWidthLinearize, OperationPass<>> { - MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestVectorBitWidthLinearize)

@llvmbot

@llvm/pr-subscribers-mlir

Author: James Newling (newling)

Changes

I would like to remove (this PR) or alternatively modify (I can post another PR if this is preferred) the logic around bit width specific linearization.

My first question is -- does anyone rely on bit-width relevant linearization logic being unchanged?

Problem encountered

for a large inner bit-with threshold extract 3x4xf32 -&gt; 4xf32 and extract 3x2x2xf32 -&gt; 2x2f32 are both linearized to the same shuffle. But for an intermediate threshold (100, say), only extract 3x2x2xf32 -&gt; 2x2f32 is linearized (because 4x32 > threshold > 2x32). This is unintuitive to me -- I'd expect the decision to linearize to be based on whether the result of linearization is acceptable.

In theory, as someone who doesn't use the bit width logic at all in legalization, this shouldn't be a problem for me. And it mostly isn't, but I would like to introduce an intermediate step, where extract 3x4xf32 -&gt; 4xf32 and extract 3x2x2xf32 -&gt; 2x2f32 both first lower to extract_strided_slice 12xf32 -&gt; 4xf32 before being converted to shuffle. But adding this pattern causes an issue in the bit-width specific tests, where extracts don't lower completely to shuffle.

Alternative

I can alternatively change the bit width logic to be based on the total number of elements in the vector (which is invariant to shape changes) instead of the inner dimension size.


Full diff: https://github.com/llvm/llvm-project/pull/143007.diff

2 Files Affected:

diff --git a/mlir/test/Dialect/Vector/linearize-subject-to-bitwidth.mlir b/mlir/test/Dialect/Vector/linearize-subject-to-bitwidth.mlir deleted file mode 100644 index 739fb2fb8b68b..0000000000000 --- a/mlir/test/Dialect/Vector/linearize-subject-to-bitwidth.mlir +++ /dev/null @@ -1,58 +0,0 @@ -// RUN: mlir-opt %s -split-input-file -test-bit-width-constrained-vector-linearize=target-vector-bitwidth=128 | FileCheck %s --check-prefixes=ALL,BW-128 -// RUN: mlir-opt %s -split-input-file -test-bit-width-constrained-vector-linearize=target-vector-bitwidth=0 | FileCheck %s --check-prefixes=ALL,BW-0

-// A vector<2x2xf32> has inner-most dimension with 64-bits. Check that at -// bitwidth threshold 128 (>= 64), operations are linearized, and at -// bitwidth threshold 0 (< 64), operations are not linearized.

-// ALL-LABEL: test_result_bitwidth_64 -func.func @test_result_bitwidth_64(%arg0: vector<2x2xf32>) -> vector<2x2xf32> {

-}

-// -----

-// The logic for the insert op with regards to the bitwidth threshold is -// different to the other ops, so we test it here. Specifically, the logic -// is based on the bitwidth of the value to store.

-// ALL-LABEL: test_vector_insert -// ALL-SAME: (%[[DEST:.]]: vector<2x8x4xf32>, %[[SRC:.]]: vector<8x4xf32>) -> vector<2x8x4xf32> { -func.func @test_vector_insert(%arg0: vector<2x8x4xf32>, %arg1: vector<8x4xf32>) -> vector<2x8x4xf32> {

-/// Get the set of operand/result types to check for sufficiently -/// small inner-most dimension size. -static SmallVector<std::pair<Type, unsigned>> -getTypeBitWidthBoundPairs(Operation *op, unsigned targetBitWidth) {

-}

-struct TestVectorBitWidthLinearize final - : public PassWrapper<TestVectorBitWidthLinearize, OperationPass<>> { - MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestVectorBitWidthLinearize)

@banach-space

Hey @newling !

My first question is -- does anyone rely on bit-width relevant linearization logic being unchanged?

Give no feedback so far, this one will probably require a post on Discourse. From my experience, there are downstream users that depend on various bits here and there (not. sure about this though). In fact, I have been considering similar approach for narrow-type-emulation:

As you can see, no feedback :( (though from F2F conversation I do know that certain users do depend on that).

I am in favour of this change. If you post on Discourse and there are no objections, we should just go ahead.

@newling

As you can see, no feedback :( (though from F2F conversation I do know that certain users do depend on that).

No feedback, even with so much bold font, what chance do I have! But seriously, that sounds like a good suggestion, I'll create a New Topic over at https://discourse.llvm.org/tag/mlir

@newling