Re: [PATCH 15/19] x86-64: move received parameters to non-fixed registers

2009-09-06 Thread Tomek Grabiec
Hi,

2009/9/5 Eduard - Gabriel Munteanu :
> We must not keep the parameters we received in fixed registers because
> they can be clobbered by other insn-selector rules that use them (e.g.
> method invocation).
>
> Signed-off-by: Eduard - Gabriel Munteanu 
> ---
>  arch/x86/insn-selector.brg     |   38 +++---
>  include/jit/compilation-unit.h |    4 
>  2 files changed, 35 insertions(+), 7 deletions(-)
>
> diff --git a/arch/x86/insn-selector.brg b/arch/x86/insn-selector.brg
> index f9995fc..17b68a1 100644
> --- a/arch/x86/insn-selector.brg
> +++ b/arch/x86/insn-selector.brg
> @@ -2280,7 +2280,7 @@ stmt:  STMT_STORE(EXPR_TEMPORARY, EXPR_LOCAL) 1
>                        select_insn(s, tree, 
> memlocal_reg_insn(INSN_MOV_MEMLOCAL_REG,
>                                                               slot, dest));
>                } else {
> -                       src = get_fixed_var(s->b_parent, reg);
> +                       src = 
> s->b_parent->non_fixed_args[exprsrc->local_index];
>                        select_insn(s, tree, reg_reg_insn(INSN_MOV_REG_REG, 
> src, dest));
>                }
>        } else {
> @@ -3388,15 +3388,39 @@ static void setup_caller_saved_regs(struct 
> compilation_unit *cu)
>  #else /* CONFIG_X86_32 */
>  static void setup_caller_saved_regs(struct compilation_unit *cu)
>  {
> +       struct var_info **map;
> +       struct var_info *rdi, *rsi, *rdx, *rcx, *r8, *r9;
> +       struct basic_block *bb = cu->entry_bb;
> +
>        get_fixed_var(cu, MACH_REG_RAX);
> -       get_fixed_var(cu, MACH_REG_RDI);
> -       get_fixed_var(cu, MACH_REG_RSI);
> -       get_fixed_var(cu, MACH_REG_RDX);
> -       get_fixed_var(cu, MACH_REG_RCX);
> -       get_fixed_var(cu, MACH_REG_R8);
> -       get_fixed_var(cu, MACH_REG_R9);
>        get_fixed_var(cu, MACH_REG_R10);
>        get_fixed_var(cu, MACH_REG_R11);
> +
> +       cu->non_fixed_args = malloc(6 * sizeof(struct var_info *));
> +       if (!cu->non_fixed_args)
> +               abort();
> +       map = cu->non_fixed_args;
> +
> +       rdi = get_fixed_var(cu, MACH_REG_RDI);
> +       rsi = get_fixed_var(cu, MACH_REG_RSI);
> +       rdx = get_fixed_var(cu, MACH_REG_RDX);
> +       rcx = get_fixed_var(cu, MACH_REG_RCX);
> +       r8 = get_fixed_var(cu, MACH_REG_R8);
> +       r9 = get_fixed_var(cu, MACH_REG_R9);
> +
> +       map[0] = get_var(cu, J_LONG);
> +       map[1] = get_var(cu, J_LONG);
> +       map[2] = get_var(cu, J_LONG);
> +       map[3] = get_var(cu, J_LONG);
> +       map[4] = get_var(cu, J_LONG);
> +       map[5] = get_var(cu, J_LONG);
> +
> +       eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rdi, map[0]));
> +       eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rsi, map[1]));
> +       eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rdx, map[2]));
> +       eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rcx, map[3]));
> +       eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, r8, map[4]));
> +       eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, r9, map[5]));
>  }
>  #endif /* CONFIG_X86_32 */

It is incorrect to allocate virtual registers of J_LONG type for all
call arguments, regardless of their type.
That's because for garbage collection to work we must track which
virtual registers hold a reference and which don't. We also can't mark
all registers as J_REFERENCE because it could cause that integers
would be interpreted as pointers. I think the proper solution would be
to iterate over method's call argument types, and for argument type T
we should allocate register of type mimic_stack_type(T). I also think
that we only have to emit movs for registers which are actually
holding a call argument, not for all of them, but that's an
optimization.

-- 
Tomek Grabiec

--
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
___
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel


Re: [PATCH 15/19] x86-64: move received parameters to non-fixed registers

