Skip to content

Commit e5f2898

Browse files
committed
[MLIR][STD] Fold trunci (zexti).
This patch folds the following pattern: ``` %arg0 = ... %0 = zexti %arg0 : i1 to i8 %1 = trunci %0 : i8 to i1 ``` into just `%arg0`. Reviewed By: mehdi_amini Differential Revision: https://reviews.llvm.org/D99453
1 parent ab158d3 commit e5f2898

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

mlir/include/mlir/Dialect/StandardOps/IR/Ops.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2070,6 +2070,8 @@ def TruncateIOp : Std_Op<"trunci", [NoSideEffect,
20702070
let printer = [{
20712071
return printStandardCastOp(this->getOperation(), p);
20722072
}];
2073+
2074+
let hasFolder = 1;
20732075
}
20742076

20752077
//===----------------------------------------------------------------------===//

mlir/lib/Dialect/StandardOps/IR/Ops.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2181,6 +2181,14 @@ static LogicalResult verify(TruncateIOp op) {
21812181
return success();
21822182
}
21832183

2184+
OpFoldResult TruncateIOp::fold(ArrayRef<Attribute> operands) {
2185+
// trunci(zexti(a)) -> a
2186+
if (matchPattern(getOperand(), m_Op<ZeroExtendIOp>()))
2187+
return getOperand().getDefiningOp()->getOperand(0);
2188+
2189+
return nullptr;
2190+
}
2191+
21842192
//===----------------------------------------------------------------------===//
21852193
// UnsignedDivIOp
21862194
//===----------------------------------------------------------------------===//

mlir/test/Transforms/canonicalize.mlir

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,3 +1059,53 @@ func @subtensor(%t: tensor<8x16x4xf32>, %arg0 : index, %arg1 : index)
10591059
return %2 : tensor<?x?x?xf32>
10601060
}
10611061

1062+
// -----
1063+
1064+
// CHECK-LABEL: func @fold_trunci
1065+
// CHECK-SAME: (%[[ARG0:[0-9a-z]*]]: i1)
1066+
func @fold_trunci(%arg0: i1) -> i1 attributes {} {
1067+
// CHECK-NEXT: return %[[ARG0]] : i1
1068+
%0 = zexti %arg0 : i1 to i8
1069+
%1 = trunci %0 : i8 to i1
1070+
return %1 : i1
1071+
}
1072+
1073+
// -----
1074+
1075+
// CHECK-LABEL: func @fold_trunci_vector
1076+
// CHECK-SAME: (%[[ARG0:[0-9a-z]*]]: vector<4xi1>)
1077+
func @fold_trunci_vector(%arg0: vector<4xi1>) -> vector<4xi1> attributes {} {
1078+
// CHECK-NEXT: return %[[ARG0]] : vector<4xi1>
1079+
%0 = zexti %arg0 : vector<4xi1> to vector<4xi8>
1080+
%1 = trunci %0 : vector<4xi8> to vector<4xi1>
1081+
return %1 : vector<4xi1>
1082+
}
1083+
1084+
// -----
1085+
1086+
// TODO Canonicalize this into:
1087+
// zexti %arg0 : i1 to i2
1088+
1089+
// CHECK-LABEL: func @do_not_fold_trunci
1090+
// CHECK-SAME: (%[[ARG0:[0-9a-z]*]]: i1)
1091+
func @do_not_fold_trunci(%arg0: i1) -> i2 attributes {} {
1092+
// CHECK-NEXT: zexti %[[ARG0]] : i1 to i8
1093+
// CHECK-NEXT: %[[RES:[0-9a-z]*]] = trunci %{{.*}} : i8 to i2
1094+
// CHECK-NEXT: return %[[RES]] : i2
1095+
%0 = zexti %arg0 : i1 to i8
1096+
%1 = trunci %0 : i8 to i2
1097+
return %1 : i2
1098+
}
1099+
1100+
// -----
1101+
1102+
// CHECK-LABEL: func @do_not_fold_trunci_vector
1103+
// CHECK-SAME: (%[[ARG0:[0-9a-z]*]]: vector<4xi1>)
1104+
func @do_not_fold_trunci_vector(%arg0: vector<4xi1>) -> vector<4xi2> attributes {} {
1105+
// CHECK-NEXT: zexti %[[ARG0]] : vector<4xi1> to vector<4xi8>
1106+
// CHECK-NEXT: %[[RES:[0-9a-z]*]] = trunci %{{.*}} : vector<4xi8> to vector<4xi2>
1107+
// CHECK-NEXT: return %[[RES]] : vector<4xi2>
1108+
%0 = zexti %arg0 : vector<4xi1> to vector<4xi8>
1109+
%1 = trunci %0 : vector<4xi8> to vector<4xi2>
1110+
return %1 : vector<4xi2>
1111+
}

0 commit comments

Comments
 (0)