[llvm] d51b278 - [IR] Intersect call and fn range in CallBase::getRange()
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 22 07:45:44 PDT 2025
Author: Nikita Popov
Date: 2025-04-22T16:45:33+02:00
New Revision: d51b2785abf77978d9218a7b6fb5b8ec6c770c31
URL: https://github.com/llvm/llvm-project/commit/d51b2785abf77978d9218a7b6fb5b8ec6c770c31
DIFF: https://github.com/llvm/llvm-project/commit/d51b2785abf77978d9218a7b6fb5b8ec6c770c31.diff
LOG: [IR] Intersect call and fn range in CallBase::getRange()
To make sure that a larger range on the call-site does not suppress
information from a smaller range at the declaration.
Added:
Modified:
llvm/lib/IR/Instructions.cpp
llvm/test/Transforms/CorrelatedValuePropagation/uscmp.ll
Removed:
################################################################################
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 18109bf107858..3ae88bd54d719 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -376,9 +376,17 @@ FPClassTest CallBase::getParamNoFPClass(unsigned i) const {
}
std::optional<ConstantRange> CallBase::getRange() const {
- const Attribute RangeAttr = getRetAttr(llvm::Attribute::Range);
- if (RangeAttr.isValid())
- return RangeAttr.getRange();
+ Attribute CallAttr = Attrs.getRetAttr(Attribute::Range);
+ Attribute FnAttr;
+ if (const Function *F = getCalledFunction())
+ FnAttr = F->getRetAttribute(Attribute::Range);
+
+ if (CallAttr.isValid() && FnAttr.isValid())
+ return CallAttr.getRange().intersectWith(FnAttr.getRange());
+ if (CallAttr.isValid())
+ return CallAttr.getRange();
+ if (FnAttr.isValid())
+ return FnAttr.getRange();
return std::nullopt;
}
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/uscmp.ll b/llvm/test/Transforms/CorrelatedValuePropagation/uscmp.ll
index c42a685b21c76..881c974c0f0ac 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/uscmp.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/uscmp.ll
@@ -312,11 +312,9 @@ define i8 @ucmp_switch_callsite_range(i32 %x, i32 %y) {
; CHECK-LABEL: @ucmp_switch_callsite_range(
; CHECK-NEXT: [[CMP:%.*]] = call range(i8 -2, 3) i8 @llvm.ucmp.i8.i32(i32 [[X:%.*]], i32 [[Y:%.*]])
; CHECK-NEXT: switch i8 [[CMP]], label [[DEFAULT_UNREACHABLE:%.*]] [
-; CHECK-NEXT: i8 -2, label [[BB_NEG2:%.*]]
+; CHECK-NEXT: i8 1, label [[BB_1:%.*]]
; CHECK-NEXT: i8 -1, label [[BB_NEG1:%.*]]
; CHECK-NEXT: i8 0, label [[BB_0:%.*]]
-; CHECK-NEXT: i8 1, label [[BB_1:%.*]]
-; CHECK-NEXT: i8 2, label [[BB_2:%.*]]
; CHECK-NEXT: ]
; CHECK: bb.neg2:
; CHECK-NEXT: ret i8 -2
More information about the llvm-commits
mailing list