From ee1d000d43321590771a2f047c8c55d07d09ad28 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Sat, 17 Dec 2022 13:15:43 -0800 Subject: [PATCH] Reapply "[Attributor][FIX] Allow negative offsets for ranges" This reverts commit d57a3443f3e2b423fd7f5402f017dc7c0dff8cdf. This patch was never part of the memory leak problem that lead to the revert, just an innocent bystander caught in the middle... Also, added a second reproducer reported after the revert. --- llvm/include/llvm/Transforms/IPO/Attributor.h | 9 +++++--- .../reduced/assertion_unassigned_range.ll | 25 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h index 52cfb40..59a0d2a 100644 --- a/llvm/include/llvm/Transforms/IPO/Attributor.h +++ b/llvm/include/llvm/Transforms/IPO/Attributor.h @@ -128,6 +128,7 @@ #include "llvm/Support/TimeProfiler.h" #include "llvm/Transforms/Utils/CallGraphUpdater.h" +#include #include #include @@ -274,11 +275,13 @@ struct RangeTy { } /// Constants used to represent special offsets or sizes. - /// - This assumes that Offset and Size are non-negative. + /// - We cannot assume that Offsets and Size are non-negative. /// - The constants should not clash with DenseMapInfo, such as EmptyKey /// (INT64_MAX) and TombstoneKey (INT64_MIN). - static constexpr int64_t Unassigned = -1; - static constexpr int64_t Unknown = -2; + /// We use values "in the middle" of the 64 bit range to represent these + /// special cases. + static constexpr int64_t Unassigned = std::numeric_limits::min(); + static constexpr int64_t Unknown = std::numeric_limits::max(); }; inline raw_ostream &operator<<(raw_ostream &OS, const RangeTy &R) { diff --git a/llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll b/llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll new file mode 100644 index 0000000..c7c5e7d --- /dev/null +++ b/llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll @@ -0,0 +1,25 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes --check-attributes --check-globals +; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT +; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC + +define i1 @_ZNK6openmc4Cell16contains_complexENS_8PositionES1_i() { +; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK-LABEL: define {{[^@]+}}@_ZNK6openmc4Cell16contains_complexENS_8PositionES1_i +; CHECK-SAME: () #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[TOBOOL71:%.*]] = trunc i8 undef to i1 +; CHECK-NEXT: ret i1 false +; +entry: + %stack = alloca [24 x i8], i32 0, align 1 + %arrayidx70 = getelementptr [24 x i8], ptr %stack, i64 0, i64 -1 + %0 = load i8, ptr %arrayidx70, align 1 + %tobool71 = trunc i8 %0 to i1 + ret i1 false +} +;. +; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +;. +;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: +; CGSCC: {{.*}} +; TUNIT: {{.*}} -- 2.7.4