martong added a comment.

Thanks Balazs for the report.

Here is my analysis. Looks like during the recursive simplification, `reAssume` 
 produces `State`s that had been created by a previous `reAssume`. Before this 
change, to stop the recursion it was enough to to check if the `OldState` 
equals to the actual `State` in `reAssume`. Now, with this change, each 
`assume` call evaluates both the true and the false branches, thus it is not 
necessary that the subsequent `reAssume` could detect an already "visited" 
State.
So, the obvious solution would be to have a `State` cache in the `reAssume` 
machinery, though, implementation details are not clear yet.

There is another really important thing. We should not continue with `reAssume` 
if the `State` is `posteriorlyOverConstrained`.

   LLVM_NODISCARD ProgramStateRef reAssume(ProgramStateRef State,
                                           const RangeSet *Constraint,
                                           SVal TheValue) {
  +  if (State->isPosteriorlyOverconstrained())
  +    return nullptr;
     if (!Constraint)
       return State;

This change in itself reduced the run-time of the analysis to 16 seconds, on my 
machine. However, the repetition of States should still be addressed. I am 
going to upload the upper patch for a starter.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D124758/new/

https://reviews.llvm.org/D124758

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to