@@ -226,7 +226,7 @@ def Arith_AddIOp : Arith_IntBinaryOpWithOverflowFlags<"addi", [Commutative]> {
226226 these is required to be the same type. This type may be an integer scalar type,
227227 a vector whose element type is integer, or a tensor of integers.
228228
229- This op supports `nuw`/`nsw` overflow flags which stands stand for
229+ This op supports `nuw`/`nsw` overflow flags which stands for
230230 "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
231231 `nsw` flags are present, and an unsigned/signed overflow occurs
232232 (respectively), the result is poison.
@@ -321,7 +321,7 @@ def Arith_SubIOp : Arith_IntBinaryOpWithOverflowFlags<"subi"> {
321321 these is required to be the same type. This type may be an integer scalar type,
322322 a vector whose element type is integer, or a tensor of integers.
323323
324- This op supports `nuw`/`nsw` overflow flags which stands stand for
324+ This op supports `nuw`/`nsw` overflow flags which stands for
325325 "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
326326 `nsw` flags are present, and an unsigned/signed overflow occurs
327327 (respectively), the result is poison.
@@ -367,7 +367,7 @@ def Arith_MulIOp : Arith_IntBinaryOpWithOverflowFlags<"muli",
367367 these is required to be the same type. This type may be an integer scalar type,
368368 a vector whose element type is integer, or a tensor of integers.
369369
370- This op supports `nuw`/`nsw` overflow flags which stands stand for
370+ This op supports `nuw`/`nsw` overflow flags which stands for
371371 "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
372372 `nsw` flags are present, and an unsigned/signed overflow occurs
373373 (respectively), the result is poison.
@@ -800,7 +800,7 @@ def Arith_ShLIOp : Arith_IntBinaryOpWithOverflowFlags<"shli"> {
800800 operand is greater or equal than the bitwidth of the first operand, then the
801801 operation returns poison.
802802
803- This op supports `nuw`/`nsw` overflow flags which stands stand for
803+ This op supports `nuw`/`nsw` overflow flags which stands for
804804 "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
805805 `nsw` flags are present, and an unsigned/signed overflow occurs
806806 (respectively), the result is poison.
@@ -1271,25 +1271,49 @@ def Arith_ScalingExtFOp
12711271// TruncIOp
12721272//===----------------------------------------------------------------------===//
12731273
1274- def Arith_TruncIOp : Arith_IToICastOp<"trunci"> {
1274+ def Arith_TruncIOp : Op<Arith_Dialect, "trunci",
1275+ [Pure, SameOperandsAndResultShape, SameInputOutputTensorDims,
1276+ DeclareOpInterfaceMethods<CastOpInterface>,
1277+ DeclareOpInterfaceMethods<InferIntRangeInterface, ["inferResultRanges"]>,
1278+ DeclareOpInterfaceMethods<ArithIntegerOverflowFlagsInterface>]> {
12751279 let summary = "integer truncation operation";
12761280 let description = [{
12771281 The integer truncation operation takes an integer input of
12781282 width M and an integer destination type of width N. The destination
12791283 bit-width must be smaller than the input bit-width (N < M).
12801284 The top-most (N - M) bits of the input are discarded.
12811285
1286+ This op supports `nuw`/`nsw` overflow flags which stands for "No Unsigned
1287+ Wrap" and "No Signed Wrap", respectively. If the nuw keyword is present,
1288+ and any of the truncated bits are non-zero, the result is a poison value.
1289+ If the nsw keyword is present, and any of the truncated bits are not the
1290+ same as the top bit of the truncation result, the result is a poison value.
1291+
12821292 Example:
12831293
12841294 ```mlir
1295+ // Scalar truncation.
12851296 %1 = arith.constant 21 : i5 // %1 is 0b10101
12861297 %2 = arith.trunci %1 : i5 to i4 // %2 is 0b0101
12871298 %3 = arith.trunci %1 : i5 to i3 // %3 is 0b101
12881299
1289- %5 = arith.trunci %0 : vector<2 x i32> to vector<2 x i16>
1300+ // Vector truncation.
1301+ %4 = arith.trunci %0 : vector<2 x i32> to vector<2 x i16>
1302+
1303+ // Scalar truncation with overflow flags.
1304+ %5 = arith.trunci %a overflow<nsw, nuw> : i32 to i16
12901305 ```
12911306 }];
12921307
1308+ let arguments = (ins
1309+ SignlessFixedWidthIntegerLike:$in,
1310+ DefaultValuedAttr<Arith_IntegerOverflowAttr,
1311+ "::mlir::arith::IntegerOverflowFlags::none">:$overflowFlags);
1312+ let results = (outs SignlessFixedWidthIntegerLike:$out);
1313+ let assemblyFormat = [{
1314+ $in (`overflow` `` $overflowFlags^)? attr-dict
1315+ `:` type($in) `to` type($out)
1316+ }];
12931317 let hasFolder = 1;
12941318 let hasCanonicalizer = 1;
12951319 let hasVerifier = 1;
0 commit comments