From 5d03e9f58045606a6494641dc72bc921aabcc187 Mon Sep 17 00:00:00 2001 From: Max Kazantsev Date: Mon, 30 Oct 2017 09:35:16 +0000 Subject: [PATCH] [IRCE][NFC] Store Length as SCEV in RangeCheck instead of Value git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316889 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Scalar/InductiveRangeCheckElimination.cpp | 12 ++++++------ test/Transforms/IRCE/only-upper-check.ll | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp b/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp index 42c74c3a3cc..d9c1b2ba57b 100644 --- a/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp +++ b/lib/Transforms/Scalar/InductiveRangeCheckElimination.cpp @@ -151,7 +151,7 @@ class InductiveRangeCheck { const SCEV *Offset = nullptr; const SCEV *Scale = nullptr; - Value *Length = nullptr; + const SCEV *Length = nullptr; Use *CheckUse = nullptr; RangeCheckKind Kind = RANGE_CHECK_UNKNOWN; bool IsSigned = true; @@ -168,7 +168,7 @@ class InductiveRangeCheck { public: const SCEV *getOffset() const { return Offset; } const SCEV *getScale() const { return Scale; } - Value *getLength() const { return Length; } + const SCEV *getLength() const { return Length; } bool isSigned() const { return IsSigned; } void print(raw_ostream &OS) const { @@ -419,7 +419,7 @@ void InductiveRangeCheck::extractRangeChecksFromCond( return; InductiveRangeCheck IRC; - IRC.Length = Length; + IRC.Length = Length ? SE.getSCEV(Length) : nullptr; IRC.Offset = IndexAddRec->getStart(); IRC.Scale = IndexAddRec->getStepRecurrence(SE); IRC.CheckUse = &ConditionUse; @@ -1660,9 +1660,9 @@ InductiveRangeCheck::computeSafeIterationSpace( // We strengthen "0 <= I" to "0 <= I < INT_SMAX" and "I < L" to "0 <= I < L". // We can potentially do much better here. - if (Value *V = getLength()) { - UpperLimit = SE.getSCEV(V); - } else { + if (const SCEV *L = getLength()) + UpperLimit = L; + else { assert(Kind == InductiveRangeCheck::RANGE_CHECK_LOWER && "invariant!"); unsigned BitWidth = cast(IndVar->getType())->getBitWidth(); UpperLimit = SE.getConstant(APInt::getSignedMaxValue(BitWidth)); diff --git a/test/Transforms/IRCE/only-upper-check.ll b/test/Transforms/IRCE/only-upper-check.ll index 24aaef00101..0f15339e9b1 100644 --- a/test/Transforms/IRCE/only-upper-check.ll +++ b/test/Transforms/IRCE/only-upper-check.ll @@ -3,7 +3,7 @@ ; CHECK: irce: loop has 1 inductive range checks: ; CHECK-NEXT:InductiveRangeCheck: ; CHECK-NEXT: Kind: RANGE_CHECK_UPPER -; CHECK-NEXT: Offset: %offset Scale: 1 Length: %len = load i32, i32* %a_len_ptr, !range !0 +; CHECK-NEXT: Offset: %offset Scale: 1 Length: %len ; CHECK-NEXT: CheckUse: br i1 %abc, label %in.bounds, label %out.of.bounds, !prof !1 Operand: 0 ; CHECK-NEXT: irce: in function incrementing: constrained Loop at depth 1 containing: %loop
,%in.bounds -- 2.40.0