[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