Skip to content

Commit b3670b2

Browse files
committed
spirt_passes/reduce: fix long-standing bug involving chained replacements.
1 parent 7f508ba commit b3670b2

File tree

1 file changed

+17
-9
lines changed
  • crates/rustc_codegen_spirv/src/linker/spirt_passes

1 file changed

+17
-9
lines changed

crates/rustc_codegen_spirv/src/linker/spirt_passes/reduce.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -235,15 +235,23 @@ pub(crate) fn reduce_in_func(cx: &Context, func_def_body: &mut FuncDefBody) {
235235
break;
236236
}
237237

238-
func_def_body.inner_in_place_transform_with(&mut ReplaceValueWith(|v| match v {
239-
Value::Const(_) => None,
240-
_ => value_replacements
241-
.get(&HashableValue(v))
242-
.copied()
243-
.map(|new| {
244-
any_changes = true;
245-
new
246-
}),
238+
func_def_body.inner_in_place_transform_with(&mut ReplaceValueWith(|mut v| {
239+
let old = v;
240+
loop {
241+
match v {
242+
Value::Const(_) => break,
243+
_ => match value_replacements.get(&HashableValue(v)) {
244+
Some(&new) => v = new,
245+
None => break,
246+
},
247+
}
248+
}
249+
if v != old {
250+
any_changes = true;
251+
Some(v)
252+
} else {
253+
None
254+
}
247255
}));
248256
}
249257
}

0 commit comments

Comments
 (0)