@@ -137,20 +137,6 @@ class Arith_CompareOpOfAnyRank<string mnemonic, list<Trait> traits = []> :
137137 let results = (outs BoolLikeOfAnyRank:$result);
138138}
139139
140- class Arith_IntBinaryOpWithOverflowFlags<string mnemonic, list<Trait> traits = []> :
141- Arith_BinaryOp<mnemonic, traits #
142- [Pure, DeclareOpInterfaceMethods<InferIntRangeInterface>,
143- DeclareOpInterfaceMethods<ArithIntegerOverflowFlagsInterface>]>,
144- Arguments<(ins SignlessIntegerLike:$lhs, SignlessIntegerLike:$rhs,
145- DefaultValuedAttr<
146- Arith_IntegerOverflowAttr,
147- "::mlir::arith::IntegerOverflowFlags::none">:$overflowFlags)>,
148- Results<(outs SignlessIntegerLike:$result)> {
149-
150- let assemblyFormat = [{ $lhs `,` $rhs (`overflow` `` $overflowFlags^)?
151- attr-dict `:` type($result) }];
152- }
153-
154140//===----------------------------------------------------------------------===//
155141// ConstantOp
156142//===----------------------------------------------------------------------===//
@@ -206,7 +192,7 @@ def Arith_ConstantOp : Op<Arith_Dialect, "constant",
206192// AddIOp
207193//===----------------------------------------------------------------------===//
208194
209- def Arith_AddIOp : Arith_IntBinaryOpWithOverflowFlags <"addi", [Commutative]> {
195+ def Arith_AddIOp : Arith_TotalIntBinaryOp <"addi", [Commutative]> {
210196 let summary = "integer addition operation";
211197 let description = [{
212198 Performs N-bit addition on the operands. The operands are interpreted as
@@ -217,23 +203,16 @@ def Arith_AddIOp : Arith_IntBinaryOpWithOverflowFlags<"addi", [Commutative]> {
217203
218204 The `addi` operation takes two operands and returns one result, each of
219205 these is required to be the same type. This type may be an integer scalar type,
220- a vector whose element type is integer, or a tensor of integers.
221-
222- This op supports `nuw`/`nsw` overflow flags which stands stand for
223- "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
224- `nsw` flags are present, and an unsigned/signed overflow occurs
225- (respectively), the result is poison.
206+ a vector whose element type is integer, or a tensor of integers. It has no
207+ standard attributes.
226208
227209 Example:
228210
229211 ```mlir
230212 // Scalar addition.
231213 %a = arith.addi %b, %c : i64
232214
233- // Scalar addition with overflow flags.
234- %a = arith.addi %b, %c overflow<nsw, nuw> : i64
235-
236- // SIMD vector element-wise addition.
215+ // SIMD vector element-wise addition, e.g. for Intel SSE.
237216 %f = arith.addi %g, %h : vector<4xi32>
238217
239218 // Tensor element-wise addition.
@@ -299,41 +278,21 @@ def Arith_AddUIExtendedOp : Arith_Op<"addui_extended", [Pure, Commutative,
299278// SubIOp
300279//===----------------------------------------------------------------------===//
301280
302- def Arith_SubIOp : Arith_IntBinaryOpWithOverflowFlags <"subi"> {
281+ def Arith_SubIOp : Arith_TotalIntBinaryOp <"subi"> {
303282 let summary = [{
304283 Integer subtraction operation.
305284 }];
306285 let description = [{
307- Performs N-bit subtraction on the operands. The operands are interpreted as unsigned
308- bitvectors. The result is represented by a bitvector containing the mathematical
309- value of the subtraction modulo 2^n, where `n` is the bitwidth. Because `arith`
310- integers use a two's complement representation, this operation is applicable on
286+ Performs N-bit subtraction on the operands. The operands are interpreted as unsigned
287+ bitvectors. The result is represented by a bitvector containing the mathematical
288+ value of the subtraction modulo 2^n, where `n` is the bitwidth. Because `arith`
289+ integers use a two's complement representation, this operation is applicable on
311290 both signed and unsigned integer operands.
312291
313292 The `subi` operation takes two operands and returns one result, each of
314- these is required to be the same type. This type may be an integer scalar type,
315- a vector whose element type is integer, or a tensor of integers.
316-
317- This op supports `nuw`/`nsw` overflow flags which stands stand for
318- "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
319- `nsw` flags are present, and an unsigned/signed overflow occurs
320- (respectively), the result is poison.
321-
322- Example:
323-
324- ```mlir
325- // Scalar subtraction.
326- %a = arith.subi %b, %c : i64
327-
328- // Scalar subtraction with overflow flags.
329- %a = arith.subi %b, %c overflow<nsw, nuw> : i64
330-
331- // SIMD vector element-wise subtraction.
332- %f = arith.subi %g, %h : vector<4xi32>
333-
334- // Tensor element-wise subtraction.
335- %x = arith.subi %y, %z : tensor<4x?xi8>
336- ```
293+ these is required to be the same type. This type may be an integer scalar type,
294+ a vector whose element type is integer, or a tensor of integers. It has no
295+ standard attributes.
337296 }];
338297 let hasFolder = 1;
339298 let hasCanonicalizer = 1;
@@ -343,41 +302,21 @@ def Arith_SubIOp : Arith_IntBinaryOpWithOverflowFlags<"subi"> {
343302// MulIOp
344303//===----------------------------------------------------------------------===//
345304
346- def Arith_MulIOp : Arith_IntBinaryOpWithOverflowFlags <"muli", [Commutative]> {
305+ def Arith_MulIOp : Arith_TotalIntBinaryOp <"muli", [Commutative]> {
347306 let summary = [{
348307 Integer multiplication operation.
349308 }];
350309 let description = [{
351- Performs N-bit multiplication on the operands. The operands are interpreted as
352- unsigned bitvectors. The result is represented by a bitvector containing the
353- mathematical value of the multiplication modulo 2^n, where `n` is the bitwidth.
354- Because `arith` integers use a two's complement representation, this operation is
310+ Performs N-bit multiplication on the operands. The operands are interpreted as
311+ unsigned bitvectors. The result is represented by a bitvector containing the
312+ mathematical value of the multiplication modulo 2^n, where `n` is the bitwidth.
313+ Because `arith` integers use a two's complement representation, this operation is
355314 applicable on both signed and unsigned integer operands.
356315
357316 The `muli` operation takes two operands and returns one result, each of
358- these is required to be the same type. This type may be an integer scalar type,
359- a vector whose element type is integer, or a tensor of integers.
360-
361- This op supports `nuw`/`nsw` overflow flags which stands stand for
362- "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
363- `nsw` flags are present, and an unsigned/signed overflow occurs
364- (respectively), the result is poison.
365-
366- Example:
367-
368- ```mlir
369- // Scalar multiplication.
370- %a = arith.muli %b, %c : i64
371-
372- // Scalar multiplication with overflow flags.
373- %a = arith.muli %b, %c overflow<nsw, nuw> : i64
374-
375- // SIMD vector element-wise multiplication.
376- %f = arith.muli %g, %h : vector<4xi32>
377-
378- // Tensor element-wise multiplication.
379- %x = arith.muli %y, %z : tensor<4x?xi8>
380- ```
317+ these is required to be the same type. This type may be an integer scalar type,
318+ a vector whose element type is integer, or a tensor of integers. It has no
319+ standard attributes.
381320 }];
382321 let hasFolder = 1;
383322 let hasCanonicalizer = 1;
0 commit comments