diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td index 690243525ede4..bb528fec8c684 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td +++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td @@ -1095,8 +1095,8 @@ def LLVM_TBAATagArrayAttr //===----------------------------------------------------------------------===// def LLVM_ConstantRangeAttr : LLVM_Attr<"ConstantRange", "constant_range"> { let parameters = (ins - "::llvm::APInt":$lower, - "::llvm::APInt":$upper + APIntParameter<"">:$lower, + APIntParameter<"">:$upper ); let summary = "A range of two integers, corresponding to LLVM's ConstantRange"; let description = [{ diff --git a/mlir/include/mlir/IR/AttrTypeBase.td b/mlir/include/mlir/IR/AttrTypeBase.td index 38d38cf098df3..f6ec4989c9787 100644 --- a/mlir/include/mlir/IR/AttrTypeBase.td +++ b/mlir/include/mlir/IR/AttrTypeBase.td @@ -383,6 +383,14 @@ class StringRefParameter : let defaultValue = value; } +// For APInts, which require comparison supporting different bitwidths. The +// default APInt comparison operator asserts when the bitwidths differ, so +// a custom implementation is necessary. +class APIntParameter : + AttrOrTypeParameter<"::llvm::APInt", desc> { + let comparator = "$_lhs.getBitWidth() == $_rhs.getBitWidth() && $_lhs == $_rhs"; +} + // For APFloats, which require comparison. class APFloatParameter : AttrOrTypeParameter<"::llvm::APFloat", desc> { diff --git a/mlir/test/Dialect/LLVMIR/range-attr.mlir b/mlir/test/Dialect/LLVMIR/range-attr.mlir new file mode 100644 index 0000000000000..5f2b67609743b --- /dev/null +++ b/mlir/test/Dialect/LLVMIR/range-attr.mlir @@ -0,0 +1,10 @@ +// RUN: mlir-opt %s -o - | FileCheck %s + +// CHECK: #llvm.constant_range +llvm.func external @foo1(!llvm.ptr, i64) -> (i32 {llvm.range = #llvm.constant_range}) +// CHECK: #llvm.constant_range +llvm.func external @foo2(!llvm.ptr, i64) -> (i8 {llvm.range = #llvm.constant_range}) +// CHECK: #llvm.constant_range +llvm.func external @foo3(!llvm.ptr, i64) -> (i64 {llvm.range = #llvm.constant_range}) +// CHECK: #llvm.constant_range +llvm.func external @foo4(!llvm.ptr, i64) -> (i32 {llvm.range = #llvm.constant_range})