[llvm] [SCEV] Add range attribute handling. (PR #88449)

Andreas Jonson via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 11 15:06:46 PDT 2024


https://github.com/andjo403 created https://github.com/llvm/llvm-project/pull/88449

None

>From d742c5c8938910afdaa0d2b9db7b8c8d13e99c79 Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Fri, 12 Apr 2024 00:00:40 +0200
Subject: [PATCH 1/2] [SCEV]  Add test for range attribute handling. NFC.

---
 .../ScalarEvolution/range-attribute.ll        | 74 +++++++++++++++++++
 1 file changed, 74 insertions(+)
 create mode 100644 llvm/test/Analysis/ScalarEvolution/range-attribute.ll

diff --git a/llvm/test/Analysis/ScalarEvolution/range-attribute.ll b/llvm/test/Analysis/ScalarEvolution/range-attribute.ll
new file mode 100644
index 00000000000000..ef2173067afea8
--- /dev/null
+++ b/llvm/test/Analysis/ScalarEvolution/range-attribute.ll
@@ -0,0 +1,74 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
+; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s
+
+define i32 @slt_trip_count_with_range_attr(i32 range(i32 1, 100) %limit) {
+;
+; CHECK-LABEL: 'slt_trip_count_with_range_attr'
+; CHECK-NEXT:  Determining loop execution counts for: @slt_trip_count_with_range_attr
+; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 126
+; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: Trip multiple is 1
+;
+ entry:
+  br label %loop
+
+ loop:
+  %index = phi i32 [ 0, %entry ], [ %index.inc, %loop ]
+  %index.inc = add i32 %index, 1
+  %continue = icmp slt i32 %index.inc, %limit
+  br i1 %continue, label %loop, label %loop.exit
+
+ loop.exit:
+  ret i32 0
+}
+
+declare i32 @get_i32()
+
+define i32 @slt_trip_count_with_range_call() {
+;
+; CHECK-LABEL: 'slt_trip_count_with_range_call'
+; CHECK-NEXT:  Determining loop execution counts for: @slt_trip_count_with_range_call
+; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 126
+; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: Trip multiple is 1
+;
+ entry:
+  %limit = call range(i32 1, 100) i32 @get_i32()
+  br label %loop
+
+ loop:
+  %index = phi i32 [ 0, %entry ], [ %index.inc, %loop ]
+  %index.inc = add i32 %index, 1
+  %continue = icmp slt i32 %index.inc, %limit
+  br i1 %continue, label %loop, label %loop.exit
+
+ loop.exit:
+  ret i32 0
+}
+
+declare range(i32 1, 100) i32 @get_i32_in_range()
+
+define i32 @slt_trip_count_with_range_result() {
+;
+; CHECK-LABEL: 'slt_trip_count_with_range_result'
+; CHECK-NEXT:  Determining loop execution counts for: @slt_trip_count_with_range_result
+; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 126
+; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: Trip multiple is 1
+;
+ entry:
+  %limit = call i32 @get_i32_in_range()
+  br label %loop
+
+ loop:
+  %index = phi i32 [ 0, %entry ], [ %index.inc, %loop ]
+  %index.inc = add i32 %index, 1
+  %continue = icmp slt i32 %index.inc, %limit
+  br i1 %continue, label %loop, label %loop.exit
+
+ loop.exit:
+  ret i32 0
+}

>From cf7d2981c7686b7806f7802547d58cace45fbb66 Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Fri, 12 Apr 2024 00:02:09 +0200
Subject: [PATCH 2/2] [SCEV] Add range attribute handling.

---
 llvm/lib/Analysis/ScalarEvolution.cpp          |  9 ++++++++-
 .../ScalarEvolution/range-attribute.ll         | 18 +++++++++---------
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 9fcce797f55976..95440dda3b4c0e 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -6382,9 +6382,16 @@ uint32_t ScalarEvolution::getMinTrailingZeros(const SCEV *S) {
 
 /// Helper method to assign a range to V from metadata present in the IR.
 static std::optional<ConstantRange> GetRangeFromMetadata(Value *V) {
-  if (Instruction *I = dyn_cast<Instruction>(V))
+  if (Instruction *I = dyn_cast<Instruction>(V)) {
     if (MDNode *MD = I->getMetadata(LLVMContext::MD_range))
       return getConstantRangeFromMetadata(*MD);
+    if (const auto *CB = dyn_cast<CallBase>(V))
+      if (std::optional<ConstantRange> Range = CB->getRange())
+        return Range;
+  }
+  if (auto *A = dyn_cast<Argument>(V))
+    if (std::optional<ConstantRange> Range = A->getRange())
+      return Range;
 
   return std::nullopt;
 }
diff --git a/llvm/test/Analysis/ScalarEvolution/range-attribute.ll b/llvm/test/Analysis/ScalarEvolution/range-attribute.ll
index ef2173067afea8..ea22695e58d1da 100644
--- a/llvm/test/Analysis/ScalarEvolution/range-attribute.ll
+++ b/llvm/test/Analysis/ScalarEvolution/range-attribute.ll
@@ -5,9 +5,9 @@ define i32 @slt_trip_count_with_range_attr(i32 range(i32 1, 100) %limit) {
 ;
 ; CHECK-LABEL: 'slt_trip_count_with_range_attr'
 ; CHECK-NEXT:  Determining loop execution counts for: @slt_trip_count_with_range_attr
-; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (1 smax %limit))<nsw>
-; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 126
-; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %limit)<nsw>
+; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 98
+; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %limit)<nsw>
 ; CHECK-NEXT:  Loop %loop: Trip multiple is 1
 ;
  entry:
@@ -29,9 +29,9 @@ define i32 @slt_trip_count_with_range_call() {
 ;
 ; CHECK-LABEL: 'slt_trip_count_with_range_call'
 ; CHECK-NEXT:  Determining loop execution counts for: @slt_trip_count_with_range_call
-; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (1 smax %limit))<nsw>
-; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 126
-; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %limit)<nsw>
+; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 98
+; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %limit)<nsw>
 ; CHECK-NEXT:  Loop %loop: Trip multiple is 1
 ;
  entry:
@@ -54,9 +54,9 @@ define i32 @slt_trip_count_with_range_result() {
 ;
 ; CHECK-LABEL: 'slt_trip_count_with_range_result'
 ; CHECK-NEXT:  Determining loop execution counts for: @slt_trip_count_with_range_result
-; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + (1 smax %limit))<nsw>
-; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 126
-; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + (1 smax %limit))<nsw>
+; CHECK-NEXT:  Loop %loop: backedge-taken count is (-1 + %limit)<nsw>
+; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 98
+; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (-1 + %limit)<nsw>
 ; CHECK-NEXT:  Loop %loop: Trip multiple is 1
 ;
  entry:



More information about the llvm-commits mailing list