[llvm-commits] [llvm] r73884 - /llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Dan Gohman gohman at apple.com
Mon Jun 22 08:09:28 PDT 2009


Author: djg
Date: Mon Jun 22 10:09:28 2009
New Revision: 73884

URL: http://llvm.org/viewvc/llvm-project?rev=73884&view=rev
Log:
Make use of getUMinFromMismatchedTypes when computing backedge-taken
counts for loops with multiple exits, replacing more conservative code
which only handled constants. This is derived from a patch by
Nick Lewycky.

This also fixes llc aborts in ClamAV and others, as
getUMinFromMismatchedTypes takes care of balancing the types before
working with them.

Modified:
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=73884&r1=73883&r2=73884&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Mon Jun 22 10:09:28 2009
@@ -2958,18 +2958,18 @@
       if (L->contains(TBB)) {
         // Both conditions must be true for the loop to continue executing.
         // Choose the less conservative count.
-        // TODO: Take the minimum of the exact counts.
-        if (BTI0.Exact == BTI1.Exact)
+        if (BTI0.Exact == CouldNotCompute)
+          BECount = BTI1.Exact;
+        else if (BTI1.Exact == CouldNotCompute)
           BECount = BTI0.Exact;
-        // TODO: Take the minimum of the maximum counts.
+        else
+          BECount = getUMinFromMismatchedTypes(BTI0.Exact, BTI1.Exact);
         if (BTI0.Max == CouldNotCompute)
           MaxBECount = BTI1.Max;
         else if (BTI1.Max == CouldNotCompute)
           MaxBECount = BTI0.Max;
-        else if (const SCEVConstant *C0 = dyn_cast<SCEVConstant>(BTI0.Max))
-          if (const SCEVConstant *C1 = dyn_cast<SCEVConstant>(BTI1.Max))
-              MaxBECount = getConstant(APIntOps::umin(C0->getValue()->getValue(),
-                                                      C1->getValue()->getValue()));
+        else
+          MaxBECount = getUMinFromMismatchedTypes(BTI0.Max, BTI1.Max);
       } else {
         // Both conditions must be true for the loop to exit.
         assert(L->contains(FBB) && "Loop block has no successor in loop!");
@@ -2992,18 +2992,18 @@
       if (L->contains(FBB)) {
         // Both conditions must be false for the loop to continue executing.
         // Choose the less conservative count.
-        // TODO: Take the minimum of the exact counts.
-        if (BTI0.Exact == BTI1.Exact)
+        if (BTI0.Exact == CouldNotCompute)
+          BECount = BTI1.Exact;
+        else if (BTI1.Exact == CouldNotCompute)
           BECount = BTI0.Exact;
-        // TODO: Take the minimum of the maximum counts.
+        else
+          BECount = getUMinFromMismatchedTypes(BTI0.Exact, BTI1.Exact);
         if (BTI0.Max == CouldNotCompute)
           MaxBECount = BTI1.Max;
         else if (BTI1.Max == CouldNotCompute)
           MaxBECount = BTI0.Max;
-        else if (const SCEVConstant *C0 = dyn_cast<SCEVConstant>(BTI0.Max))
-          if (const SCEVConstant *C1 = dyn_cast<SCEVConstant>(BTI1.Max))
-              MaxBECount = getConstant(APIntOps::umin(C0->getValue()->getValue(),
-                                                      C1->getValue()->getValue()));
+        else
+          MaxBECount = getUMinFromMismatchedTypes(BTI0.Max, BTI1.Max);
       } else {
         // Both conditions must be false for the loop to exit.
         assert(L->contains(TBB) && "Loop block has no successor in loop!");





More information about the llvm-commits mailing list