已开启
[MLIR][Transform] transform.legalize 的 CleanupExtractSlice 把旧 mask 转发给缩小后的 transfer_read,生成非法 IR #133
cactusBalll创建于  7 天前
cactusBalll
7 天前 创建

【缺陷描述】:请补充详细的缺陷问题现象描述

对合法 MLIR——带 mask 的 vector.transfer_read 后接 vector.extract_strided_slice——transform.legalize 的 CleanupExtractSlice 模式生成的新 read 结果类型已缩小,但 mask 仍是原尺寸,IR 非法:

%mask = vector.create_mask %n : vector<8xi1>
%v = vector.transfer_read %m[%c0], %pad, %mask {in_bounds = [true]} : memref<8xf32>, vector<8xf32>
%e = vector.extract_strided_slice %v {offsets = [4], sizes = [4], strides = [1]} : vector<8xf32> to vector<4xf32>

transform.legalize 失败:

error: 'vector.transfer_read' op inferred mask type ('vector<4xi1>') and
mask operand type ('vector<8xi1>') don't match
### **一、缺陷信息**
            
- 缺陷组件:MLIR Transform dialect(TransformOps.cpp,`CleanupExtractSlice::matchAndRewrite`,当前树 3120-3124 行)
- 缺陷类型:生成非法 IR / 合法输入被拒(pass 硬失败,exit 1)
- 根因:新 read 直接转发旧 mask:
  ```cpp
  auto newReadOp = rewriter.create<mlir::vector::TransferReadOp>(
      readOp.getLoc(), newVectType, readOp.getSource(), newIndices,
      readOp.getPermutationMap(), readOp.getPadding(), readOp.getMask(),  // <- 旧 mask
      readOp.getInBounds());

readOp.getMask() 的形状对应向量(vector<8xi1>),而 newVectType 是切片后的类型(vector<4xf32>);mask 形状必须与传输向量一致,生成的 op 无法通过验证

缺陷关联提交:

  • 0d042c157b7a65ee48ab2920b67f95113f9347da "legalize"(引入 pattern)
  • 30228109586cf5eae5d6898d3ffae9e4a71ccdae "[mlir][transform] Fix Use-After-Free error in transform.legalize"
  • d18ff5dbbd3d22016b557afac46274fb44649896 "[mlir][transform] Fix dominance violation in CleanupExtractSlice"

【缺陷所属的os版本】

Ubuntu 22.04.3 LTS,缺陷位于编译器/MLIR 工具链本身,与操作系统版本无关。

【内核版本】

6.6.87.2-microsoft-standard-WSL2(uname -r)。缺陷与内核版本无关。

【缺陷所属软件及版本号】

LLVM 20.1.8

【环境信息】

编译选项:
CMAKE_BUILD_TYPE=RelWithDebInfo,LLVM_ENABLE_ASSERTIONS=ON,LLVM_ENABLE_PROJECTS="clang;mlir",LLVM_TARGETS_TO_BUILD="X86;AArch64"

COMMIT ID:35f464110c04e89bd0cab0e3fee4a70ec6ec2eb9

【问题复现步骤】

func.func @masked_read(%m: memref<8xf32>, %n: index) -> vector<4xf32> {
  %pad = arith.constant 0.0 : f32
  %c0 = arith.constant 0 : index
  %mask = vector.create_mask %n : vector<8xi1>
  %v = vector.transfer_read %m[%c0], %pad, %mask {in_bounds = [true]} : memref<8xf32>, vector<8xf32>
  %e = vector.extract_strided_slice %v {offsets = [4], sizes = [4], strides = [1]} : vector<8xf32> to vector<4xf32>
  return %e : vector<4xf32>
}

module attributes {transform.with_named_sequence} {
  transform.named_sequence @__transform_main(%arg0: !transform.any_op) {
    transform.legalize {hardware_vector_length = 256 : i64}
    transform.yield
  }
}

执行mlir-opt test.mlir --transform-interpreter

【实际结果】

【期望结果】

【其他相关附件信息】

【缺陷详情及分析指导参考链接】

likedislike
openeuler-ci-botopeneuler-ci-bot成员
7 天前 将 alexanderbill、li-yancheng、cf-zhao、eastb233、wangqiang95、kuenking111_admin、SegFault、wd-gitcode、chenzheng1030、gcw_LWQavIsb 设为负责人
openeuler-ci-botopeneuler-ci-bot成员
7 天前 添加了label:sig/Compiler
openeuler-ci-bot
openeuler-ci-bot成员
7 天前 评论:

Welcome To openEuler Community

Hey @gcw_LWQavIsb , thanks for your contribution to the community.

Bot Usage Manual

I'm the Bot here serving you. You can find the instructions on how to interact with me at Here . That means you can comment below every pull request or issue to trigger Bot Commands. You can self-configure the PR merge rules for this repository. For more details, please refer to Here.

Contact Guide

If you have any questions, please contact the SIG: Compiler ,
and any of the maintainers: @SegFault, @alexanderbill, @cf-zhao, @chenzheng1030, @eastb233, @kuenking111_admin, @li-yancheng, @wangqiang95, @wd-gitcode ,
and any of the committers: @liyunfei33, @zhongyunde .

likedislike