IndVarSimplify: Address review comments for r217102
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 4 Sep 2014 00:23:13 +0000 (00:23 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 4 Sep 2014 00:23:13 +0000 (00:23 +0000)
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

lib/Transforms/Scalar/IndVarSimplify.cpp

index a5f0dae87eab6d565c51778d1656775abd0accca..27e5ec8cf40955fd9d7ffffd74f50018ed38e5e5 100644 (file)
@@ -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.
     // 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<SCEVAddRecExpr>(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.
     const auto *IncrementedIndvarSCEV =
         cast<SCEVAddRecExpr>(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().
       // 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().