summaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authornemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4>2009-05-06 20:46:25 +0000
committernemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4>2009-05-06 20:46:25 +0000
commitc1a832790d44fdaafc6d126e1bf30e90764a8b97 (patch)
tree6c86279911568e42d00cc522d22e78b11e7c5bd4 /gcc/expr.c
parent09e6ffb6f07283abaa720f62328a979c45a33097 (diff)
downloadgcc-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.c49
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.