2009-09-06 Thread Pekka Enberg
On Sat, 2009-09-05 at 13:27 +0300, Eduard - Gabriel Munteanu wrote:
> We must not keep the parameters we received in fixed registers because
> they can be clobbered by other insn-selector rules that use them (e.g.
> method invocation).
> 
> Signed-off-by: Eduard - Gabriel Munteanu 

I applied this with minor modifications but Tomek explained that my
approach is equally broken.

Eduard, I'm reverting the patch, please resend after handling the issues
raised by Tomek.

Pekka


--
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
___
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel


[PATCH 15/19] x86-64: move received parameters to non-fixed registers

2009-09-05 Thread Eduard - Gabriel Munteanu
We must not keep the parameters we received in fixed registers because
they can be clobbered by other insn-selector rules that use them (e.g.
method invocation).

Signed-off-by: Eduard - Gabriel Munteanu 
---
 arch/x86/insn-selector.brg |   38 +++---
 include/jit/compilation-unit.h |4 
 2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/arch/x86/insn-selector.brg b/arch/x86/insn-selector.brg
index f9995fc..17b68a1 100644
--- a/arch/x86/insn-selector.brg
+++ b/arch/x86/insn-selector.brg
@@ -2280,7 +2280,7 @@ stmt:  STMT_STORE(EXPR_TEMPORARY, EXPR_LOCAL) 1
select_insn(s, tree, 
memlocal_reg_insn(INSN_MOV_MEMLOCAL_REG,
   slot, dest));
} else {
-   src = get_fixed_var(s->b_parent, reg);
+   src = s->b_parent->non_fixed_args[exprsrc->local_index];
select_insn(s, tree, reg_reg_insn(INSN_MOV_REG_REG, 
src, dest));
}
} else {
@@ -3388,15 +3388,39 @@ static void setup_caller_saved_regs(struct 
compilation_unit *cu)
 #else /* CONFIG_X86_32 */
 static void setup_caller_saved_regs(struct compilation_unit *cu)
 {
+   struct var_info **map;
+   struct var_info *rdi, *rsi, *rdx, *rcx, *r8, *r9;
+   struct basic_block *bb = cu->entry_bb;
+
get_fixed_var(cu, MACH_REG_RAX);
-   get_fixed_var(cu, MACH_REG_RDI);
-   get_fixed_var(cu, MACH_REG_RSI);
-   get_fixed_var(cu, MACH_REG_RDX);
-   get_fixed_var(cu, MACH_REG_RCX);
-   get_fixed_var(cu, MACH_REG_R8);
-   get_fixed_var(cu, MACH_REG_R9);
get_fixed_var(cu, MACH_REG_R10);
get_fixed_var(cu, MACH_REG_R11);
+
+   cu->non_fixed_args = malloc(6 * sizeof(struct var_info *));
+   if (!cu->non_fixed_args)
+   abort();
+   map = cu->non_fixed_args;
+
+   rdi = get_fixed_var(cu, MACH_REG_RDI);
+   rsi = get_fixed_var(cu, MACH_REG_RSI);
+   rdx = get_fixed_var(cu, MACH_REG_RDX);
+   rcx = get_fixed_var(cu, MACH_REG_RCX);
+   r8 = get_fixed_var(cu, MACH_REG_R8);
+   r9 = get_fixed_var(cu, MACH_REG_R9);
+
+   map[0] = get_var(cu, J_LONG);
+   map[1] = get_var(cu, J_LONG);
+   map[2] = get_var(cu, J_LONG);
+   map[3] = get_var(cu, J_LONG);
+   map[4] = get_var(cu, J_LONG);
+   map[5] = get_var(cu, J_LONG);
+
+   eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rdi, map[0]));
+   eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rsi, map[1]));
+   eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rdx, map[2]));
+   eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, rcx, map[3]));
+   eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, r8, map[4]));
+   eh_add_insn(bb, reg_reg_insn(INSN_MOV_REG_REG, r9, map[5]));
 }
 #endif /* CONFIG_X86_32 */
 
diff --git a/include/jit/compilation-unit.h b/include/jit/compilation-unit.h
index c3f55b1..41cb51e 100644
--- a/include/jit/compilation-unit.h
+++ b/include/jit/compilation-unit.h
@@ -104,6 +104,10 @@ struct compilation_unit {
 * rule where we can not use a register.
 */
struct stack_slot *scratch_slot;
+
+#ifdef CONFIG_ARGS_MAP
+   struct var_info **non_fixed_args;
+#endif
 };
 
 struct compilation_unit *compilation_unit_alloc(struct vm_method *);
-- 
1.6.0.6


--
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
___
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel