From 6be4441bbf91bca8222841ad8afeeb60af3d7de4 Mon Sep 17 00:00:00 2001 From: Afonso Bordado Date: Thu, 22 Jul 2021 12:29:01 +0100 Subject: [PATCH] cranelift: Resolve alias lookups in interpreter --- .../filetests/filetests/runtests/alias.clif | 30 +++++++++++++++++++ cranelift/interpreter/src/frame.rs | 18 ++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 cranelift/filetests/filetests/runtests/alias.clif diff --git a/cranelift/filetests/filetests/runtests/alias.clif b/cranelift/filetests/filetests/runtests/alias.clif new file mode 100644 index 0000000000..cf5e99ca95 --- /dev/null +++ b/cranelift/filetests/filetests/runtests/alias.clif @@ -0,0 +1,30 @@ +test interpret +test run +target aarch64 +target s390x +target x86_64 machinst + +function %alias(i8) -> i8 { +block0(v0: i8): + v1 -> v0 + return v1 +} +; run: %alias(0) == 0 +; run: %alias(-1) == -1 + +function %double_alias(i8) -> i8 { +block0(v0: i8): + v1 -> v0 + v2 -> v1 + return v2 +} +; run: %double_alias(0) == 0 +; run: %double_alias(-1) == -1 + +function %alias_inst() -> i8 { +block0: + v0 = iconst.i8 10 + v1 -> v0 + return v1 +} +; run: %alias_inst() == 10 diff --git a/cranelift/interpreter/src/frame.rs b/cranelift/interpreter/src/frame.rs index 2a437a34f0..ede48e9fef 100644 --- a/cranelift/interpreter/src/frame.rs +++ b/cranelift/interpreter/src/frame.rs @@ -1,7 +1,7 @@ //! Implements a call frame (activation record) for the Cranelift interpreter. use cranelift_codegen::data_value::DataValue; -use cranelift_codegen::ir::{Function, Value as ValueRef}; +use cranelift_codegen::ir::{types, Function, Value as ValueRef}; use cranelift_entity::EntityRef; use log::trace; @@ -40,6 +40,22 @@ impl<'a> Frame<'a> { .get(name.index()) .unwrap_or_else(|| panic!("unknown value: {}", name)) .as_ref() + .or_else(|| { + // We couldn't find the `name` value directly in `registers`, but it is still + // possible that it is aliased to another value. + + // If we are looking up an undefined value it will have an invalid type, return + // before trying to resolve it. + if self.function.dfg.value_type(name) == types::INVALID { + return None; + } + + let alias = self.function.dfg.resolve_aliases(name); + self.registers + .get(alias.index()) + .unwrap_or_else(|| panic!("unknown value: {}", alias)) + .as_ref() + }) .unwrap_or_else(|| panic!("empty slot: {}", name)) }