[llvm] 9250aed - [SCEV] Add range attribute handling (#88449)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 12 02:21:51 PDT 2024
Author: Andreas Jonson
Date: 2024-04-12T18:21:48+09:00
New Revision: 9250aedb5cabf0e44c694f0c8e68ae03e937be89
URL: https://github.com/llvm/llvm-project/commit/9250aedb5cabf0e44c694f0c8e68ae03e937be89
DIFF: https://github.com/llvm/llvm-project/commit/9250aedb5cabf0e44c694f0c8e68ae03e937be89.diff
LOG: [SCEV] Add range attribute handling (#88449)
Added:
llvm/test/Analysis/ScalarEvolution/range-attribute.ll
Modified:
llvm/lib/Analysis/ScalarEvolution.cpp
Removed:
################################################################################
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
new file mode 100644
index 00000000000000..ea22695e58d1da
--- /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 + %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:
+ 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 + %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:
+ %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 + %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:
+ %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
+}
More information about the llvm-commits
mailing list