Rust: Fix bad join in unqualifiedPathLookup

Before
```
Pipeline standard for PathResolution::unqualifiedPathLookup/2#6b171b76#reorder_2_0_1@822d53wq was evaluated in 61 iterations totaling 118ms (delta sizes total: 131072).
          606491   ~0%    {4} r1 = SCAN `PathResolution::getASuccessor/3#febac7bd#prev_delta` OUTPUT In.1, In.2, In.0, In.3
          106457   ~1%    {3}    | JOIN WITH `PathResolution::unqualifiedPathLookup/4#e32cdfce_1230#join_rhs` ON FIRST 3 OUTPUT Lhs.3, Rhs.3, Lhs.1

          606491   ~2%    {4} r2 = SCAN `PathResolution::getASuccessor/3#febac7bd#prev_delta` OUTPUT In.0, In.2, In.3, In.1

           19261   ~0%    {4} r3 = JOIN r2 WITH `PathResolution::ModuleLikeNode.isRoot/0#dispred#21662e64` ON FIRST 1 OUTPUT Lhs.3, Lhs.0, Lhs.1, Lhs.2

        42776643   ~1%    {4} r4 = JOIN r2 WITH `doublyBoundedFastTC@PathResolution::hasChild/2#6b318d51#2@PathResolution::isRoot/1#a01ce5c3#1@PathResolution::hasCratePath/1#73ea688d#1` ON FIRST 1 OUTPUT Lhs.3, Rhs.1, Lhs.1, Lhs.2

        42795904   ~1%    {4} r5 = r3 UNION r4
           24921   ~6%    {3}    | JOIN WITH `PathResolution::RelevantPath.isCratePath/2#e595e892_120#join_rhs` ON FIRST 2 OUTPUT Lhs.3, Rhs.2, Lhs.2

          131378   ~2%    {3} r6 = r1 UNION r5
          131072   ~2%    {3}    | AND NOT `PathResolution::unqualifiedPathLookup/2#6b171b76#reorder_2_0_1#prev`(FIRST 3)
                          return r6
```

After
```
Pipeline standard for PathResolution::unqualifiedPathLookup/2#6b171b76#reorder_2_0_1@0553a4wi was evaluated in 66 iterations totaling 10ms (delta sizes total: 131072).
        610251  ~0%    {4} r1 = SCAN `PathResolution::getASuccessor/3#febac7bd#prev_delta` OUTPUT In.1, In.2, In.0, In.3
        131378  ~0%    {3}    | JOIN WITH `PathResolution::unqualifiedPathLookup1/4#781de0cd_1230#join_rhs` ON FIRST 3 OUTPUT Lhs.3, Rhs.3, Lhs.1
        131072  ~0%    {3}    | AND NOT `PathResolution::unqualifiedPathLookup/2#6b171b76#reorder_2_0_1#prev`(FIRST 3)
                       return r1
```
This commit is contained in:
Tom Hvitved
2025-04-08 13:10:52 +02:00
parent d8ca8dd954
commit 2e1b8b8b0e

View File

@@ -882,20 +882,24 @@ private predicate hasChild(ItemNode parent, ItemNode child) { child.getImmediate
private predicate rootHasCratePathTc(ItemNode i1, ItemNode i2) =
doublyBoundedFastTC(hasChild/2, isRoot/1, hasCratePath/1)(i1, i2)
pragma[nomagic]
private predicate unqualifiedPathLookup1(RelevantPath p, string name, Namespace ns, ItemNode encl) {
unqualifiedPathLookup(p, name, ns, encl)
or
// For `($)crate`, jump directly to the root module
exists(ItemNode i | p.isCratePath(name, i) |
encl.(ModuleLikeNode).isRoot() and
encl = i
or
rootHasCratePathTc(encl, i)
)
}
pragma[nomagic]
private ItemNode unqualifiedPathLookup(RelevantPath path, Namespace ns) {
exists(ItemNode encl, string name |
result = getASuccessor(encl, pragma[only_bind_into](name), ns)
|
unqualifiedPathLookup(path, name, ns, encl)
or
// For `($)crate`, jump directly to the root module
exists(ItemNode i | path.isCratePath(pragma[only_bind_into](name), i) |
encl.(ModuleLikeNode).isRoot() and
encl = i
or
rootHasCratePathTc(encl, i)
)
result = getASuccessor(encl, name, ns) and
unqualifiedPathLookup1(path, name, ns, encl)
)
}
@@ -916,8 +920,7 @@ private ItemNode resolvePath0(RelevantPath path, Namespace ns) {
or
exists(ItemNode q, string name |
q = resolvePathQualifier(path, name) and
result = q.getASuccessor(name) and
ns = result.getNamespace()
result = getASuccessor(q, name, ns)
)
or
result = resolveUseTreeListItem(_, _, path) and