[PATCH] fix to compile-time blowup in LoopStrengthReduce

Daniel Reynaud dreynaud at apple.com
Fri Oct 24 15:04:46 PDT 2014


This is a simple fix that brings the compilation time from 5min to 5s on a specific example I've encountered.

It's tricky to come up with a test case, and it would just take a long time to build anyway (before the fix).

Thanks,
-- daniel



diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index fbc8e0e..e1d18e8 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -3117,10 +3117,15 @@ void
 LSRInstance::CollectLoopInvariantFixupsAndFormulae() {
   SmallVector<const SCEV *, 8> Worklist(RegUses.begin(), RegUses.end());
   SmallPtrSet<const SCEV *, 8> Inserted;
+  SmallPtrSet<const SCEV *, 32> Done;
 
   while (!Worklist.empty()) {
     const SCEV *S = Worklist.pop_back_val();
 
+    // Don't process the same SCEV twice
+    if (!Done.insert(S))
+      continue;
+
     if (const SCEVNAryExpr *N = dyn_cast<SCEVNAryExpr>(S))
       Worklist.append(N->op_begin(), N->op_end());
     else if (const SCEVCastExpr *C = dyn_cast<SCEVCastExpr>(S))





More information about the llvm-commits mailing list