This corresponds to:
  [PATCH 85/89] Concretize gimple_assign_nontemporal_move_p
  https://gcc.gnu.org/ml/gcc-patches/2014-04/msg01202.html
from the original 89-patch kit

That earlier patch was approved by Jeff:
> OK when prereqs have gone in.
in https://gcc.gnu.org/ml/gcc-patches/2014-05/msg00853.html

gcc/
        * gimple.h (gimple_assign_nontemporal_move_p): Require a
        const_gimple_assign rather than a const_gimple.

        * cfgexpand.c (expand_gimple_stmt_1): Add local assign_stmt and
        checked cast within "case GIMPLE_ASSIGN".

        * gimple-streamer-out.c (output_gimple_stmt): Add checked cast to
        gimple_assign.
---
 gcc/ChangeLog.gimple-classes | 13 +++++++++++++
 gcc/cfgexpand.c              | 18 ++++++++++--------
 gcc/gimple-streamer-out.c    |  5 ++++-
 gcc/gimple.h                 |  3 +--
 4 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/gcc/ChangeLog.gimple-classes b/gcc/ChangeLog.gimple-classes
index e064bcf..572fe5a 100644
--- a/gcc/ChangeLog.gimple-classes
+++ b/gcc/ChangeLog.gimple-classes
@@ -1,5 +1,18 @@
 2014-10-24  David Malcolm  <dmalc...@redhat.com>
 
+       Concretize gimple_assign_nontemporal_move_p
+
+       * gimple.h (gimple_assign_nontemporal_move_p): Require a
+       const_gimple_assign rather than a const_gimple.
+
+       * cfgexpand.c (expand_gimple_stmt_1): Add local assign_stmt and
+       checked cast within "case GIMPLE_ASSIGN".
+
+       * gimple-streamer-out.c (output_gimple_stmt): Add checked cast to
+       gimple_assign.
+
+2014-10-24  David Malcolm  <dmalc...@redhat.com>
+
        Concretize gimple_call_arg_flags
 
        * gimple.h (gimple_call_arg_flags): Require a const_gimple_call
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 65de5b2..88bcd72 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -3251,7 +3251,8 @@ expand_gimple_stmt_1 (gimple stmt)
 
     case GIMPLE_ASSIGN:
       {
-       tree lhs = gimple_assign_lhs (stmt);
+       gimple_assign assign_stmt = as_a <gimple_assign> (stmt);
+       tree lhs = gimple_assign_lhs (assign_stmt);
 
        /* Tree expand used to fiddle with |= and &= of two bitfield
           COMPONENT_REFs here.  This can't happen with gimple, the LHS
@@ -3261,7 +3262,7 @@ expand_gimple_stmt_1 (gimple stmt)
            || get_gimple_rhs_class (gimple_expr_code (stmt))
               == GIMPLE_SINGLE_RHS)
          {
-           tree rhs = gimple_assign_rhs1 (stmt);
+           tree rhs = gimple_assign_rhs1 (assign_stmt);
            gcc_assert (get_gimple_rhs_class (gimple_expr_code (stmt))
                        == GIMPLE_SINGLE_RHS);
            if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs))
@@ -3272,12 +3273,13 @@ expand_gimple_stmt_1 (gimple stmt)
              ;
            else
              expand_assignment (lhs, rhs,
-                                gimple_assign_nontemporal_move_p (stmt));
+                                gimple_assign_nontemporal_move_p (
+                                  assign_stmt));
          }
        else
          {
            rtx target, temp;
-           bool nontemporal = gimple_assign_nontemporal_move_p (stmt);
+           bool nontemporal = gimple_assign_nontemporal_move_p (assign_stmt);
            struct separate_ops ops;
            bool promoted = false;
 
@@ -3285,18 +3287,18 @@ expand_gimple_stmt_1 (gimple stmt)
            if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
              promoted = true;
 
-           ops.code = gimple_assign_rhs_code (stmt);
+           ops.code = gimple_assign_rhs_code (assign_stmt);
            ops.type = TREE_TYPE (lhs);
            switch (get_gimple_rhs_class (gimple_expr_code (stmt)))
              {
                case GIMPLE_TERNARY_RHS:
-                 ops.op2 = gimple_assign_rhs3 (stmt);
+                 ops.op2 = gimple_assign_rhs3 (assign_stmt);
                  /* Fallthru */
                case GIMPLE_BINARY_RHS:
-                 ops.op1 = gimple_assign_rhs2 (stmt);
+                 ops.op1 = gimple_assign_rhs2 (assign_stmt);
                  /* Fallthru */
                case GIMPLE_UNARY_RHS:
-                 ops.op0 = gimple_assign_rhs1 (stmt);
+                 ops.op0 = gimple_assign_rhs1 (assign_stmt);
                  break;
                default:
                  gcc_unreachable ();
diff --git a/gcc/gimple-streamer-out.c b/gcc/gimple-streamer-out.c
index 71def75..e429b31 100644
--- a/gcc/gimple-streamer-out.c
+++ b/gcc/gimple-streamer-out.c
@@ -80,7 +80,10 @@ output_gimple_stmt (struct output_block *ob, gimple stmt)
   bp_pack_var_len_unsigned (&bp, gimple_num_ops (stmt));
   bp_pack_value (&bp, gimple_no_warning_p (stmt), 1);
   if (is_gimple_assign (stmt))
-    bp_pack_value (&bp, gimple_assign_nontemporal_move_p (stmt), 1);
+    bp_pack_value (&bp,
+                  gimple_assign_nontemporal_move_p (
+                    as_a <gimple_assign> (stmt)),
+                  1);
   bp_pack_value (&bp, gimple_has_volatile_ops (stmt), 1);
   hist = gimple_histogram_value (cfun, stmt);
   bp_pack_value (&bp, hist != NULL, 1);
diff --git a/gcc/gimple.h b/gcc/gimple.h
index a396ec3..5570c54 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -2426,9 +2426,8 @@ gimple_assign_set_rhs_with_ops (gimple_stmt_iterator 
*gsi, enum tree_code code,
 /* Returns true if GS is a nontemporal move.  */
 
 static inline bool
-gimple_assign_nontemporal_move_p (const_gimple gs)
+gimple_assign_nontemporal_move_p (const_gimple_assign gs)
 {
-  GIMPLE_CHECK (gs, GIMPLE_ASSIGN);
   return gs->nontemporal_move;
 }
 
-- 
1.8.5.3

Reply via email to