MLIR][STD] Fold trunci (sexti).

This patch folds the following pattern:

```
%arg0 = ...
%0 = sexti %arg0 : i1 to i8
%1 = trunci %0 : i8 to i1
```

into just `%arg0`.

Reviewed By: mehdi_amini

Differential Revision: https://reviews.llvm.org/D99464
This commit is contained in:
KareemErgawy-TomTom 2021-03-29 08:33:56 +02:00
parent 6bc1e69de2
commit c52a5f2aa7
2 changed files with 14 additions and 1 deletions

View File

@ -2183,7 +2183,9 @@ static LogicalResult verify(TruncateIOp op) {
OpFoldResult TruncateIOp::fold(ArrayRef<Attribute> operands) {
// trunci(zexti(a)) -> a
if (matchPattern(getOperand(), m_Op<ZeroExtendIOp>()))
// trunci(sexti(a)) -> a
if (matchPattern(getOperand(), m_Op<ZeroExtendIOp>()) ||
matchPattern(getOperand(), m_Op<SignExtendIOp>()))
return getOperand().getDefiningOp()->getOperand(0);
return nullptr;

View File

@ -1109,3 +1109,14 @@ func @do_not_fold_trunci_vector(%arg0: vector<4xi1>) -> vector<4xi2> attributes
%1 = trunci %0 : vector<4xi8> to vector<4xi2>
return %1 : vector<4xi2>
}
// -----
// CHECK-LABEL: func @fold_trunci_sexti
// CHECK-SAME: (%[[ARG0:[0-9a-z]*]]: i1)
func @fold_trunci_sexti(%arg0: i1) -> i1 attributes {} {
// CHECK-NEXT: return %[[ARG0]] : i1
%0 = sexti %arg0 : i1 to i8
%1 = trunci %0 : i8 to i1
return %1 : i1
}