From 7dc976da74a00e6526ea0b6e52775f6c12b73f91 Mon Sep 17 00:00:00 2001 From: Andreas Jonson Date: Sun, 28 Jul 2024 17:51:27 +0200 Subject: [PATCH 1/2] Add pre-commit tests. NFC --- .../Transforms/Inline/ret_attr_align_and_noundef.ll | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll b/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll index f4cebf1fcb5da..dc685d2c4d136 100644 --- a/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll +++ b/llvm/test/Transforms/Inline/ret_attr_align_and_noundef.ll @@ -410,3 +410,14 @@ define i8 @caller15_okay_intersect_ranges() { call void @use.val(i8 %r) ret i8 %r } + +define i8 @caller16_not_intersecting_ranges() { +; CHECK-LABEL: define i8 @caller16_not_intersecting_ranges() { +; CHECK-NEXT: [[R_I:%.*]] = call range(i8 0, 0) i8 @val8() +; CHECK-NEXT: call void @use.val(i8 [[R_I]]) +; CHECK-NEXT: ret i8 [[R_I]] +; + %r = call range(i8 0, 5) i8 @callee15() + call void @use.val(i8 %r) + ret i8 %r +} From 5565f4caa9e81b145e94386697c0fbd3b7f7a9d3 Mon Sep 17 00:00:00 2001 From: Andreas Jonson Date: Wed, 7 Aug 2024 18:11:57 +0200 Subject: [PATCH 2/2] Allow empty range attribute and add assert for full range --- llvm/docs/LangRef.rst | 3 ++- llvm/lib/AsmParser/LLParser.cpp | 4 ++-- llvm/lib/IR/Attributes.cpp | 4 ++++ llvm/test/Assembler/range-attribute-invalid-range.ll | 4 ++-- llvm/test/Bitcode/attributes.ll | 4 ++-- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst index b17e3c828ed3d..584084205268d 100644 --- a/llvm/docs/LangRef.rst +++ b/llvm/docs/LangRef.rst @@ -1675,7 +1675,8 @@ Currently, only the following parameter attributes are defined: - The pair ``a,b`` represents the range ``[a,b)``. - Both ``a`` and ``b`` are constants. - The range is allowed to wrap. - - The range should not represent the full or empty set. That is, ``a!=b``. + - The empty range is represented using ``0,0``. + - Otherwise, ``a`` and ``b`` are not allowed to be equal. This attribute may only be applied to parameters or return values with integer or vector of integer types. diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 9358f89e2bf9d..f41907f035125 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -3109,8 +3109,8 @@ bool LLParser::parseRangeAttr(AttrBuilder &B) { if (ParseAPSInt(BitWidth, Lower) || parseToken(lltok::comma, "expected ','") || ParseAPSInt(BitWidth, Upper)) return true; - if (Lower == Upper) - return tokError("the range should not represent the full or empty set!"); + if (Lower == Upper && !Lower.isZero()) + return tokError("the range represent the empty set but limits aren't 0!"); if (parseToken(lltok::rparen, "expected ')'")) return true; diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp index abd05e316bec1..fa124e46483dc 100644 --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/lib/IR/Attributes.cpp @@ -171,6 +171,7 @@ Attribute Attribute::get(LLVMContext &Context, Attribute::AttrKind Kind, const ConstantRange &CR) { assert(Attribute::isConstantRangeAttrKind(Kind) && "Not a ConstantRange attribute"); + assert(!CR.isFullSet() && "ConstantRange attribute must not be full"); LLVMContextImpl *pImpl = Context.pImpl; FoldingSetNodeID ID; ID.AddInteger(Kind); @@ -2020,6 +2021,9 @@ AttrBuilder &AttrBuilder::addInAllocaAttr(Type *Ty) { AttrBuilder &AttrBuilder::addConstantRangeAttr(Attribute::AttrKind Kind, const ConstantRange &CR) { + if (CR.isFullSet()) + return *this; + return addAttribute(Attribute::get(Ctx, Kind, CR)); } diff --git a/llvm/test/Assembler/range-attribute-invalid-range.ll b/llvm/test/Assembler/range-attribute-invalid-range.ll index cf6d3f0801838..1ddb6745e5dc2 100644 --- a/llvm/test/Assembler/range-attribute-invalid-range.ll +++ b/llvm/test/Assembler/range-attribute-invalid-range.ll @@ -1,6 +1,6 @@ ; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s -; CHECK: the range should not represent the full or empty set! -define void @range_empty(i8 range(i8 0, 0) %a) { +; CHECK: the range represent the empty set but limits aren't 0! +define void @range_empty(i8 range(i8 1, 1) %a) { ret void } diff --git a/llvm/test/Bitcode/attributes.ll b/llvm/test/Bitcode/attributes.ll index f4dc9b9849827..c6d8fe1937644 100644 --- a/llvm/test/Bitcode/attributes.ll +++ b/llvm/test/Bitcode/attributes.ll @@ -531,8 +531,8 @@ define range(i32 -1, 42) i32 @range_attribute(<4 x i32> range(i32 -1, 42) %a) { ret i32 0 } -; CHECK: define range(i32 0, 42) i32 @range_attribute_same_range_other_bitwidth(i8 range(i8 0, 42) %a) -define range(i32 0, 42) i32 @range_attribute_same_range_other_bitwidth(i8 range(i8 0, 42) %a) { +; CHECK: define range(i32 0, 0) i32 @range_attribute_same_range_other_bitwidth(i8 range(i8 0, 42) %a) +define range(i32 0, 0) i32 @range_attribute_same_range_other_bitwidth(i8 range(i8 0, 42) %a) { ret i32 0 }