mirror of
https://github.com/github/codeql.git
synced 2026-04-30 03:05:15 +02:00
This predicate looked like a join of two already-computed predicates, but it was a bit more complicated because the `*` operator expands into two cases: the reflexive case and the transitive case. The join order for the transitive case placed the `PrimitiveBasicBlock` charpred call _after_ the `member_step+` call, which means that all the tuples of `member_step+` passed through the pipeline. This commit changes the implementation by fully writing out the expansion of `*` into two cases, where the base case is manually specialised to make sure the join orderer doesn't get tempted into reusing the same strategy for both cases. This speeds up the predicate from 2m38s to 1s on a snapshot of our own C/C++ code.