It is not necessary to store all pairwise dependencies when it is sufficient to know which kind of dependencies occured.
This might have some behavioral effects such as when two dependencies can be interchange on their own but combined into a single loop nest they can not. Example:
Dependence 1: [<,=,>] (carried by outer loop)
Dependence 2: [=,<,>] (carried by inner loop)
when combined:
[<=,<=,>]
which would not be considered interchangeable.
In any case, all of our current tests pass after this change and is significantly more efficient (still quadratic in the number of memory instructions, because we have to query DA for each pair)
why does this need to be reduced so much?