When pruning candidate formulae out of an LSRUse, update the
LSRUse's Regs set after all pruning is done, rather than trying
to do it on the fly, which can produce an incomplete result.

This fixes a case where heuristic pruning was stripping all
formulae from a use, which led the solver to enter an infinite
loop.

Also, add a few asserts to diagnose this kind of situation.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103328 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index cf3d16f..61966f5 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -2592,9 +2592,6 @@
     LSRUse &LU = Uses[LUIdx];
     FormulaSorter Sorter(L, LU, SE, DT);
 
-    // Clear out the set of used regs; it will be recomputed.
-    LU.Regs.clear();
-
     for (size_t FIdx = 0, NumForms = LU.Formulae.size();
          FIdx != NumForms; ++FIdx) {
       Formula &F = LU.Formulae[FIdx];
@@ -2632,9 +2629,18 @@
         --NumForms;
         continue;
       }
+    }
+
+    // Now that we've filtered out some formulae, recompute the Regs set.
+    LU.Regs.clear();
+    for (size_t FIdx = 0, NumForms = LU.Formulae.size();
+         FIdx != NumForms; ++FIdx) {
+      Formula &F = LU.Formulae[FIdx];
       if (F.ScaledReg) LU.Regs.insert(F.ScaledReg);
       LU.Regs.insert(F.BaseRegs.begin(), F.BaseRegs.end());
     }
+
+    // Reset this to prepare for the next use.
     BestFormulae.clear();
   }
 
@@ -2718,6 +2724,7 @@
           LU.Formulae.pop_back();
           --e;
           --i;
+          assert(e != 0 && "Use has no formulae left! Is Regs inconsistent?");
           continue;
         }
 
@@ -2810,6 +2817,7 @@
   // If none of the formulae had all of the required registers, relax the
   // constraint so that we don't exclude all formulae.
   if (!AnySatisfiedReqRegs) {
+    assert(!ReqRegs.empty() && "Solver failed even without required registers");
     ReqRegs.clear();
     goto retry;
   }