OSDN Git Service

SCEVTraversal: Add a visited set.
authorAndrew Trick <atrick@apple.com>
Wed, 18 Jul 2012 05:14:03 +0000 (05:14 +0000)
committerAndrew Trick <atrick@apple.com>
Wed, 18 Jul 2012 05:14:03 +0000 (05:14 +0000)
Expression trees may be DAGs. Make sure traversal has linear complexity.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160426 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/ScalarEvolutionExpressions.h

index cf15f73..ded1297 100644 (file)
@@ -15,6 +15,7 @@
 #define LLVM_ANALYSIS_SCALAREVOLUTION_EXPRESSIONS_H
 
 #include "llvm/Analysis/ScalarEvolution.h"
+#include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/Support/ErrorHandling.h"
 
 namespace llvm {
@@ -505,9 +506,10 @@ namespace llvm {
   class SCEVTraversal {
     SV &Visitor;
     SmallVector<const SCEV *, 8> Worklist;
+    SmallPtrSet<const SCEV *, 8> Visited;
 
     void push(const SCEV *S) {
-      if (Visitor.follow(S))
+      if (Visited.insert(S) && Visitor.follow(S))
         Worklist.push_back(S);
     }
   public: