From: jamborm Date: Mon, 16 Apr 2012 16:04:45 +0000 (+0000) Subject: 2012-04-16 Martin Jambor X-Git-Tag: upstream/4.9.2~13242 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9e3797f2ed8ec7204ecbea6a3a76bc7f6ea88dae;p=platform%2Fupstream%2Flinaro-gcc.git 2012-04-16 Martin Jambor * tree-sra.c (build_ref_for_model): Create COMPONENT_REFs only for bit-fields. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186501 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 38df9e7..914e9bb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-04-16 Martin Jambor + + * tree-sra.c (build_ref_for_model): Create COMPONENT_REFs only for + bit-fields. + 2012-04-16 Ulrich Weigand PR target/51819 diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index c9d0159..e69f3ac 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1489,70 +1489,32 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset, return fold_build2_loc (loc, MEM_REF, exp_type, base, off); } -DEF_VEC_ALLOC_P_STACK (tree); -#define VEC_tree_stack_alloc(alloc) VEC_stack_alloc (tree, alloc) - /* Construct a memory reference to a part of an aggregate BASE at the given - OFFSET and of the type of MODEL. In case this is a chain of references - to component, the function will replicate the chain of COMPONENT_REFs of - the expression of MODEL to access it. GSI and INSERT_AFTER have the same - meaning as in build_ref_for_offset. */ + OFFSET and of the same type as MODEL. In case this is a reference to a + bit-field, the function will replicate the last component_ref of model's + expr to access it. GSI and INSERT_AFTER have the same meaning as in + build_ref_for_offset. */ static tree build_ref_for_model (location_t loc, tree base, HOST_WIDE_INT offset, struct access *model, gimple_stmt_iterator *gsi, bool insert_after) { - tree type = model->type, t; - VEC(tree,stack) *cr_stack = NULL; - - if (TREE_CODE (model->expr) == COMPONENT_REF) - { - tree expr = model->expr; - - /* Create a stack of the COMPONENT_REFs so later we can walk them in - order from inner to outer. */ - cr_stack = VEC_alloc (tree, stack, 6); - - do { - tree field = TREE_OPERAND (expr, 1); - tree cr_offset = component_ref_field_offset (expr); - HOST_WIDE_INT bit_pos - = tree_low_cst (cr_offset, 1) * BITS_PER_UNIT - + TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field)); - - /* We can be called with a model different from the one associated - with BASE so we need to avoid going up the chain too far. */ - if (offset - bit_pos < 0) - break; - - offset -= bit_pos; - VEC_safe_push (tree, stack, cr_stack, expr); - - expr = TREE_OPERAND (expr, 0); - type = TREE_TYPE (expr); - } while (TREE_CODE (expr) == COMPONENT_REF); - } - - t = build_ref_for_offset (loc, base, offset, type, gsi, insert_after); - - if (TREE_CODE (model->expr) == COMPONENT_REF) + if (TREE_CODE (model->expr) == COMPONENT_REF + && DECL_BIT_FIELD (TREE_OPERAND (model->expr, 1))) { - unsigned i; - tree expr; - - /* Now replicate the chain of COMPONENT_REFs from inner to outer. */ - FOR_EACH_VEC_ELT_REVERSE (tree, cr_stack, i, expr) - { - tree field = TREE_OPERAND (expr, 1); - t = fold_build3_loc (loc, COMPONENT_REF, TREE_TYPE (field), t, field, - TREE_OPERAND (expr, 2)); - } - - VEC_free (tree, stack, cr_stack); + /* This access represents a bit-field. */ + tree t, exp_type, fld = TREE_OPERAND (model->expr, 1); + + offset -= int_bit_position (fld); + exp_type = TREE_TYPE (TREE_OPERAND (model->expr, 0)); + t = build_ref_for_offset (loc, base, offset, exp_type, gsi, insert_after); + return fold_build3_loc (loc, COMPONENT_REF, TREE_TYPE (fld), t, fld, + NULL_TREE); } - - return t; + else + return build_ref_for_offset (loc, base, offset, model->type, + gsi, insert_after); } /* Construct a memory reference consisting of component_refs and array_refs to