[Mlir-commits] [mlir] 5f59b72 - Revert "[mlir][arith] Add overflow flags support to arith ops (#77211)"
Ivan Butygin
llvmlistbot at llvm.org
Thu Jan 11 15:08:01 PST 2024
Author: Ivan Butygin
Date: 2024-01-12T00:05:22+01:00
New Revision: 5f59b720a8fc41d65964b88c64f803af86ed3cc8
URL: https://github.com/llvm/llvm-project/commit/5f59b720a8fc41d65964b88c64f803af86ed3cc8
DIFF: https://github.com/llvm/llvm-project/commit/5f59b720a8fc41d65964b88c64f803af86ed3cc8.diff
LOG: Revert "[mlir][arith] Add overflow flags support to arith ops (#77211)"
Temporarily reverting as it broke python bindings
This reverts commit a7262d2d9bee9bdfdbcd03ca27a0128c2e2b1c1a.
Added:
Modified:
mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h
mlir/include/mlir/Dialect/Arith/IR/ArithBase.td
mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
mlir/include/mlir/Dialect/Arith/IR/ArithOpsInterfaces.td
mlir/lib/Conversion/ArithCommon/AttrToLLVMConverter.cpp
mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
mlir/lib/Dialect/Arith/IR/ArithOps.cpp
mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
mlir/test/Dialect/Arith/ops.mlir
mlir/test/python/ir/diagnostic_handler.py
Removed:
################################################################################
diff --git a/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h b/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h
index 0296ec969d0b32..eea16b4da6a690 100644
--- a/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h
+++ b/mlir/include/mlir/Conversion/ArithCommon/AttrToLLVMConverter.h
@@ -18,24 +18,14 @@
namespace mlir {
namespace arith {
-/// Maps arithmetic fastmath enum values to LLVM enum values.
+// Map arithmetic fastmath enum values to LLVMIR enum values.
LLVM::FastmathFlags
convertArithFastMathFlagsToLLVM(arith::FastMathFlags arithFMF);
-/// Creates an LLVM fastmath attribute from a given arithmetic fastmath
-/// attribute.
+// Create an LLVM fastmath attribute from a given arithmetic fastmath attribute.
LLVM::FastmathFlagsAttr
convertArithFastMathAttrToLLVM(arith::FastMathFlagsAttr fmfAttr);
-/// Maps arithmetic overflow enum values to LLVM enum values.
-LLVM::IntegerOverflowFlags
-convertArithOveflowFlagsToLLVM(arith::IntegerOverflowFlags arithFlags);
-
-/// Creates an LLVM overflow attribute from a given arithmetic overflow
-/// attribute.
-LLVM::IntegerOverflowFlagsAttr
-convertArithOveflowAttrToLLVM(arith::IntegerOverflowFlagsAttr flagsAttr);
-
// Attribute converter that populates a NamedAttrList by removing the fastmath
// attribute from the source operation attributes, and replacing it with an
// equivalent LLVM fastmath attribute.
@@ -46,12 +36,12 @@ class AttrConvertFastMathToLLVM {
// Copy the source attributes.
convertedAttr = NamedAttrList{srcOp->getAttrs()};
// Get the name of the arith fastmath attribute.
- StringRef arithFMFAttrName = SourceOp::getFastMathAttrName();
+ llvm::StringRef arithFMFAttrName = SourceOp::getFastMathAttrName();
// Remove the source fastmath attribute.
- auto arithFMFAttr = dyn_cast_if_present<arith::FastMathFlagsAttr>(
+ auto arithFMFAttr = dyn_cast_or_null<arith::FastMathFlagsAttr>(
convertedAttr.erase(arithFMFAttrName));
if (arithFMFAttr) {
- StringRef targetAttrName = TargetOp::getFastmathAttrName();
+ llvm::StringRef targetAttrName = TargetOp::getFastmathAttrName();
convertedAttr.set(targetAttrName,
convertArithFastMathAttrToLLVM(arithFMFAttr));
}
@@ -59,33 +49,6 @@ class AttrConvertFastMathToLLVM {
ArrayRef<NamedAttribute> getAttrs() const { return convertedAttr.getAttrs(); }
-private:
- NamedAttrList convertedAttr;
-};
-
-// Attribute converter that populates a NamedAttrList by removing the overflow
-// attribute from the source operation attributes, and replacing it with an
-// equivalent LLVM overflow attribute.
-template <typename SourceOp, typename TargetOp>
-class AttrConvertOverflowToLLVM {
-public:
- AttrConvertOverflowToLLVM(SourceOp srcOp) {
- // Copy the source attributes.
- convertedAttr = NamedAttrList{srcOp->getAttrs()};
- // Get the name of the arith overflow attribute.
- StringRef arithAttrName = SourceOp::getIntegerOverflowAttrName();
- // Remove the source overflow attribute.
- auto arithAttr = dyn_cast_if_present<arith::IntegerOverflowFlagsAttr>(
- convertedAttr.erase(arithAttrName));
- if (arithAttr) {
- StringRef targetAttrName = TargetOp::getIntegerOverflowAttrName();
- convertedAttr.set(targetAttrName,
- convertArithOveflowAttrToLLVM(arithAttr));
- }
- }
-
- ArrayRef<NamedAttribute> getAttrs() const { return convertedAttr.getAttrs(); }
-
private:
NamedAttrList convertedAttr;
};
diff --git a/mlir/include/mlir/Dialect/Arith/IR/ArithBase.td b/mlir/include/mlir/Dialect/Arith/IR/ArithBase.td
index 3fb7f948b0a45a..1e4061392b22d4 100644
--- a/mlir/include/mlir/Dialect/Arith/IR/ArithBase.td
+++ b/mlir/include/mlir/Dialect/Arith/IR/ArithBase.td
@@ -133,27 +133,4 @@ def Arith_FastMathAttr :
let assemblyFormat = "`<` $value `>`";
}
-//===----------------------------------------------------------------------===//
-// IntegerOverflowFlags
-//===----------------------------------------------------------------------===//
-
-def IOFnone : I32BitEnumAttrCaseNone<"none">;
-def IOFnsw : I32BitEnumAttrCaseBit<"nsw", 0>;
-def IOFnuw : I32BitEnumAttrCaseBit<"nuw", 1>;
-
-def IntegerOverflowFlags : I32BitEnumAttr<
- "IntegerOverflowFlags",
- "Integer overflow arith flags",
- [IOFnone, IOFnsw, IOFnuw]> {
- let separator = ", ";
- let cppNamespace = "::mlir::arith";
- let genSpecializedAttr = 0;
- let printBitEnumPrimaryGroups = 1;
-}
-
-def Arith_IntegerOverflowAttr :
- EnumAttr<Arith_Dialect, IntegerOverflowFlags, "overflow"> {
- let assemblyFormat = "`<` $value `>`";
-}
-
#endif // ARITH_BASE
diff --git a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
index cd0102f91ef152..6d133d69dd0faf 100644
--- a/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
+++ b/mlir/include/mlir/Dialect/Arith/IR/ArithOps.td
@@ -137,20 +137,6 @@ class Arith_CompareOpOfAnyRank<string mnemonic, list<Trait> traits = []> :
let results = (outs BoolLikeOfAnyRank:$result);
}
-class Arith_IntBinaryOpWithOverflowFlags<string mnemonic, list<Trait> traits = []> :
- Arith_BinaryOp<mnemonic, traits #
- [Pure, DeclareOpInterfaceMethods<InferIntRangeInterface>,
- DeclareOpInterfaceMethods<ArithIntegerOverflowFlagsInterface>]>,
- Arguments<(ins SignlessIntegerLike:$lhs, SignlessIntegerLike:$rhs,
- DefaultValuedAttr<
- Arith_IntegerOverflowAttr,
- "::mlir::arith::IntegerOverflowFlags::none">:$overflowFlags)>,
- Results<(outs SignlessIntegerLike:$result)> {
-
- let assemblyFormat = [{ $lhs `,` $rhs (`overflow` `` $overflowFlags^)?
- attr-dict `:` type($result) }];
-}
-
//===----------------------------------------------------------------------===//
// ConstantOp
//===----------------------------------------------------------------------===//
@@ -206,7 +192,7 @@ def Arith_ConstantOp : Op<Arith_Dialect, "constant",
// AddIOp
//===----------------------------------------------------------------------===//
-def Arith_AddIOp : Arith_IntBinaryOpWithOverflowFlags<"addi", [Commutative]> {
+def Arith_AddIOp : Arith_TotalIntBinaryOp<"addi", [Commutative]> {
let summary = "integer addition operation";
let description = [{
Performs N-bit addition on the operands. The operands are interpreted as
@@ -217,12 +203,8 @@ def Arith_AddIOp : Arith_IntBinaryOpWithOverflowFlags<"addi", [Commutative]> {
The `addi` operation takes two operands and returns one result, each of
these is required to be the same type. This type may be an integer scalar type,
- a vector whose element type is integer, or a tensor of integers.
-
- This op supports `nuw`/`nsw` overflow flags which stands stand for
- "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
- `nsw` flags are present, and an unsigned/signed overflow occurs
- (respectively), the result is poison.
+ a vector whose element type is integer, or a tensor of integers. It has no
+ standard attributes.
Example:
@@ -230,10 +212,7 @@ def Arith_AddIOp : Arith_IntBinaryOpWithOverflowFlags<"addi", [Commutative]> {
// Scalar addition.
%a = arith.addi %b, %c : i64
- // Scalar addition with overflow flags.
- %a = arith.addi %b, %c overflow<nsw, nuw> : i64
-
- // SIMD vector element-wise addition.
+ // SIMD vector element-wise addition, e.g. for Intel SSE.
%f = arith.addi %g, %h : vector<4xi32>
// Tensor element-wise addition.
@@ -299,41 +278,21 @@ def Arith_AddUIExtendedOp : Arith_Op<"addui_extended", [Pure, Commutative,
// SubIOp
//===----------------------------------------------------------------------===//
-def Arith_SubIOp : Arith_IntBinaryOpWithOverflowFlags<"subi"> {
+def Arith_SubIOp : Arith_TotalIntBinaryOp<"subi"> {
let summary = [{
Integer subtraction operation.
}];
let description = [{
- Performs N-bit subtraction on the operands. The operands are interpreted as unsigned
- bitvectors. The result is represented by a bitvector containing the mathematical
- value of the subtraction modulo 2^n, where `n` is the bitwidth. Because `arith`
- integers use a two's complement representation, this operation is applicable on
+ Performs N-bit subtraction on the operands. The operands are interpreted as unsigned
+ bitvectors. The result is represented by a bitvector containing the mathematical
+ value of the subtraction modulo 2^n, where `n` is the bitwidth. Because `arith`
+ integers use a two's complement representation, this operation is applicable on
both signed and unsigned integer operands.
The `subi` operation takes two operands and returns one result, each of
- these is required to be the same type. This type may be an integer scalar type,
- a vector whose element type is integer, or a tensor of integers.
-
- This op supports `nuw`/`nsw` overflow flags which stands stand for
- "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
- `nsw` flags are present, and an unsigned/signed overflow occurs
- (respectively), the result is poison.
-
- Example:
-
- ```mlir
- // Scalar subtraction.
- %a = arith.subi %b, %c : i64
-
- // Scalar subtraction with overflow flags.
- %a = arith.subi %b, %c overflow<nsw, nuw> : i64
-
- // SIMD vector element-wise subtraction.
- %f = arith.subi %g, %h : vector<4xi32>
-
- // Tensor element-wise subtraction.
- %x = arith.subi %y, %z : tensor<4x?xi8>
- ```
+ these is required to be the same type. This type may be an integer scalar type,
+ a vector whose element type is integer, or a tensor of integers. It has no
+ standard attributes.
}];
let hasFolder = 1;
let hasCanonicalizer = 1;
@@ -343,41 +302,21 @@ def Arith_SubIOp : Arith_IntBinaryOpWithOverflowFlags<"subi"> {
// MulIOp
//===----------------------------------------------------------------------===//
-def Arith_MulIOp : Arith_IntBinaryOpWithOverflowFlags<"muli", [Commutative]> {
+def Arith_MulIOp : Arith_TotalIntBinaryOp<"muli", [Commutative]> {
let summary = [{
Integer multiplication operation.
}];
let description = [{
- Performs N-bit multiplication on the operands. The operands are interpreted as
- unsigned bitvectors. The result is represented by a bitvector containing the
- mathematical value of the multiplication modulo 2^n, where `n` is the bitwidth.
- Because `arith` integers use a two's complement representation, this operation is
+ Performs N-bit multiplication on the operands. The operands are interpreted as
+ unsigned bitvectors. The result is represented by a bitvector containing the
+ mathematical value of the multiplication modulo 2^n, where `n` is the bitwidth.
+ Because `arith` integers use a two's complement representation, this operation is
applicable on both signed and unsigned integer operands.
The `muli` operation takes two operands and returns one result, each of
- these is required to be the same type. This type may be an integer scalar type,
- a vector whose element type is integer, or a tensor of integers.
-
- This op supports `nuw`/`nsw` overflow flags which stands stand for
- "No Unsigned Wrap" and "No Signed Wrap", respectively. If the `nuw` and/or
- `nsw` flags are present, and an unsigned/signed overflow occurs
- (respectively), the result is poison.
-
- Example:
-
- ```mlir
- // Scalar multiplication.
- %a = arith.muli %b, %c : i64
-
- // Scalar multiplication with overflow flags.
- %a = arith.muli %b, %c overflow<nsw, nuw> : i64
-
- // SIMD vector element-wise multiplication.
- %f = arith.muli %g, %h : vector<4xi32>
-
- // Tensor element-wise multiplication.
- %x = arith.muli %y, %z : tensor<4x?xi8>
- ```
+ these is required to be the same type. This type may be an integer scalar type,
+ a vector whose element type is integer, or a tensor of integers. It has no
+ standard attributes.
}];
let hasFolder = 1;
let hasCanonicalizer = 1;
diff --git a/mlir/include/mlir/Dialect/Arith/IR/ArithOpsInterfaces.td b/mlir/include/mlir/Dialect/Arith/IR/ArithOpsInterfaces.td
index e248422f84db84..acaecf6f409dcf 100644
--- a/mlir/include/mlir/Dialect/Arith/IR/ArithOpsInterfaces.td
+++ b/mlir/include/mlir/Dialect/Arith/IR/ArithOpsInterfaces.td
@@ -49,61 +49,4 @@ def ArithFastMathInterface : OpInterface<"ArithFastMathInterface"> {
];
}
-def ArithIntegerOverflowFlagsInterface : OpInterface<"ArithIntegerOverflowFlagsInterface"> {
- let description = [{
- Access to op integer overflow flags.
- }];
-
- let cppNamespace = "::mlir::arith";
-
- let methods = [
- InterfaceMethod<
- /*desc=*/ "Returns an IntegerOverflowFlagsAttr attribute for the operation",
- /*returnType=*/ "IntegerOverflowFlagsAttr",
- /*methodName=*/ "getOverflowAttr",
- /*args=*/ (ins),
- /*methodBody=*/ [{}],
- /*defaultImpl=*/ [{
- auto op = cast<ConcreteOp>(this->getOperation());
- return op.getOverflowFlagsAttr();
- }]
- >,
- InterfaceMethod<
- /*desc=*/ "Returns whether the operation has the No Unsigned Wrap keyword",
- /*returnType=*/ "bool",
- /*methodName=*/ "hasNoUnsignedWrap",
- /*args=*/ (ins),
- /*methodBody=*/ [{}],
- /*defaultImpl=*/ [{
- auto op = cast<ConcreteOp>(this->getOperation());
- IntegerOverflowFlags flags = op.getOverflowFlagsAttr().getValue();
- return bitEnumContainsAll(flags, IntegerOverflowFlags::nuw);
- }]
- >,
- InterfaceMethod<
- /*desc=*/ "Returns whether the operation has the No Signed Wrap keyword",
- /*returnType=*/ "bool",
- /*methodName=*/ "hasNoSignedWrap",
- /*args=*/ (ins),
- /*methodBody=*/ [{}],
- /*defaultImpl=*/ [{
- auto op = cast<ConcreteOp>(this->getOperation());
- IntegerOverflowFlags flags = op.getOverflowFlagsAttr().getValue();
- return bitEnumContainsAll(flags, IntegerOverflowFlags::nsw);
- }]
- >,
- StaticInterfaceMethod<
- /*desc=*/ [{Returns the name of the IntegerOveflowFlagsAttr attribute
- for the operation}],
- /*returnType=*/ "StringRef",
- /*methodName=*/ "getIntegerOverflowAttrName",
- /*args=*/ (ins),
- /*methodBody=*/ [{}],
- /*defaultImpl=*/ [{
- return "overflowFlags";
- }]
- >
- ];
-}
-
#endif // ARITH_OPS_INTERFACES
diff --git a/mlir/lib/Conversion/ArithCommon/AttrToLLVMConverter.cpp b/mlir/lib/Conversion/ArithCommon/AttrToLLVMConverter.cpp
index 3e9aef87b9ef1f..8c5d76f9f2d72e 100644
--- a/mlir/lib/Conversion/ArithCommon/AttrToLLVMConverter.cpp
+++ b/mlir/lib/Conversion/ArithCommon/AttrToLLVMConverter.cpp
@@ -10,6 +10,7 @@
using namespace mlir;
+// Map arithmetic fastmath enum values to LLVMIR enum values.
LLVM::FastmathFlags
mlir::arith::convertArithFastMathFlagsToLLVM(arith::FastMathFlags arithFMF) {
LLVM::FastmathFlags llvmFMF{};
@@ -21,37 +22,17 @@ mlir::arith::convertArithFastMathFlagsToLLVM(arith::FastMathFlags arithFMF) {
{arith::FastMathFlags::contract, LLVM::FastmathFlags::contract},
{arith::FastMathFlags::afn, LLVM::FastmathFlags::afn},
{arith::FastMathFlags::reassoc, LLVM::FastmathFlags::reassoc}};
- for (auto [arithFlag, llvmFlag] : flags) {
- if (bitEnumContainsAny(arithFMF, arithFlag))
- llvmFMF = llvmFMF | llvmFlag;
+ for (auto fmfMap : flags) {
+ if (bitEnumContainsAny(arithFMF, fmfMap.first))
+ llvmFMF = llvmFMF | fmfMap.second;
}
return llvmFMF;
}
+// Create an LLVM fastmath attribute from a given arithmetic fastmath attribute.
LLVM::FastmathFlagsAttr
mlir::arith::convertArithFastMathAttrToLLVM(arith::FastMathFlagsAttr fmfAttr) {
arith::FastMathFlags arithFMF = fmfAttr.getValue();
return LLVM::FastmathFlagsAttr::get(
fmfAttr.getContext(), convertArithFastMathFlagsToLLVM(arithFMF));
}
-
-LLVM::IntegerOverflowFlags mlir::arith::convertArithOveflowFlagsToLLVM(
- arith::IntegerOverflowFlags arithFlags) {
- LLVM::IntegerOverflowFlags llvmFlags{};
- const std::pair<arith::IntegerOverflowFlags, LLVM::IntegerOverflowFlags>
- flags[] = {
- {arith::IntegerOverflowFlags::nsw, LLVM::IntegerOverflowFlags::nsw},
- {arith::IntegerOverflowFlags::nuw, LLVM::IntegerOverflowFlags::nuw}};
- for (auto [arithFlag, llvmFlag] : flags) {
- if (bitEnumContainsAny(arithFlags, arithFlag))
- llvmFlags = llvmFlags | llvmFlag;
- }
- return llvmFlags;
-}
-
-LLVM::IntegerOverflowFlagsAttr mlir::arith::convertArithOveflowAttrToLLVM(
- arith::IntegerOverflowFlagsAttr flagsAttr) {
- arith::IntegerOverflowFlags arithFlags = flagsAttr.getValue();
- return LLVM::IntegerOverflowFlagsAttr::get(
- flagsAttr.getContext(), convertArithOveflowFlagsToLLVM(arithFlags));
-}
diff --git a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
index cf46e0d3ac46ac..5e4213cc4e874a 100644
--- a/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
+++ b/mlir/lib/Conversion/ArithToLLVM/ArithToLLVM.cpp
@@ -35,9 +35,7 @@ namespace {
using AddFOpLowering =
VectorConvertToLLVMPattern<arith::AddFOp, LLVM::FAddOp,
arith::AttrConvertFastMathToLLVM>;
-using AddIOpLowering =
- VectorConvertToLLVMPattern<arith::AddIOp, LLVM::AddOp,
- arith::AttrConvertOverflowToLLVM>;
+using AddIOpLowering = VectorConvertToLLVMPattern<arith::AddIOp, LLVM::AddOp>;
using AndIOpLowering = VectorConvertToLLVMPattern<arith::AndIOp, LLVM::AndOp>;
using BitcastOpLowering =
VectorConvertToLLVMPattern<arith::BitcastOp, LLVM::BitcastOp>;
@@ -80,9 +78,7 @@ using MinUIOpLowering =
using MulFOpLowering =
VectorConvertToLLVMPattern<arith::MulFOp, LLVM::FMulOp,
arith::AttrConvertFastMathToLLVM>;
-using MulIOpLowering =
- VectorConvertToLLVMPattern<arith::MulIOp, LLVM::MulOp,
- arith::AttrConvertOverflowToLLVM>;
+using MulIOpLowering = VectorConvertToLLVMPattern<arith::MulIOp, LLVM::MulOp>;
using NegFOpLowering =
VectorConvertToLLVMPattern<arith::NegFOp, LLVM::FNegOp,
arith::AttrConvertFastMathToLLVM>;
@@ -106,9 +102,7 @@ using SIToFPOpLowering =
using SubFOpLowering =
VectorConvertToLLVMPattern<arith::SubFOp, LLVM::FSubOp,
arith::AttrConvertFastMathToLLVM>;
-using SubIOpLowering =
- VectorConvertToLLVMPattern<arith::SubIOp, LLVM::SubOp,
- arith::AttrConvertOverflowToLLVM>;
+using SubIOpLowering = VectorConvertToLLVMPattern<arith::SubIOp, LLVM::SubOp>;
using TruncFOpLowering =
VectorConvertToLLVMPattern<arith::TruncFOp, LLVM::FPTruncOp>;
using TruncIOpLowering =
diff --git a/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td b/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
index 18ceeb0054045e..ef951647ccd146 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
+++ b/mlir/lib/Dialect/Arith/IR/ArithCanonicalization.td
@@ -24,12 +24,6 @@ def SubIntAttrs : NativeCodeCall<"subIntegerAttrs($_builder, $0, $1, $2)">;
// Multiply two integer attributes and create a new one with the result.
def MulIntAttrs : NativeCodeCall<"mulIntegerAttrs($_builder, $0, $1, $2)">;
-// TODO: Canonicalizations currently doesn't take into account integer overflow
-// flags and always reset them to default (wraparound) which is safe but can
-// inhibit later optimizations. Individual patterns must be reviewed for
-// better handling of overflow flags.
-def DefOverflow : NativeCodeCall<"getDefOverflowFlags($_builder)">;
-
class cast<string type> : NativeCodeCall<"::mlir::cast<" # type # ">($0)">;
//===----------------------------------------------------------------------===//
@@ -42,26 +36,23 @@ class cast<string type> : NativeCodeCall<"::mlir::cast<" # type # ">($0)">;
// addi(addi(x, c0), c1) -> addi(x, c0 + c1)
def AddIAddConstant :
Pat<(Arith_AddIOp:$res
- (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0), $ovf1),
- (ConstantLikeMatcher APIntAttr:$c1), $ovf2),
- (Arith_AddIOp $x, (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)),
- (DefOverflow))>;
+ (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0)),
+ (ConstantLikeMatcher APIntAttr:$c1)),
+ (Arith_AddIOp $x, (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)))>;
// addi(subi(x, c0), c1) -> addi(x, c1 - c0)
def AddISubConstantRHS :
Pat<(Arith_AddIOp:$res
- (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0), $ovf1),
- (ConstantLikeMatcher APIntAttr:$c1), $ovf2),
- (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)),
- (DefOverflow))>;
+ (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0)),
+ (ConstantLikeMatcher APIntAttr:$c1)),
+ (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)))>;
// addi(subi(c0, x), c1) -> subi(c0 + c1, x)
def AddISubConstantLHS :
Pat<(Arith_AddIOp:$res
- (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x, $ovf1),
- (ConstantLikeMatcher APIntAttr:$c1), $ovf2),
- (Arith_SubIOp (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)), $x,
- (DefOverflow))>;
+ (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x),
+ (ConstantLikeMatcher APIntAttr:$c1)),
+ (Arith_SubIOp (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)), $x)>;
def IsScalarOrSplatNegativeOne :
Constraint<And<[
@@ -72,25 +63,24 @@ def IsScalarOrSplatNegativeOne :
def AddIMulNegativeOneRhs :
Pat<(Arith_AddIOp
$x,
- (Arith_MulIOp $y, (ConstantLikeMatcher AnyAttr:$c0), $ovf1), $ovf2),
- (Arith_SubIOp $x, $y, (DefOverflow)),
+ (Arith_MulIOp $y, (ConstantLikeMatcher AnyAttr:$c0))),
+ (Arith_SubIOp $x, $y),
[(IsScalarOrSplatNegativeOne $c0)]>;
// addi(muli(x, -1), y) -> subi(y, x)
def AddIMulNegativeOneLhs :
Pat<(Arith_AddIOp
- (Arith_MulIOp $x, (ConstantLikeMatcher AnyAttr:$c0), $ovf1),
- $y, $ovf2),
- (Arith_SubIOp $y, $x, (DefOverflow)),
+ (Arith_MulIOp $x, (ConstantLikeMatcher AnyAttr:$c0)),
+ $y),
+ (Arith_SubIOp $y, $x),
[(IsScalarOrSplatNegativeOne $c0)]>;
// muli(muli(x, c0), c1) -> muli(x, c0 * c1)
def MulIMulIConstant :
Pat<(Arith_MulIOp:$res
- (Arith_MulIOp $x, (ConstantLikeMatcher APIntAttr:$c0), $ovf1),
- (ConstantLikeMatcher APIntAttr:$c1), $ovf2),
- (Arith_MulIOp $x, (Arith_ConstantOp (MulIntAttrs $res, $c0, $c1)),
- (DefOverflow))>;
+ (Arith_MulIOp $x, (ConstantLikeMatcher APIntAttr:$c0)),
+ (ConstantLikeMatcher APIntAttr:$c1)),
+ (Arith_MulIOp $x, (Arith_ConstantOp (MulIntAttrs $res, $c0, $c1)))>;
//===----------------------------------------------------------------------===//
// AddUIExtendedOp
@@ -100,7 +90,7 @@ def MulIMulIConstant :
// uses. Since the 'overflow' result is unused, any replacement value will do.
def AddUIExtendedToAddI:
Pattern<(Arith_AddUIExtendedOp:$res $x, $y),
- [(Arith_AddIOp $x, $y, (DefOverflow)), (replaceWithValue $x)],
+ [(Arith_AddIOp $x, $y), (replaceWithValue $x)],
[(Constraint<CPred<"$0.getUses().empty()">> $res__1)]>;
//===----------------------------------------------------------------------===//
@@ -110,55 +100,49 @@ def AddUIExtendedToAddI:
// subi(addi(x, c0), c1) -> addi(x, c0 - c1)
def SubIRHSAddConstant :
Pat<(Arith_SubIOp:$res
- (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0), $ovf1),
- (ConstantLikeMatcher APIntAttr:$c1), $ovf2),
- (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c0, $c1)),
- (DefOverflow))>;
+ (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0)),
+ (ConstantLikeMatcher APIntAttr:$c1)),
+ (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c0, $c1)))>;
// subi(c1, addi(x, c0)) -> subi(c1 - c0, x)
def SubILHSAddConstant :
Pat<(Arith_SubIOp:$res
(ConstantLikeMatcher APIntAttr:$c1),
- (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0), $ovf1), $ovf2),
- (Arith_SubIOp (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)), $x,
- (DefOverflow))>;
+ (Arith_AddIOp $x, (ConstantLikeMatcher APIntAttr:$c0))),
+ (Arith_SubIOp (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)), $x)>;
// subi(subi(x, c0), c1) -> subi(x, c0 + c1)
def SubIRHSSubConstantRHS :
Pat<(Arith_SubIOp:$res
- (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0), $ovf1),
- (ConstantLikeMatcher APIntAttr:$c1), $ovf2),
- (Arith_SubIOp $x, (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)),
- (DefOverflow))>;
+ (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0)),
+ (ConstantLikeMatcher APIntAttr:$c1)),
+ (Arith_SubIOp $x, (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)))>;
// subi(subi(c0, x), c1) -> subi(c0 - c1, x)
def SubIRHSSubConstantLHS :
Pat<(Arith_SubIOp:$res
- (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x, $ovf1),
- (ConstantLikeMatcher APIntAttr:$c1), $ovf2),
- (Arith_SubIOp (Arith_ConstantOp (SubIntAttrs $res, $c0, $c1)), $x,
- (DefOverflow))>;
+ (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x),
+ (ConstantLikeMatcher APIntAttr:$c1)),
+ (Arith_SubIOp (Arith_ConstantOp (SubIntAttrs $res, $c0, $c1)), $x)>;
// subi(c1, subi(x, c0)) -> subi(c0 + c1, x)
def SubILHSSubConstantRHS :
Pat<(Arith_SubIOp:$res
(ConstantLikeMatcher APIntAttr:$c1),
- (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0), $ovf1), $ovf2),
- (Arith_SubIOp (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)), $x,
- (DefOverflow))>;
+ (Arith_SubIOp $x, (ConstantLikeMatcher APIntAttr:$c0))),
+ (Arith_SubIOp (Arith_ConstantOp (AddIntAttrs $res, $c0, $c1)), $x)>;
// subi(c1, subi(c0, x)) -> addi(x, c1 - c0)
def SubILHSSubConstantLHS :
Pat<(Arith_SubIOp:$res
(ConstantLikeMatcher APIntAttr:$c1),
- (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x, $ovf1), $ovf2),
- (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)),
- (DefOverflow))>;
+ (Arith_SubIOp (ConstantLikeMatcher APIntAttr:$c0), $x)),
+ (Arith_AddIOp $x, (Arith_ConstantOp (SubIntAttrs $res, $c1, $c0)))>;
// subi(subi(a, b), a) -> subi(0, b)
def SubISubILHSRHSLHS :
- Pat<(Arith_SubIOp:$res (Arith_SubIOp $x, $y, $ovf1), $x, $ovf2),
- (Arith_SubIOp (Arith_ConstantOp (GetZeroAttr $y)), $y, (DefOverflow))>;
+ Pat<(Arith_SubIOp:$res (Arith_SubIOp $x, $y), $x),
+ (Arith_SubIOp (Arith_ConstantOp (GetZeroAttr $y)), $y)>;
//===----------------------------------------------------------------------===//
// MulSIExtendedOp
@@ -168,7 +152,7 @@ def SubISubILHSRHSLHS :
// Since the `high` result it not used, any replacement value will do.
def MulSIExtendedToMulI :
Pattern<(Arith_MulSIExtendedOp:$res $x, $y),
- [(Arith_MulIOp $x, $y, (DefOverflow)), (replaceWithValue $x)],
+ [(Arith_MulIOp $x, $y), (replaceWithValue $x)],
[(Constraint<CPred<"$0.getUses().empty()">> $res__1)]>;
@@ -195,7 +179,7 @@ def MulSIExtendedRHSOne :
// Since the `high` result it not used, any replacement value will do.
def MulUIExtendedToMulI :
Pattern<(Arith_MulUIExtendedOp:$res $x, $y),
- [(Arith_MulIOp $x, $y, (DefOverflow)), (replaceWithValue $x)],
+ [(Arith_MulIOp $x, $y), (replaceWithValue $x)],
[(Constraint<CPred<"$0.getUses().empty()">> $res__1)]>;
//===----------------------------------------------------------------------===//
@@ -419,7 +403,7 @@ def TruncIShrSIToTrunciShrUI :
def TruncIShrUIMulIToMulSIExtended :
Pat<(Arith_TruncIOp:$tr (Arith_ShRUIOp
(Arith_MulIOp:$mul
- (Arith_ExtSIOp $x), (Arith_ExtSIOp $y), $ovf1),
+ (Arith_ExtSIOp $x), (Arith_ExtSIOp $y)),
(ConstantLikeMatcher AnyAttr:$c0))),
(Arith_MulSIExtendedOp:$res__1 $x, $y),
[(ValuesWithSameType $tr, $x, $y),
@@ -430,7 +414,7 @@ def TruncIShrUIMulIToMulSIExtended :
def TruncIShrUIMulIToMulUIExtended :
Pat<(Arith_TruncIOp:$tr (Arith_ShRUIOp
(Arith_MulIOp:$mul
- (Arith_ExtUIOp $x), (Arith_ExtUIOp $y), $ovf1),
+ (Arith_ExtUIOp $x), (Arith_ExtUIOp $y)),
(ConstantLikeMatcher AnyAttr:$c0))),
(Arith_MulUIExtendedOp:$res__1 $x, $y),
[(ValuesWithSameType $tr, $x, $y),
diff --git a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
index 2d124ce4980fa4..ff72becc8dfa77 100644
--- a/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
+++ b/mlir/lib/Dialect/Arith/IR/ArithOps.cpp
@@ -61,11 +61,6 @@ static IntegerAttr mulIntegerAttrs(PatternRewriter &builder, Value res,
return applyToIntegerAttrs(builder, res, lhs, rhs, std::multiplies<APInt>());
}
-static IntegerOverflowFlagsAttr getDefOverflowFlags(OpBuilder &builder) {
- return IntegerOverflowFlagsAttr::get(builder.getContext(),
- IntegerOverflowFlags::none);
-}
-
/// Invert an integer comparison predicate.
arith::CmpIPredicate arith::invertPredicate(arith::CmpIPredicate pred) {
switch (pred) {
diff --git a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
index 8937b24e0d174d..e16dbb5661058c 100644
--- a/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
+++ b/mlir/test/Conversion/ArithToLLVM/arith-to-llvm.mlir
@@ -575,16 +575,3 @@ func.func @ops_supporting_fastmath(%arg0: f32, %arg1: f32, %arg2: i32) {
%7 = arith.subf %arg0, %arg1 fastmath<fast> : f32
return
}
-
-// -----
-
-// CHECK-LABEL: @ops_supporting_overflow
-func.func @ops_supporting_overflow(%arg0: i64, %arg1: i64) {
- // CHECK: %{{.*}} = llvm.add %{{.*}}, %{{.*}} overflow<nsw> : i64
- %0 = arith.addi %arg0, %arg1 overflow<nsw> : i64
- // CHECK: %{{.*}} = llvm.sub %{{.*}}, %{{.*}} overflow<nuw> : i64
- %1 = arith.subi %arg0, %arg1 overflow<nuw> : i64
- // CHECK: %{{.*}} = llvm.mul %{{.*}}, %{{.*}} overflow<nsw, nuw> : i64
- %2 = arith.muli %arg0, %arg1 overflow<nsw, nuw> : i64
- return
-}
diff --git a/mlir/test/Dialect/Arith/ops.mlir b/mlir/test/Dialect/Arith/ops.mlir
index 8ae3273f32c6b0..6e10e540d1d178 100644
--- a/mlir/test/Dialect/Arith/ops.mlir
+++ b/mlir/test/Dialect/Arith/ops.mlir
@@ -1138,14 +1138,3 @@ func.func @select_tensor_encoding(
%0 = arith.select %arg0, %arg1, %arg2 : tensor<8xi1, "foo">, tensor<8xi32, "foo">
return %0 : tensor<8xi32, "foo">
}
-
-// CHECK-LABEL: @intflags_func
-func.func @intflags_func(%arg0: i64, %arg1: i64) {
- // CHECK: %{{.*}} = arith.addi %{{.*}}, %{{.*}} overflow<nsw> : i64
- %0 = arith.addi %arg0, %arg1 overflow<nsw> : i64
- // CHECK: %{{.*}} = arith.subi %{{.*}}, %{{.*}} overflow<nuw> : i64
- %1 = arith.subi %arg0, %arg1 overflow<nuw> : i64
- // CHECK: %{{.*}} = arith.muli %{{.*}}, %{{.*}} overflow<nsw, nuw> : i64
- %2 = arith.muli %arg0, %arg1 overflow<nsw, nuw> : i64
- return
-}
diff --git a/mlir/test/python/ir/diagnostic_handler.py b/mlir/test/python/ir/diagnostic_handler.py
index d516cda8198976..2f4300d2c55dfa 100644
--- a/mlir/test/python/ir/diagnostic_handler.py
+++ b/mlir/test/python/ir/diagnostic_handler.py
@@ -113,7 +113,7 @@ def testDiagnosticNonEmptyNotes():
def callback(d):
# CHECK: DIAGNOSTIC:
# CHECK: message='arith.addi' op requires one result
- # CHECK: notes=['see current operation: "arith.addi"() {{.*}} : () -> ()']
+ # CHECK: notes=['see current operation: "arith.addi"() : () -> ()']
print(f"DIAGNOSTIC:")
print(f" message={d.message}")
print(f" notes={list(map(str, d.notes))}")
More information about the Mlir-commits
mailing list