[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