Data flow: Fix bad join order in getReturnPosition()

Joining on the enclosing callable before the kind is crucial, as witnessed by this pipeline:

```
[2020-02-06 17:58:21] (1086s) Starting to evaluate predicate DataFlowImplCommon::getReturnPosition#ff/2@83c546
[2020-02-06 18:53:16] (4382s) Tuple counts for DataFlowImplCommon::getReturnPosition#ff:
                      385478      ~1%     {3} r1 = SCAN DataFlowImplCommon::Cached::TReturnPosition0#fff@staged_ext AS I OUTPUT I.<2>, I.<0>, I.<1>
                      385478      ~2%     {3} r2 = JOIN r1 WITH DataFlowImplCommon::Cached::TReturnPosition0#fff_2#join_rhs AS R ON FIRST 1 OUTPUT r1.<2>, r1.<1>, r1.<0>
                      58638116860 ~0%     {3} r3 = JOIN r2 WITH DataFlowImplCommon::ReturnNodeExt::getKind_dispred#ff_10#join_rhs AS R ON FIRST 1 OUTPUT R.<1>, r2.<1>, r2.<2>
                      914049      ~0%     {2} r4 = JOIN r3 WITH DataFlowImplCommon::returnNodeGetEnclosingCallable#ff AS R ON FIRST 2 OUTPUT r3.<0>, r3.<2>
                                          return r4
```
This commit is contained in:
Tom Hvitved
2020-02-06 19:06:40 +01:00
parent 6e14ba4e56
commit b3af3ad12f
4 changed files with 28 additions and 4 deletions

View File

@@ -753,9 +753,15 @@ private DataFlowCallable returnNodeGetEnclosingCallable(ReturnNodeExt ret) {
result = ret.getEnclosingCallable()
}
pragma[noinline]
private ReturnPosition getReturnPosition0(ReturnNodeExt ret, ReturnKindExt kind) {
result.getCallable() = returnNodeGetEnclosingCallable(ret) and
kind = result.getKind()
}
pragma[noinline]
ReturnPosition getReturnPosition(ReturnNodeExt ret) {
result = TReturnPosition0(returnNodeGetEnclosingCallable(ret), ret.getKind())
result = getReturnPosition0(ret, ret.getKind())
}
bindingset[cc, callable]

View File

@@ -753,9 +753,15 @@ private DataFlowCallable returnNodeGetEnclosingCallable(ReturnNodeExt ret) {
result = ret.getEnclosingCallable()
}
pragma[noinline]
private ReturnPosition getReturnPosition0(ReturnNodeExt ret, ReturnKindExt kind) {
result.getCallable() = returnNodeGetEnclosingCallable(ret) and
kind = result.getKind()
}
pragma[noinline]
ReturnPosition getReturnPosition(ReturnNodeExt ret) {
result = TReturnPosition0(returnNodeGetEnclosingCallable(ret), ret.getKind())
result = getReturnPosition0(ret, ret.getKind())
}
bindingset[cc, callable]