[PATCH 2/2][SQUASH TO 4/4] lib: fix compilation error

2009-09-03 Thread Tomek Grabiec

Signed-off-by: Tomek Grabiec 
---
 include/lib/stack.h |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/include/lib/stack.h b/include/lib/stack.h
index 7ec599d..aa60109 100644
--- a/include/lib/stack.h
+++ b/include/lib/stack.h
@@ -7,6 +7,8 @@
 #include 
 #include 
 
+#include "vm/die.h"
+
 struct stack {
unsigned long   nr_elements;
void**elements;
-- 
1.6.3.3


--
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 1/2][SQUASH to 2/4] test: fix 'make check' breakage

2009-09-03 Thread Tomek Grabiec

Signed-off-by: Tomek Grabiec 
---
 test/jit/basic-block-test.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/test/jit/basic-block-test.c b/test/jit/basic-block-test.c
index 7195487..a22d3bf 100644
--- a/test/jit/basic-block-test.c
+++ b/test/jit/basic-block-test.c
@@ -24,7 +24,7 @@ void test_split_with_out_of_range_offset(void)
bb = get_basic_block(cu, 1, 2);
 
assert_ptr_equals(NULL, bb_split(bb, 0));
-   assert_ptr_equals(NULL, bb_split(bb, 2));
+   assert_ptr_equals(NULL, bb_split(bb, 3));
 
free_compilation_unit(cu);
 }
-- 
1.6.3.3


--
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 3/4] jit: set .has_branch flag for created basic blocks for tableswitch/lookupswitch.

2009-09-03 Thread Tomek Grabiec
We must set that flag so that mimic stack resolution will put moves
before branch instructions.

Signed-off-by: Tomek Grabiec 
---
 jit/switch-bc.c |7 ---
 1 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/jit/switch-bc.c b/jit/switch-bc.c
index b1ece1a..fb3fef2 100644
--- a/jit/switch-bc.c
+++ b/jit/switch-bc.c
@@ -98,8 +98,9 @@ int convert_tableswitch(struct parse_context *ctx)
 
assert(b1 && b2);
 
-   b1->is_converted = true;
-   b2->is_converted = true;
+   master_bb->has_branch = true;
+   b1->has_branch = true;
+   b2->has_branch = true;
 
bb_add_successor(master_bb, default_bb );
bb_add_successor(master_bb, b1);
@@ -183,7 +184,7 @@ int convert_lookupswitch(struct parse_context *ctx)
 
assert(b1);
 
-   b1->is_converted = true;
+   b1->has_branch = true;
 
bb_add_successor(master_bb, default_bb );
bb_add_successor(master_bb, b1);
-- 
1.6.3.3


--
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 4/4] jit: fix mimic stack content propagation

2009-09-03 Thread Tomek Grabiec
The mimic stack propagation procedure was pushing elements onto
successors' stacks on every CFG edge. This caused that the successor's
stack was larger then it should be. The successor's stack was then
also propagated, along with extra elements. This leads to geneartion
of many unnecessary register moves.

In some CFG configurations this may lead to degenerative mimic stack
resolution, where STMT_STORE is inserted with src temporary that is
assigned only on some paths. This leads to incorrect liveness analysis
of the temporary register, because it is seen to be used before it is
defined. The register appears to be always live before it's use
position, which is wrong, and could cause problems with GC.

Signed-off-by: Tomek Grabiec 
---
 include/jit/basic-block.h |3 ++
 include/lib/stack.h   |   24 +-
 jit/bytecode-to-ir.c  |   49 
 3 files changed, 61 insertions(+), 15 deletions(-)

diff --git a/include/jit/basic-block.h b/include/jit/basic-block.h
index b3e3cc1..c4b74ec 100644
--- a/include/jit/basic-block.h
+++ b/include/jit/basic-block.h
@@ -46,6 +46,9 @@ struct basic_block {
   Adl-Tabatabai et al (1998) for more in-depth explanation.  */
struct stack *mimic_stack;
 
+   unsigned long entry_mimic_stack_size;
+   bool entry_mimic_stack_set;
+
/* Is this basic block an exception handler? */
bool is_eh;
 
diff --git a/include/lib/stack.h b/include/lib/stack.h
index e4e79d9..7ec599d 100644
--- a/include/lib/stack.h
+++ b/include/lib/stack.h
@@ -1,9 +1,11 @@
 #ifndef LIB_STACK_H
 #define LIB_STACK_H
 
+#include 
+#include 
+#include 
 #include 
 #include 
-#include 
 
 struct stack {
unsigned long   nr_elements;
@@ -37,4 +39,24 @@ static inline bool stack_is_empty(struct stack *stack)
return !stack->nr_elements;
 }
 
+static inline unsigned long stack_size(struct stack *stack)
+{
+   return stack->nr_elements;
+}
+
+static inline void stack_copy(struct stack *src, struct stack *dst)
+{
+   void **new_elements;
+   unsigned long size;
+
+   size = src->nr_elements * sizeof(void*);
+   new_elements = realloc(dst->elements, size);
+   if (!new_elements)
+   error("out of memory");
+
+   dst->elements = new_elements;
+   dst->nr_elements = src->nr_elements;
+   memcpy(new_elements, src->elements, size);
+}
+
 #endif
diff --git a/jit/bytecode-to-ir.c b/jit/bytecode-to-ir.c
index 2923890..4c059e0 100644
--- a/jit/bytecode-to-ir.c
+++ b/jit/bytecode-to-ir.c
@@ -181,8 +181,17 @@ static int do_convert_bb_to_ir(struct basic_block *bb)
buffer.buffer = cu->method->code_attribute.code;
buffer.pos = bb->start;
 
-   if (bb->is_eh)
+   if (bb->is_eh) {
+   assert(!bb->entry_mimic_stack_set);
stack_push(bb->mimic_stack, exception_ref_expr());
+   bb->entry_mimic_stack_size = 1;
+   bb->entry_mimic_stack_set = true;
+   }
+
+   if (!bb->entry_mimic_stack_set) {
+   bb->entry_mimic_stack_size = 0;
+   bb->entry_mimic_stack_set = true;
+   }
 
while (buffer.pos < bb->end) {
ctx.offset = ctx.buffer->pos;   /* this is fragile */
@@ -194,6 +203,28 @@ static int do_convert_bb_to_ir(struct basic_block *bb)
return err;
 }
 
+static int reload_mimic_stack(struct basic_block *bb, struct stack *reload)
+{
+   for (unsigned int i = 0; i < reload->nr_elements; i++)
+   bb_add_mimic_stack_expr(bb, reload->elements[i]);
+
+   if (!bb->entry_mimic_stack_set) {
+   for (unsigned int i = 0; i < reload->nr_elements; i++) {
+   struct expression *elem;
+
+   elem = reload->elements[reload->nr_elements - i - 1];
+   expr_get(elem);
+   stack_push(bb->mimic_stack, elem);
+   }
+
+   bb->entry_mimic_stack_size = stack_size(bb->mimic_stack);
+   bb->entry_mimic_stack_set  = true;
+   } else if (stack_size(reload) != bb->entry_mimic_stack_size)
+   return error("stack size differs on different paths"), -EINVAL;
+
+   return 0;
+}
+
 static int convert_bb_to_ir(struct basic_block *bb)
 {
struct stack *reload_stack;
@@ -227,20 +258,10 @@ static int convert_bb_to_ir(struct basic_block *bb)
if (!reload_stack)
return warn("out of memory"), -ENOMEM;
 
-   while (!stack_is_empty(reload_stack)) {
-   struct expression *expr = stack_pop(reload_stack);
-
-   for (i = 0; i < bb->nr_successors; i++) {
-   struct basic_block *s = bb->successors[i];
+   for (i = 0; i < bb->nr_successors; i++)
+   reload_mimic_stack(bb->successors[i], reload_stack);
 
-   expr_get(expr);
-
-   bb_add_mimic_stack_expr(s, expr);
-
-   stack_push(s

[PATCH 2/4] jit: split tableswitch/lookupswitch bsaic block at the end.

2009-09-03 Thread Tomek Grabiec
This way, the order of basic blocks matches the values of .start and .end
It also makes created basic blocks have empty bytecode range (start == end).

Signed-off-by: Tomek Grabiec 
---
 jit/basic-block.c |2 +-
 jit/switch-bc.c   |6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/jit/basic-block.c b/jit/basic-block.c
index 401377c..d478315 100644
--- a/jit/basic-block.c
+++ b/jit/basic-block.c
@@ -104,7 +104,7 @@ struct basic_block *bb_split(struct basic_block *orig_bb, 
unsigned long offset)
 {
struct basic_block *new_bb;
 
-   if (offset < orig_bb->start || offset >= orig_bb->end)
+   if (offset < orig_bb->start || offset > orig_bb->end)
return NULL;
 
new_bb = alloc_basic_block(orig_bb->b_parent, offset, orig_bb->end);
diff --git a/jit/switch-bc.c b/jit/switch-bc.c
index 32cb7fc..b1ece1a 100644
--- a/jit/switch-bc.c
+++ b/jit/switch-bc.c
@@ -93,8 +93,8 @@ int convert_tableswitch(struct parse_context *ctx)
 
master_bb = ctx->bb;
 
-   b1 = bb_split(master_bb, ctx->offset);
-   b2 = bb_split(b1, ctx->offset);
+   b1 = bb_split(master_bb, master_bb->end);
+   b2 = bb_split(b1, master_bb->end);
 
assert(b1 && b2);
 
@@ -179,7 +179,7 @@ int convert_lookupswitch(struct parse_context *ctx)
 
master_bb = ctx->bb;
 
-   b1 = bb_split(master_bb, ctx->offset);
+   b1 = bb_split(master_bb, master_bb->end);
 
assert(b1);
 
-- 
1.6.3.3


--
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 1/4] jit: make clear_mimic_stack() work on stack instead of basic block

2009-09-03 Thread Tomek Grabiec

Signed-off-by: Tomek Grabiec 
---
 include/jit/basic-block.h |2 +-
 jit/basic-block.c |6 +++---
 jit/exception-bc.c|2 +-
 jit/invoke-bc.c   |4 ++--
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/include/jit/basic-block.h b/include/jit/basic-block.h
index d5452a4..b3e3cc1 100644
--- a/include/jit/basic-block.h
+++ b/include/jit/basic-block.h
@@ -88,7 +88,7 @@ unsigned char *bb_native_ptr(struct basic_block *bb);
 void resolution_block_init(struct resolution_block *block);
 bool branch_needs_resolution_block(struct basic_block *from, int idx);
 int bb_lookup_successor_index(struct basic_block *from, struct basic_block 
*to);
-void clear_mimic_stack(struct basic_block *bb);
+void clear_mimic_stack(struct stack *);
 
 #define for_each_basic_block(bb, bb_list) list_for_each_entry(bb, bb_list, 
bb_list_node)
 #define for_each_basic_block_reverse(bb, bb_list) 
list_for_each_entry_reverse(bb, bb_list, bb_list_node)
diff --git a/jit/basic-block.c b/jit/basic-block.c
index e19ee7e..401377c 100644
--- a/jit/basic-block.c
+++ b/jit/basic-block.c
@@ -235,12 +235,12 @@ bool branch_needs_resolution_block(struct basic_block 
*from, int idx)
return !list_is_empty(&from->resolution_blocks[idx].insns);
 }
 
-void clear_mimic_stack(struct basic_block *bb)
+void clear_mimic_stack(struct stack *stack)
 {
struct expression *expr;
 
-   while (!stack_is_empty(bb->mimic_stack)) {
-   expr = stack_pop(bb->mimic_stack);
+   while (!stack_is_empty(stack)) {
+   expr = stack_pop(stack);
expr_put(expr);
}
 }
diff --git a/jit/exception-bc.c b/jit/exception-bc.c
index 94de121..c76772f 100644
--- a/jit/exception-bc.c
+++ b/jit/exception-bc.c
@@ -61,7 +61,7 @@ int convert_athrow(struct parse_context *ctx)
 * reference is not transferred to exception handlers in
 * BC2IR layer.
 */
-   clear_mimic_stack(ctx->bb);
+   clear_mimic_stack(ctx->bb->mimic_stack);
 
convert_statement(ctx, stmt);
 
diff --git a/jit/invoke-bc.c b/jit/invoke-bc.c
index cac01a9..b0a993a 100644
--- a/jit/invoke-bc.c
+++ b/jit/invoke-bc.c
@@ -35,7 +35,7 @@ int convert_xreturn(struct parse_context *ctx)
expr = stack_pop(ctx->bb->mimic_stack);
return_stmt->return_value = &expr->node;
convert_statement(ctx, return_stmt);
-   clear_mimic_stack(ctx->bb);
+   clear_mimic_stack(ctx->bb->mimic_stack);
return 0;
 }
 
@@ -48,7 +48,7 @@ int convert_return(struct parse_context *ctx)
return_stmt->return_value = NULL;
 
convert_statement(ctx, return_stmt);
-   clear_mimic_stack(ctx->bb);
+   clear_mimic_stack(ctx->bb->mimic_stack);
return 0;
 }
 
-- 
1.6.3.3


--
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