expr.c (get_def_for_expr): Move it up in the file.

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

From-SVN: r147203
This commit is contained in:
Adam Nemet 2009-05-06 20:46:25 +00:00 committed by Adam Nemet
parent c7cb9f42a8
commit 641cac0b19
2 changed files with 32 additions and 23 deletions

View File

@ -1,3 +1,9 @@
2009-05-06 Adam Nemet <anemet@caviumnetworks.com>
* 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.
2009-05-06 Janis Johnson <janis187@us.ibm.com>
PR middle-end/39986

View File

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