[Mlir-commits] [mlir] [mlir] add debug messages explaining failure reasons of isValidIntOrFloat (PR #69476)
Jeremy Kun
llvmlistbot at llvm.org
Wed Oct 18 10:49:35 PDT 2023
https://github.com/j2kun updated https://github.com/llvm/llvm-project/pull/69476
>From b667268b20d48d583da70ce3426e504b6fb93d25 Mon Sep 17 00:00:00 2001
From: Jeremy Kun <j2kun at users.noreply.github.com>
Date: Wed, 18 Oct 2023 08:28:17 -0700
Subject: [PATCH 1/2] [mlir] Add debug messages for failures of
isValidIntOrFloat
I have run into assertion failures quite often when calling this method
via `DenseElementsAttr::get`, and I think this would help, at the very
least, by printing out the bit width size mismatches, rather than a
plain assertion failure. I included all the other cases in the method
for completeness
---
mlir/lib/IR/BuiltinAttributes.cpp | 41 +++++++++++++++++++++++++------
1 file changed, 33 insertions(+), 8 deletions(-)
diff --git a/mlir/lib/IR/BuiltinAttributes.cpp b/mlir/lib/IR/BuiltinAttributes.cpp
index 64949a17107297a..4f5ccb2c5c4a0f5 100644
--- a/mlir/lib/IR/BuiltinAttributes.cpp
+++ b/mlir/lib/IR/BuiltinAttributes.cpp
@@ -20,9 +20,12 @@
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/TypeSwitch.h"
+#include "llvm/Support/Debug.h"
#include "llvm/Support/Endian.h"
#include <optional>
+#define DEBUG_TYPE "builtinattributes"
+
using namespace mlir;
using namespace mlir::detail;
@@ -1098,24 +1101,44 @@ bool DenseElementsAttr::isValidRawBuffer(ShapedType type,
static bool isValidIntOrFloat(Type type, int64_t dataEltSize, bool isInt,
bool isSigned) {
// Make sure that the data element size is the same as the type element width.
- if (getDenseElementBitWidth(type) !=
- static_cast<size_t>(dataEltSize * CHAR_BIT))
+ auto denseEltBitWidth = getDenseElementBitWidth(type);
+ auto dataSize = static_cast<size_t>(dataEltSize * CHAR_BIT);
+ if (denseEltBitWidth != dataSize) {
+ LLVM_DEBUG(llvm::dbgs() << "expected dense element bit width "
+ << denseEltBitWidth << " to match data size "
+ << dataSize << " for type " << type << "\n");
return false;
+ }
// Check that the element type is either float or integer or index.
- if (!isInt)
- return llvm::isa<FloatType>(type);
+ if (!isInt) {
+ bool valid = llvm::isa<FloatType>(type);
+ if (!valid)
+ LLVM_DEBUG(llvm::dbgs()
+ << "expected float type when isInt is false, but found "
+ << type << "\n");
+ return valid;
+ }
if (type.isIndex())
return true;
auto intType = llvm::dyn_cast<IntegerType>(type);
- if (!intType)
+ if (!intType) {
+ LLVM_DEBUG(llvm::dbgs()
+ << "expected integer type when isInt is true, but found " << type
+ << "\n");
return false;
+ }
// Make sure signedness semantics is consistent.
if (intType.isSignless())
return true;
- return intType.isSigned() ? isSigned : !isSigned;
+
+ bool valid = intType.isSigned() == isSigned;
+ if (!valid)
+ LLVM_DEBUG(llvm::dbgs() << "expected signedness " << isSigned
+ << " to match type " << type << "\n");
+ return valid;
}
/// Defaults down the subclass implementation.
@@ -1247,12 +1270,14 @@ DenseElementsAttr DenseElementsAttr::bitcast(Type newElType) {
DenseElementsAttr
DenseElementsAttr::mapValues(Type newElementType,
function_ref<APInt(const APInt &)> mapping) const {
- return llvm::cast<DenseIntElementsAttr>(*this).mapValues(newElementType, mapping);
+ return llvm::cast<DenseIntElementsAttr>(*this).mapValues(newElementType,
+ mapping);
}
DenseElementsAttr DenseElementsAttr::mapValues(
Type newElementType, function_ref<APInt(const APFloat &)> mapping) const {
- return llvm::cast<DenseFPElementsAttr>(*this).mapValues(newElementType, mapping);
+ return llvm::cast<DenseFPElementsAttr>(*this).mapValues(newElementType,
+ mapping);
}
ShapedType DenseElementsAttr::getType() const {
>From b7d0e12b80a84a0190d84adde91e0821d1b8bf5e Mon Sep 17 00:00:00 2001
From: Jeremy Kun <j2kun at users.noreply.github.com>
Date: Wed, 18 Oct 2023 10:49:23 -0700
Subject: [PATCH 2/2] Add hints to rerun with -debug-only=builtinattributes
---
mlir/lib/IR/BuiltinAttributes.cpp | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/mlir/lib/IR/BuiltinAttributes.cpp b/mlir/lib/IR/BuiltinAttributes.cpp
index 4f5ccb2c5c4a0f5..89b1ed67f5d067a 100644
--- a/mlir/lib/IR/BuiltinAttributes.cpp
+++ b/mlir/lib/IR/BuiltinAttributes.cpp
@@ -1356,8 +1356,9 @@ DenseElementsAttr DenseIntOrFPElementsAttr::getRawComplex(ShapedType type,
bool isInt,
bool isSigned) {
assert(::isValidIntOrFloat(
- llvm::cast<ComplexType>(type.getElementType()).getElementType(),
- dataEltSize / 2, isInt, isSigned));
+ llvm::cast<ComplexType>(type.getElementType()).getElementType(),
+ dataEltSize / 2, isInt, isSigned) &&
+ "Try re-running with -debug-only=builtinattributes");
int64_t numElements = data.size() / dataEltSize;
(void)numElements;
@@ -1372,8 +1373,9 @@ DenseElementsAttr
DenseIntOrFPElementsAttr::getRawIntOrFloat(ShapedType type, ArrayRef<char> data,
int64_t dataEltSize, bool isInt,
bool isSigned) {
- assert(
- ::isValidIntOrFloat(type.getElementType(), dataEltSize, isInt, isSigned));
+ assert(::isValidIntOrFloat(type.getElementType(), dataEltSize, isInt,
+ isSigned) &&
+ "Try re-running with -debug-only=builtinattributes");
int64_t numElements = data.size() / dataEltSize;
assert(numElements == 1 || numElements == type.getNumElements());
More information about the Mlir-commits
mailing list