summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Chevalier-Boisvert <maxime.chevalierboisvert@shopify.com>2022-08-02 15:12:04 -0400
committerTakashi Kokubun <takashikkbn@gmail.com>2022-08-29 08:47:06 -0700
commitca68ccdaddb6930f2d6dc9172a8653bcfb340afd (patch)
tree9dd81e17c15e4bfec98af5a1508bf9c49fa9fa1c
parent0823260546f5fd749c3e1e9afadc29f4c6072ef1 (diff)
Fix C call reg alloc bug reported by Noah & Kokubun
-rw-r--r--yjit/src/backend/ir.rs4
-rw-r--r--yjit/src/backend/tests.rs14
2 files changed, 13 insertions, 5 deletions
diff --git a/yjit/src/backend/ir.rs b/yjit/src/backend/ir.rs
index 45d4378eb4..f634fb7678 100644
--- a/yjit/src/backend/ir.rs
+++ b/yjit/src/backend/ir.rs
@@ -633,7 +633,7 @@ impl Assembler
let reg_index = regs.iter().position(|elem| elem.reg_no == reg.reg_no);
if let Some(reg_index) = reg_index {
- assert_eq!(*pool & (1 << reg_index), 0);
+ assert_eq!(*pool & (1 << reg_index), 0, "register already allocated");
*pool |= 1 << reg_index;
}
@@ -702,7 +702,7 @@ impl Assembler
// We do this to improve register allocation on x86
// e.g. out = add(reg0, reg1)
// reg0 = add(reg0, reg1)
- if opnds.len() > 0 {
+ else if opnds.len() > 0 {
if let Opnd::InsnOut{idx, ..} = opnds[0] {
if live_ranges[idx] == index {
if let Opnd::Reg(reg) = asm.insns[idx].out {
diff --git a/yjit/src/backend/tests.rs b/yjit/src/backend/tests.rs
index dc56bd4abb..a31e16071b 100644
--- a/yjit/src/backend/tests.rs
+++ b/yjit/src/backend/tests.rs
@@ -195,9 +195,7 @@ fn test_base_insn_out()
fn test_c_call()
{
c_callable! {
- fn dummy_c_fun(v0: usize, v1: usize)
- {
- }
+ fn dummy_c_fun(v0: usize, v1: usize) {}
}
let (mut asm, mut cb) = setup_asm();
@@ -214,6 +212,16 @@ fn test_c_call()
}
#[test]
+fn test_alloc_ccall_regs() {
+ let mut asm = Assembler::new();
+ let out1 = asm.ccall(0 as *const u8, vec![]);
+ let out2 = asm.ccall(0 as *const u8, vec![out1]);
+ asm.mov(EC, out2);
+ let mut cb = CodeBlock::new_dummy(1024);
+ asm.compile_with_regs(&mut cb, Assembler::get_alloc_regs());
+}
+
+#[test]
fn test_lea_ret()
{
let (mut asm, mut cb) = setup_asm();