diff options
author | nemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-05-06 20:46:25 +0000 |
---|---|---|
committer | nemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-05-06 20:46:25 +0000 |
commit | c1a832790d44fdaafc6d126e1bf30e90764a8b97 (patch) | |
tree | 6c86279911568e42d00cc522d22e78b11e7c5bd4 /gcc/expr.c | |
parent | 09e6ffb6f07283abaa720f62328a979c45a33097 (diff) | |
download | gcc-c1a832790d44fdaafc6d126e1bf30e90764a8b97.tar.gz |
* expr.c (get_def_for_expr): Move it up in the file.
(store_field): When expanding a bit-field store, look at the
defining gimple stmt for the masking conversion.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147203 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 49 |
1 files changed, 26 insertions, 23 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index 3c800dd77be..aca8c578c8e 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -2249,6 +2249,26 @@ use_group_regs (rtx *call_fusage, rtx regs) use_reg (call_fusage, reg); } } + +/* Return the defining gimple statement for SSA_NAME NAME if it is an + assigment and the code of the expresion on the RHS is CODE. Return + NULL otherwise. */ + +static gimple +get_def_for_expr (tree name, enum tree_code code) +{ + gimple def_stmt; + + if (TREE_CODE (name) != SSA_NAME) + return NULL; + + def_stmt = get_gimple_for_ssa_name (name); + if (!def_stmt + || gimple_assign_rhs_code (def_stmt) != code) + return NULL; + + return def_stmt; +} /* Determine whether the LEN bytes generated by CONSTFUN can be @@ -5776,22 +5796,25 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0)) { rtx temp; + gimple nop_def; /* If EXP is a NOP_EXPR of precision less than its mode, then that implies a mask operation. If the precision is the same size as the field we're storing into, that mask is redundant. This is particularly common with bit field assignments generated by the C front end. */ - if (TREE_CODE (exp) == NOP_EXPR) + nop_def = get_def_for_expr (exp, NOP_EXPR); + if (nop_def) { tree type = TREE_TYPE (exp); if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type)) && bitsize == TYPE_PRECISION (type)) { - type = TREE_TYPE (TREE_OPERAND (exp, 0)); + tree op = gimple_assign_rhs1 (nop_def); + type = TREE_TYPE (op); if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) >= bitsize) - exp = TREE_OPERAND (exp, 0); + exp = op; } } @@ -6992,26 +7015,6 @@ expand_constructor (tree exp, rtx target, enum expand_modifier modifier, return target; } -/* Return the defining gimple statement for SSA_NAME NAME if it is an - assigment and the code of the expresion on the RHS is CODE. Return - NULL otherwise. */ - -static gimple -get_def_for_expr (tree name, enum tree_code code) -{ - gimple def_stmt; - - if (TREE_CODE (name) != SSA_NAME) - return NULL; - - def_stmt = get_gimple_for_ssa_name (name); - if (!def_stmt - || gimple_assign_rhs_code (def_stmt) != code) - return NULL; - - return def_stmt; -} - /* expand_expr: generate code for computing expression EXP. An rtx for the computed value is returned. The value is never null. |