From: David Majnemer Date: Thu, 4 Sep 2014 00:23:13 +0000 (+0000) Subject: IndVarSimplify: Address review comments for r217102 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=e35ac41a3a965d18e0ada76cafa54b5b0814982a;hp=b79ed97962dfdc2fbbf7ceea2b5cd52a7ad27012 IndVarSimplify: Address review comments for r217102 No functional change intended, just some cleanups and comments added. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217115 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp index a5f0dae87ea..27e5ec8cf40 100644 --- a/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -1644,16 +1644,19 @@ LinearFunctionTestReplace(Loop *L, // The BackedgeTaken expression contains the number of times that the // backedge branches to the loop header. This is one less than the // number of times the loop executes, so use the incremented indvar. - llvm::Value *IncrementedIndvar = IndVar->getIncomingValueForBlock(L->getExitingBlock()); + llvm::Value *IncrementedIndvar = + IndVar->getIncomingValueForBlock(L->getExitingBlock()); const auto *IncrementedIndvarSCEV = cast(SE->getSCEV(IncrementedIndvar)); // It is unsafe to use the incremented indvar if it has a wrapping flag, we // don't want to compare against a poison value. Check the SCEV that // corresponds to the incremented indvar, the SCEVExpander will only insert // flags in the IR if the SCEV originally had wrapping flags. - if (ScalarEvolution::maskFlags(IncrementedIndvarSCEV->getNoWrapFlags(), - SCEV::FlagNUW | SCEV::FlagNSW) == - SCEV::FlagAnyWrap) { + // FIXME: In theory, SCEV could drop flags even though they exist in IR. + // A more robust solution would involve getting a new expression for + // CmpIndVar by applying non-NSW/NUW AddExprs. + if (!ScalarEvolution::maskFlags(IncrementedIndvarSCEV->getNoWrapFlags(), + SCEV::FlagNUW | SCEV::FlagNSW)) { // Add one to the "backedge-taken" count to get the trip count. // This addition may overflow, which is valid as long as the comparison is // truncated to BackedgeTakenCount->getType().