SimpLL: Equivalence slicer
This pull request contains an implementation of the static backward slicer. It is able to remove semantically equal instructions of compared functions that are not equal. The program slices of compared functions consist of different instructions and also recursively added operand of these differences.
PR also contains an implementation of new option --equivalence-slicer and 25 regression tests.
The ControlFlowSlicer class contains a lot of duplicate code from VarDependencySlicer, some of which is not even used (like checkDependency). The code that is used by both VarDependencySlicer and EquivalenceSlicer should be separated into a single class and used by both (e.g. by modifying VarDependencySlicer to use ControlFlowSlicer), not just duplicated.
I agree with this, move all the common code into ControlFlowSlicer (or whatever new name we use) and then make the two other slicers extend that class.
As of the slicing itself - did you consider implementing the synchronization part in DifferentialFunctionComparator (extending the comparison already implemented there), leaving only the slicing in EquivalenceSlicer? (Also see my comments in EquivalenceSlicer.cpp about the comparison.)
I'd rather have this separated. DifferentialFunctionComparator is already large enough, there's no need to extend it with new functionality.
I updated the PR according to your reviews. I am aware of failures in tests, and also of missing comments in the code. I will work on it, but during that, feel free to make another round of reviews.