expr.c (get_def_for_expr): Move it up in the file.
authorAdam Nemet <anemet@caviumnetworks.com>
Wed, 6 May 2009 20:46:25 +0000 (20:46 +0000)
committerAdam Nemet <nemet@gcc.gnu.org>
Wed, 6 May 2009 20:46:25 +0000 (20:46 +0000)
* 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

gcc/ChangeLog
gcc/expr.c

index ab7cc07ca2e3130c0ac420b46f1b3dd0de0fc219..b717be6f384efeb040a9997982b090c831755769 100644 (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
index 3c800dd77be576340dbd82bbdc0648db97d5c1fc..aca8c578c8e20fcd37ba9e643191047dbf40b778 100644 (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;
+}
 \f
 
 /* 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.