diff options
| author | bors <bors@rust-lang.org> | 2022-02-26 07:00:33 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-02-26 07:00:33 +0000 |
| commit | d5a9bc947617babe3833458f3e09f3d6d5e3d736 (patch) | |
| tree | de518903867524129fc7cc3345c671abca9fe080 /compiler/rustc_data_structures/src/graph | |
| parent | 7c3331ccf925200b8fb7127db8bae8802edf1b61 (diff) | |
| parent | 648a8e314ad28293b721888839c3ac6a0184cf22 (diff) | |
| download | rust-d5a9bc947617babe3833458f3e09f3d6d5e3d736.tar.gz rust-d5a9bc947617babe3833458f3e09f3d6d5e3d736.zip | |
Auto merge of #94392 - matthiaskrgr:rollup-npscf95, r=matthiaskrgr
Rollup of 5 pull requests Successful merges: - #93400 (Do not suggest using a const parameter when there are bounds on an unused type parameter) - #93982 (Provide extra note if synthetic type args are specified) - #94087 (Remove unused `unsound_ignore_borrow_on_drop`) - #94235 (chalk: Fix wrong debrujin index in opaque type handling.) - #94306 (Avoid exhausting stack space in dominator compression) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_data_structures/src/graph')
| -rw-r--r-- | compiler/rustc_data_structures/src/graph/dominators/mod.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/compiler/rustc_data_structures/src/graph/dominators/mod.rs b/compiler/rustc_data_structures/src/graph/dominators/mod.rs index 0d2ae115cb0..00913a483db 100644 --- a/compiler/rustc_data_structures/src/graph/dominators/mod.rs +++ b/compiler/rustc_data_structures/src/graph/dominators/mod.rs @@ -241,9 +241,19 @@ fn compress( v: PreorderIndex, ) { assert!(is_processed(v, lastlinked)); - let u = ancestor[v]; - if is_processed(u, lastlinked) { - compress(ancestor, lastlinked, semi, label, u); + // Compute the processed list of ancestors + // + // We use a heap stack here to avoid recursing too deeply, exhausting the + // stack space. + let mut stack: smallvec::SmallVec<[_; 8]> = smallvec::smallvec![v]; + let mut u = ancestor[v]; + while is_processed(u, lastlinked) { + stack.push(u); + u = ancestor[u]; + } + + // Then in reverse order, popping the stack + for &[v, u] in stack.array_windows().rev() { if semi[label[u]] < semi[label[v]] { label[v] = label[u]; } |
