Commit 641cac0b by Adam Nemet Committed by Adam Nemet

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
parent c7cb9f42
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> 2009-05-06 Janis Johnson <janis187@us.ibm.com>
PR middle-end/39986 PR middle-end/39986
......
...@@ -2249,6 +2249,26 @@ use_group_regs (rtx *call_fusage, rtx regs) ...@@ -2249,6 +2249,26 @@ use_group_regs (rtx *call_fusage, rtx regs)
use_reg (call_fusage, reg); 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 /* 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, ...@@ -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)) && compare_tree_int (TYPE_SIZE (TREE_TYPE (exp)), bitsize) != 0))
{ {
rtx temp; rtx temp;
gimple nop_def;
/* If EXP is a NOP_EXPR of precision less than its mode, then that /* 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 implies a mask operation. If the precision is the same size as
the field we're storing into, that mask is redundant. This is the field we're storing into, that mask is redundant. This is
particularly common with bit field assignments generated by the particularly common with bit field assignments generated by the
C front end. */ 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); tree type = TREE_TYPE (exp);
if (INTEGRAL_TYPE_P (type) if (INTEGRAL_TYPE_P (type)
&& TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type)) && TYPE_PRECISION (type) < GET_MODE_BITSIZE (TYPE_MODE (type))
&& bitsize == TYPE_PRECISION (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) 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, ...@@ -6992,26 +7015,6 @@ expand_constructor (tree exp, rtx target, enum expand_modifier modifier,
return target; 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. /* expand_expr: generate code for computing expression EXP.
An rtx for the computed value is returned. The value is never null. An rtx for the computed value is returned. The value is never null.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment