From b736dee60789f2353beeda8aed5b980659712c65 Mon Sep 17 00:00:00 2001 From: Tang Ching-Hui Date: Sun, 2 Dec 2001 18:44:54 +0800 Subject: re PR java/3096 (GCJ does not increment) 2001-12-02 Tang Ching-Hui Alexandre Petit-Bianco * expr.c: call save_expr on array for correct evaluation order, modified comment, fixed indentation. * parse.y: (patch_assignment): Correctly extract the array base from the tree generate by build_java_arrayaccess, added comments. (patch_array_ref): Remove SAVE_EXPR on ARRAY_REF. Fixes PR java/3096, PR java/3803, PR java/3965. Co-Authored-By: Alexandre Petit-Bianco From-SVN: r47525 --- gcc/java/ChangeLog | 10 ++++++++++ gcc/java/expr.c | 17 ++++++++++++----- gcc/java/parse.y | 22 ++++++++-------------- 3 files changed, 30 insertions(+), 19 deletions(-) (limited to 'gcc/java') diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index 1c0f009..a7d9bc8 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,3 +1,13 @@ +2001-12-02 Tang Ching-Hui + Alexandre Petit-Bianco + + * expr.c: call save_expr on array for correct evaluation order, + modified comment, fixed indentation. + * parse.y: (patch_assignment): Correctly extract the array base + from the tree generate by build_java_arrayaccess, added comments. + (patch_array_ref): Remove SAVE_EXPR on ARRAY_REF. + Fixes PR java/3096, PR java/3803, PR java/3965. + 2001-12-01 Neil Booth * expr.c (expand_byte_code): Remove trailing periods from messages. diff --git a/gcc/java/expr.c b/gcc/java/expr.c index 182d247..0d3c61d 100644 --- a/gcc/java/expr.c +++ b/gcc/java/expr.c @@ -798,14 +798,21 @@ build_java_arrayaccess (array, type, index) TREE_SIDE_EFFECTS( throw ) = 1; } } - + + /* The SAVE_EXPR is for correct evaluation order. It would be + cleaner to use force_evaluation_order (see comment there), but + that is difficult when we also have to deal with bounds + checking. The SAVE_EXPR is not necessary to do that when we're + not checking for array bounds. */ + if (TREE_SIDE_EFFECTS (index) && throw) + throw = build (COMPOUND_EXPR, int_type_node, save_expr (array), throw); + node = build1 (INDIRECT_REF, type, fold (build (PLUS_EXPR, ptr_type_node, - java_check_reference (array, flag_check_references), + java_check_reference (array, + flag_check_references), (throw ? build (COMPOUND_EXPR, int_type_node, - throw, arith ) - : arith)))); - + throw, arith ) : arith)))); return node; } diff --git a/gcc/java/parse.y b/gcc/java/parse.y index 3b9900d..f63faa3 100644 --- a/gcc/java/parse.y +++ b/gcc/java/parse.y @@ -12940,10 +12940,13 @@ patch_assignment (node, wfl_op1) /* We can have a SAVE_EXPR here when doing String +=. */ if (TREE_CODE (op) == SAVE_EXPR) op = TREE_OPERAND (op, 0); - if (flag_bounds_check) - base = TREE_OPERAND (TREE_OPERAND (op, 1), 0); - else - base = TREE_OPERAND (op, 0); + /* We can have a COMPOUND_EXPR here when doing bounds check. */ + if (TREE_CODE (op) == COMPOUND_EXPR) + op = TREE_OPERAND (op, 1); + base = TREE_OPERAND (op, 0); + /* Strip the last PLUS_EXPR to obtain the base. */ + if (TREE_CODE (base) == PLUS_EXPR) + base = TREE_OPERAND (base, 0); } /* Build the invocation of _Jv_CheckArrayStore */ @@ -14592,16 +14595,7 @@ patch_array_ref (node) TREE_OPERAND (node, 1) = index; } else - { - /* The save_expr is for correct evaluation order. It would be cleaner - to use force_evaluation_order (see comment there), but that is - difficult when we also have to deal with bounds checking. */ - if (TREE_SIDE_EFFECTS (index)) - array = save_expr (array); - node = build_java_arrayaccess (array, array_type, index); - if (TREE_SIDE_EFFECTS (index)) - node = build (COMPOUND_EXPR, array_type, array, node); - } + node = build_java_arrayaccess (array, array_type, index); TREE_TYPE (node) = array_type; return node; } -- cgit v1.1