[llvm] 88f9b52 - [Attributor][FIX] Allow negative offsets for ranges
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 14 10:13:35 PST 2022
Author: Johannes Doerfert
Date: 2022-12-14T10:13:01-08:00
New Revision: 88f9b525085b4292080aec6aba835801ca5793b6
URL: https://github.com/llvm/llvm-project/commit/88f9b525085b4292080aec6aba835801ca5793b6
DIFF: https://github.com/llvm/llvm-project/commit/88f9b525085b4292080aec6aba835801ca5793b6.diff
LOG: [Attributor][FIX] Allow negative offsets for ranges
In https://reviews.llvm.org/D136745 we introduced the "pre-condition"
that offsets should not be -1 or -2. This can easily break. The new
special values are INT32_MAX and INT32_MIN, which we might want to
replace with std::optional or flags instead.
Added:
llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll
Modified:
llvm/include/llvm/Transforms/IPO/Attributor.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index 3b56653985aa5..9f012208ccd33 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 <limits>
#include <map>
#include <optional>
@@ -275,11 +276,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<int32_t>::min();
+ static constexpr int64_t Unknown = std::numeric_limits<int32_t>::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 0000000000000..c7c5e7d8eb2ff
--- /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: {{.*}}
More information about the llvm-commits
mailing list