Skip to content

Commit 6c5895f

Browse files
committed
[TODO(eddyb) this is probably sound but requires looping for rewrites] [2024] WIP: mem2reg unsound changes??
1 parent ef80c5c commit 6c5895f

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

crates/rustc_codegen_spirv/src/linker/mem2reg.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ fn insert_phis_all(
193193
for (var_map, _) in &var_maps_and_types {
194194
split_copy_memory(header, blocks, var_map);
195195
}
196+
197+
let mut rewrite_rules = FxHashMap::default();
196198
for &(ref var_map, base_var_type) in &var_maps_and_types {
197199
let blocks_with_phi = insert_phis(blocks, dominance_frontier, var_map);
198200
let mut renamer = Renamer {
@@ -205,16 +207,15 @@ fn insert_phis_all(
205207
phi_defs: FxHashSet::default(),
206208
visited: FxHashSet::default(),
207209
stack: Vec::new(),
208-
rewrite_rules: FxHashMap::default(),
210+
rewrite_rules: &mut rewrite_rules,
209211
};
210212
renamer.rename(0, None);
211-
// FIXME(eddyb) shouldn't this full rescan of the function be done once?
212-
apply_rewrite_rules(
213-
&renamer.rewrite_rules,
214-
blocks.values_mut().map(|block| &mut **block),
215-
);
216-
remove_nops(blocks);
217213
}
214+
apply_rewrite_rules(
215+
&rewrite_rules,
216+
blocks.values_mut().map(|block| &mut **block),
217+
);
218+
remove_nops(blocks);
218219
remove_old_variables(blocks, &var_maps_and_types);
219220
true
220221
}
@@ -443,7 +444,7 @@ struct Renamer<'a, 'b> {
443444
phi_defs: FxHashSet<Word>,
444445
visited: FxHashSet<usize>,
445446
stack: Vec<Word>,
446-
rewrite_rules: FxHashMap<Word, Word>,
447+
rewrite_rules: &'a mut FxHashMap<Word, Word>,
447448
}
448449

449450
impl Renamer<'_, '_> {

crates/rustc_codegen_spirv/src/linker/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ fn apply_rewrite_rules<'a>(
103103
)
104104
});
105105
for id in all_ids_mut {
106-
if let Some(&rewrite) = rewrite_rules.get(id) {
106+
while let Some(&rewrite) = rewrite_rules.get(id) {
107107
*id = rewrite;
108108
}
109109
}

0 commit comments

Comments
 (0)