NoQ added a comment.
Regarding the cache stack - it feels easier for me to allocate a separate stack
for each statement, and put the stack on stack (!) rather than having it
global. This way it'd be automatically cleaned for you when VisitStmt() exits,
and you'd be able to address child cache by index rather then through scanning.
================
Comment at: lib/Analysis/CloneDetection.cpp:142
@@ +141,3 @@
+/// Afterwards, the hash values of the children are calculated into the
+/// computed hash value.
+class HashVisitor : public RecursiveASTVisitor<HashVisitor> {
----------------
> This calculation happens in linear time and each statement is only visited a
> fixed amount of times during this process.
Isn't `SaveAllSubSequences()` quadratic?
================
Comment at: lib/Analysis/CloneDetection.cpp:424
@@ +423,3 @@
+ // remove any duplicates.
+ std::sort(IndexesToRemove.begin(), IndexesToRemove.end(),
+ std::greater<unsigned>());
----------------
I suspect that all //i//'s that make it into the `IndexesToRemove` vector are
already unique and increasing, by construction. We take some //i//, see if we
need to remove it, then push it at most once and take (//i// + 1).
https://reviews.llvm.org/D20795
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits