From bed02fa8b0ec61b442990fb2406f0157fd3f8c13 Mon Sep 17 00:00:00 2001 From: Max Kazantsev Date: Wed, 21 Oct 2020 13:03:46 +0700 Subject: [PATCH] Revert "[SCEV] Prove implications of different type via truncation" This reverts commit 80852a4f2fb154c6094bb9d9e3457757d5a60ad1. Test is now broken because underlying required patch was also reverted SUDDENLY. --- llvm/lib/Analysis/ScalarEvolution.cpp | 19 --------- llvm/test/Analysis/ScalarEvolution/srem.ll | 2 +- .../Analysis/ScalarEvolutionTest.cpp | 41 ------------------- 3 files changed, 1 insertion(+), 61 deletions(-) diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 6e351a53628f..efc4600e248f 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -9699,25 +9699,6 @@ bool ScalarEvolution::isImpliedCond(ICmpInst::Predicate Pred, const SCEV *LHS, // Balance the types. if (getTypeSizeInBits(LHS->getType()) < getTypeSizeInBits(FoundLHS->getType())) { - // For unsigned and equality predicates, try to prove that both found - // operands fit into narrow unsigned range. If so, try to prove facts in - // narrow types. - if (!CmpInst::isSigned(FoundPred)) { - auto *NarrowType = LHS->getType(); - auto *WideType = FoundLHS->getType(); - auto BitWidth = getTypeSizeInBits(NarrowType); - const SCEV *MaxValue = getZeroExtendExpr( - getConstant(APInt::getMaxValue(BitWidth)), WideType); - if (isKnownPredicate(ICmpInst::ICMP_ULE, FoundLHS, MaxValue) && - isKnownPredicate(ICmpInst::ICMP_ULE, FoundRHS, MaxValue)) { - const SCEV *TruncFoundLHS = getTruncateExpr(FoundLHS, NarrowType); - const SCEV *TruncFoundRHS = getTruncateExpr(FoundRHS, NarrowType); - if (isImpliedCondBalancedTypes(Pred, LHS, RHS, FoundPred, TruncFoundLHS, - TruncFoundRHS, Context)) - return true; - } - } - if (CmpInst::isSigned(Pred)) { LHS = getSignExtendExpr(LHS, FoundLHS->getType()); RHS = getSignExtendExpr(RHS, FoundLHS->getType()); diff --git a/llvm/test/Analysis/ScalarEvolution/srem.ll b/llvm/test/Analysis/ScalarEvolution/srem.ll index 76e0d4a5ec5b..197437b51ca1 100644 --- a/llvm/test/Analysis/ScalarEvolution/srem.ll +++ b/llvm/test/Analysis/ScalarEvolution/srem.ll @@ -29,7 +29,7 @@ define dso_local void @_Z4loopi(i32 %width) local_unnamed_addr #0 { ; CHECK-NEXT: %add = add nsw i32 %2, %call ; CHECK-NEXT: --> (%2 + %call) U: full-set S: full-set Exits: <> LoopDispositions: { %for.cond: Variant } ; CHECK-NEXT: %inc = add nsw i32 %i.0, 1 -; CHECK-NEXT: --> {1,+,1}<%for.cond> U: full-set S: full-set Exits: (1 + %width) LoopDispositions: { %for.cond: Computable } +; CHECK-NEXT: --> {1,+,1}<%for.cond> U: [1,0) S: [1,0) Exits: (1 + %width) LoopDispositions: { %for.cond: Computable } ; CHECK-NEXT: Determining loop execution counts for: @_Z4loopi ; CHECK-NEXT: Loop %for.cond: backedge-taken count is %width ; CHECK-NEXT: Loop %for.cond: max backedge-taken count is -1 diff --git a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp index ee70fe5e7ce5..be8941838f71 100644 --- a/llvm/unittests/Analysis/ScalarEvolutionTest.cpp +++ b/llvm/unittests/Analysis/ScalarEvolutionTest.cpp @@ -1316,45 +1316,4 @@ TEST_F(ScalarEvolutionsTest, UnsignedIsImpliedViaOperations) { }); } -TEST_F(ScalarEvolutionsTest, ProveImplicationViaNarrowing) { - LLVMContext C; - SMDiagnostic Err; - std::unique_ptr M = parseAssemblyString( - "define i32 @foo(i32 %start, i32* %q) { " - "entry: " - " %wide.start = zext i32 %start to i64 " - " br label %loop " - "loop: " - " %wide.iv = phi i64 [%wide.start, %entry], [%wide.iv.next, %backedge] " - " %iv = phi i32 [%start, %entry], [%iv.next, %backedge] " - " %cond = icmp eq i64 %wide.iv, 0 " - " br i1 %cond, label %exit, label %backedge " - "backedge: " - " %iv.next = add i32 %iv, -1 " - " %index = zext i32 %iv.next to i64 " - " %load.addr = getelementptr i32, i32* %q, i64 %index " - " %stop = load i32, i32* %load.addr " - " %loop.cond = icmp eq i32 %stop, 0 " - " %wide.iv.next = add nsw i64 %wide.iv, -1 " - " br i1 %loop.cond, label %loop, label %failure " - "exit: " - " ret i32 0 " - "failure: " - " unreachable " - "} ", - Err, C); - - ASSERT_TRUE(M && "Could not parse module?"); - ASSERT_TRUE(!verifyModule(*M) && "Must have been well formed!"); - - runWithSE(*M, "foo", [](Function &F, LoopInfo &LI, ScalarEvolution &SE) { - auto *IV = SE.getSCEV(getInstructionByName(F, "iv")); - auto *Zero = SE.getZero(IV->getType()); - auto *Backedge = getInstructionByName(F, "iv.next")->getParent(); - ASSERT_TRUE(Backedge); - EXPECT_TRUE(SE.isBasicBlockEntryGuardedByCond(Backedge, ICmpInst::ICMP_UGT, - IV, Zero)); - }); -} - } // end namespace llvm