This corresponds to:
  [PATCH 23/89] Introduce gimple_asm
  https://gcc.gnu.org/ml/gcc-patches/2014-04/msg01234.html
from the original 89-patch kit

That earlier patch was approved by Jeff:
> OK after fixing up the naming/const stuff as discussed for prior
> patches.
> That applies to 22-30. Make sure to take care of
> the pretty printers per Trevor's comments as well. He indicated those
> were missing in a couple of those patches.
in https://gcc.gnu.org/ml/gcc-patches/2014-05/msg00628.html

gcc/
        * coretypes.h (gimple_asm): New typedef.
        (const_gimple_asm): New typedef.

        * gimple.h (gimple_build_asm_vec): Return a gimple_asm rather than
        just a gimple.
        (gimple_asm_clobbers_memory_p): Require a const_gimple_asm rather
        than just a const_gimple.
        (gimple_asm_ninputs): Likewise.
        (gimple_asm_noutputs): Likewise.
        (gimple_asm_nclobbers): Likewise.
        (gimple_asm_nlabels): Likewise.
        (gimple_asm_input_op): Likewise.
        (gimple_asm_input_op_ptr): Likewise.
        (gimple_asm_output_op): Likewise.
        (gimple_asm_output_op_ptr): Likewise.
        (gimple_asm_clobber_op): Likewise.
        (gimple_asm_label_op): Likewise.
        (gimple_asm_string): Likewise.
        (gimple_asm_volatile_p): Likewise.
        (gimple_asm_input_p): Likewise.
        (gimple_asm_set_input_op): Require a gimple_asm rather than a plain
        gimple.
        (gimple_asm_set_output_op): Likewise.
        (gimple_asm_set_clobber_op): Likewise.
        (gimple_asm_set_label_op): Likewise.
        (gimple_asm_set_volatile): Likewise.
        (gimple_asm_set_input): Likewise.

        * cfgexpand.c (expand_asm_stmt): Require a gimple_asm rather than
        a plain gimple.
        (expand_gimple_stmt_1): Add checked cast to gimple_asm within
        GIMPLE_ASM case of switch statement.

        * gimple-fold.c (fold_stmt_1): Add new local from checked cast to
        gimple_asm within case GIMPLE_ASM.

        * gimple-pretty-print.c (dump_gimple_asm): Require a gimple_asm
        rather than a plain gimple.
        (pp_gimple_stmt_1): Add checked cast to gimple_asm within
        GIMPLE_ASM case of switch statement.

        * gimple-streamer-in.c (input_gimple_stmt): Rework existing
        checked cast to gimple_asm; add a new one.

        * gimple-streamer-out.c (output_gimple_stmt): Add new local from
        checked cast to gimple_asm within case GIMPLE_ASM.

        * gimple-walk.c (walk_gimple_asm): Require a gimple_asm rather
        than a plain gimple.
        (walk_gimple_op): Add checked cast to gimple_asm within GIMPLE_ASM
        case of switch statement.
        (walk_stmt_load_store_addr_ops): Use dyn_cast<gimple_asm> in place
        of a code check against GIMPLE_ASM to introduce a new gimple_asm
        local.

        * gimple.c (gimple_build_asm_1): Return a gimple_asm rather than
        a plain gimple.
        (gimple_build_asm_vec): Likewise.
        (gimple_has_side_effects): Add a checked cast to gimple_asm.
        (gimple_could_trap_p_1): Likewise.
        (gimple_call_builtin_p): Require a const_gimple_asm rather then
        a const_gimple.

        * gimplify-me.c (gimple_regimplify_operands): Add a checked cast
        and a new local of type gimple_asm within GIMPLE_ASM case.

        * gimplify.c (gimplify_asm_expr): Convert a local from gimple to
        gimple_asm.

        * ipa-pure-const.c (check_stmt): Add checked casts within
        GIMPLE_ASM case.

        * ssa-iterators.h (op_iter_init): Likewise.

        * tree-cfg.c (make_goto_expr_edges): Convert a local from gimple
        to gimple_asm.
        (cleanup_dead_labels): Add a checked cast and a new local of type
        gimple_asm within GIMPLE_ASM case.
        (gimple_redirect_edge_and_branch): Likewise.
        (is_ctrl_altering_stmt): Add a checked cast.
        (need_fake_edge_p): Replace a code check against GIMPLE_ASM with a
        dyn_cast<gimple_asm>.

        * tree-complex.c (expand_complex_comparison): Convert a local from
        gimple to gimple_asm.

        * tree-data-ref.c (get_references_in_stmt): Add a checked cast to
        gimple_asm.

        * tree-eh.c (stmt_could_throw_p): Likewise.

        * tree-inline.c (estimate_num_insns): Likewise.

        * tree-sra.c (scan_function): Add a checked cast and a new local
        of type gimple_asm within GIMPLE_ASM case.
        (sra_modify_function_body): Likewise.
        (ipa_sra_modify_function_body): Likewise.

        * tree-ssa-coalesce.c (create_outofssa_var_map): Likewise.

        * tree-ssa-dce.c (propagate_necessity): Replace a code check
        against GIMPLE_ASM with a dyn_cast<gimple_asm>.

        * tree-ssa-operands.c (maybe_add_call_vops): Require a gimple_asm
        rather than a plain gimple.
        (parse_ssa_operands): Add a checked cast to gimple_asm.

        * tree-ssa-structalias.c (find_func_aliases): Replace a check for
        GIMPLE_ASM with a dyn_cast<gimple_asm>, introducing  a new local
        "asm_stmt", using it in place of "t" for typesafety.

        * tree-ssa-threadedge.c
        (record_temporary_equivalences_from_stmts_at_dest): Add a checked
        cast to gimple_asm.

        * tree-ssa.c (execute_update_addresses_taken): Add checked casts
        and new locals of type gimple_asm within clauses guarded by code
        check.
---
 gcc/ChangeLog.gimple-classes | 123 ++++++++++++++++++++++++++++++++++++
 gcc/cfgexpand.c              |   4 +-
 gcc/coretypes.h              |   4 ++
 gcc/gimple-fold.c            |  20 +++---
 gcc/gimple-pretty-print.c    |   4 +-
 gcc/gimple-streamer-in.c     |   5 +-
 gcc/gimple-streamer-out.c    |  15 +++--
 gcc/gimple-walk.c            |  16 ++---
 gcc/gimple.c                 |  14 ++---
 gcc/gimple.h                 | 146 +++++++++++++++++--------------------------
 gcc/gimplify-me.c            |   9 +--
 gcc/gimplify.c               |   2 +-
 gcc/ipa-pure-const.c         |   4 +-
 gcc/ssa-iterators.h          |   2 +-
 gcc/tree-cfg.c               |  20 +++---
 gcc/tree-complex.c           |   2 +-
 gcc/tree-data-ref.c          |   3 +-
 gcc/tree-eh.c                |   2 +-
 gcc/tree-inline.c            |   3 +-
 gcc/tree-sra.c               |  77 +++++++++++++----------
 gcc/tree-ssa-coalesce.c      |   9 +--
 gcc/tree-ssa-dce.c           |   6 +-
 gcc/tree-ssa-operands.c      |   4 +-
 gcc/tree-ssa-structalias.c   |  10 +--
 gcc/tree-ssa-threadedge.c    |   3 +-
 gcc/tree-ssa.c               |  18 +++---
 26 files changed, 323 insertions(+), 202 deletions(-)

diff --git a/gcc/ChangeLog.gimple-classes b/gcc/ChangeLog.gimple-classes
index bba6c7d..bd88371 100644
--- a/gcc/ChangeLog.gimple-classes
+++ b/gcc/ChangeLog.gimple-classes
@@ -1,5 +1,128 @@
 2014-10-24  David Malcolm  <dmalc...@redhat.com>
 
+       Introduce gimple_asm
+
+       * coretypes.h (gimple_asm): New typedef.
+       (const_gimple_asm): New typedef.
+
+       * gimple.h (gimple_build_asm_vec): Return a gimple_asm rather than
+       just a gimple.
+       (gimple_asm_clobbers_memory_p): Require a const_gimple_asm rather
+       than just a const_gimple.
+       (gimple_asm_ninputs): Likewise.
+       (gimple_asm_noutputs): Likewise.
+       (gimple_asm_nclobbers): Likewise.
+       (gimple_asm_nlabels): Likewise.
+       (gimple_asm_input_op): Likewise.
+       (gimple_asm_input_op_ptr): Likewise.
+       (gimple_asm_output_op): Likewise.
+       (gimple_asm_output_op_ptr): Likewise.
+       (gimple_asm_clobber_op): Likewise.
+       (gimple_asm_label_op): Likewise.
+       (gimple_asm_string): Likewise.
+       (gimple_asm_volatile_p): Likewise.
+       (gimple_asm_input_p): Likewise.
+       (gimple_asm_set_input_op): Require a gimple_asm rather than a plain
+       gimple.
+       (gimple_asm_set_output_op): Likewise.
+       (gimple_asm_set_clobber_op): Likewise.
+       (gimple_asm_set_label_op): Likewise.
+       (gimple_asm_set_volatile): Likewise.
+       (gimple_asm_set_input): Likewise.
+
+       * cfgexpand.c (expand_asm_stmt): Require a gimple_asm rather than
+       a plain gimple.
+       (expand_gimple_stmt_1): Add checked cast to gimple_asm within
+       GIMPLE_ASM case of switch statement.
+
+       * gimple-fold.c (fold_stmt_1): Add new local from checked cast to
+       gimple_asm within case GIMPLE_ASM.
+
+       * gimple-pretty-print.c (dump_gimple_asm): Require a gimple_asm
+       rather than a plain gimple.
+       (pp_gimple_stmt_1): Add checked cast to gimple_asm within
+       GIMPLE_ASM case of switch statement.
+
+       * gimple-streamer-in.c (input_gimple_stmt): Rework existing
+       checked cast to gimple_asm; add a new one.
+
+       * gimple-streamer-out.c (output_gimple_stmt): Add new local from
+       checked cast to gimple_asm within case GIMPLE_ASM.
+
+       * gimple-walk.c (walk_gimple_asm): Require a gimple_asm rather
+       than a plain gimple.
+       (walk_gimple_op): Add checked cast to gimple_asm within GIMPLE_ASM
+       case of switch statement.
+       (walk_stmt_load_store_addr_ops): Use dyn_cast<gimple_asm> in place
+       of a code check against GIMPLE_ASM to introduce a new gimple_asm
+       local.
+
+       * gimple.c (gimple_build_asm_1): Return a gimple_asm rather than
+       a plain gimple.
+       (gimple_build_asm_vec): Likewise.
+       (gimple_has_side_effects): Add a checked cast to gimple_asm.
+       (gimple_could_trap_p_1): Likewise.
+       (gimple_call_builtin_p): Require a const_gimple_asm rather then
+       a const_gimple.
+
+       * gimplify-me.c (gimple_regimplify_operands): Add a checked cast
+       and a new local of type gimple_asm within GIMPLE_ASM case.
+
+       * gimplify.c (gimplify_asm_expr): Convert a local from gimple to
+       gimple_asm.
+
+       * ipa-pure-const.c (check_stmt): Add checked casts within
+       GIMPLE_ASM case.
+
+       * ssa-iterators.h (op_iter_init): Likewise.
+
+       * tree-cfg.c (make_goto_expr_edges): Convert a local from gimple
+       to gimple_asm.
+       (cleanup_dead_labels): Add a checked cast and a new local of type
+       gimple_asm within GIMPLE_ASM case.
+       (gimple_redirect_edge_and_branch): Likewise.
+       (is_ctrl_altering_stmt): Add a checked cast.
+       (need_fake_edge_p): Replace a code check against GIMPLE_ASM with a
+       dyn_cast<gimple_asm>.
+
+       * tree-complex.c (expand_complex_comparison): Convert a local from
+       gimple to gimple_asm.
+
+       * tree-data-ref.c (get_references_in_stmt): Add a checked cast to
+       gimple_asm.
+
+       * tree-eh.c (stmt_could_throw_p): Likewise.
+
+       * tree-inline.c (estimate_num_insns): Likewise.
+
+       * tree-sra.c (scan_function): Add a checked cast and a new local
+       of type gimple_asm within GIMPLE_ASM case.
+       (sra_modify_function_body): Likewise.
+       (ipa_sra_modify_function_body): Likewise.
+
+       * tree-ssa-coalesce.c (create_outofssa_var_map): Likewise.
+
+       * tree-ssa-dce.c (propagate_necessity): Replace a code check
+       against GIMPLE_ASM with a dyn_cast<gimple_asm>.
+
+       * tree-ssa-operands.c (maybe_add_call_vops): Require a gimple_asm
+       rather than a plain gimple.
+       (parse_ssa_operands): Add a checked cast to gimple_asm.
+
+       * tree-ssa-structalias.c (find_func_aliases): Replace a check for
+       GIMPLE_ASM with a dyn_cast<gimple_asm>, introducing  a new local
+       "asm_stmt", using it in place of "t" for typesafety.
+
+       * tree-ssa-threadedge.c
+       (record_temporary_equivalences_from_stmts_at_dest): Add a checked
+       cast to gimple_asm.
+
+       * tree-ssa.c (execute_update_addresses_taken): Add checked casts
+       and new locals of type gimple_asm within clauses guarded by code
+       check.
+
+2014-10-24  David Malcolm  <dmalc...@redhat.com>
+
        Introduce gimple_goto
 
        * coretypes.h (gimple_goto): New typedef.
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index e656ed5..d93c888 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -2927,7 +2927,7 @@ expand_asm_operands (tree string, tree outputs, tree 
inputs,
 
 
 static void
-expand_asm_stmt (gimple stmt)
+expand_asm_stmt (gimple_asm stmt)
 {
   int noutputs;
   tree outputs, tail, t;
@@ -3212,7 +3212,7 @@ expand_gimple_stmt_1 (gimple stmt)
       expand_case (as_a <gimple_switch> (stmt));
       break;
     case GIMPLE_ASM:
-      expand_asm_stmt (stmt);
+      expand_asm_stmt (as_a <gimple_asm> (stmt));
       break;
     case GIMPLE_CALL:
       expand_call_stmt (as_a <gimple_call> (stmt));
diff --git a/gcc/coretypes.h b/gcc/coretypes.h
index 653343a..98636bb 100644
--- a/gcc/coretypes.h
+++ b/gcc/coretypes.h
@@ -114,6 +114,10 @@ struct gimple_statement_assign;
 typedef struct gimple_statement_assign *gimple_assign;
 typedef const struct gimple_statement_assign *const_gimple_assign;
 
+struct gimple_statement_asm;
+typedef struct gimple_statement_asm *gimple_asm;
+typedef const struct gimple_statement_asm *const_gimple_asm;
+
 struct gimple_statement_call;
 typedef struct gimple_statement_call *gimple_call;
 typedef const struct gimple_statement_call *const_gimple_call;
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 56b1e5b..c6ba019 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -2855,17 +2855,18 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace)
       }
     case GIMPLE_ASM:
       {
-       for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
+       gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+       for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
          {
-           tree link = gimple_asm_output_op (stmt, i);
+           tree link = gimple_asm_output_op (asm_stmt, i);
            tree op = TREE_VALUE (link);
            if (REFERENCE_CLASS_P (op)
                && maybe_canonicalize_mem_ref_addr (&TREE_VALUE (link)))
              changed = true;
          }
-       for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
+       for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
          {
-           tree link = gimple_asm_input_op (stmt, i);
+           tree link = gimple_asm_input_op (asm_stmt, i);
            tree op = TREE_VALUE (link);
            if ((REFERENCE_CLASS_P (op)
                 || TREE_CODE (op) == ADDR_EXPR)
@@ -2935,17 +2936,18 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace)
     case GIMPLE_ASM:
       /* Fold *& in asm operands.  */
       {
+       gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
        size_t noutputs;
        const char **oconstraints;
        const char *constraint;
        bool allows_mem, allows_reg;
 
-       noutputs = gimple_asm_noutputs (stmt);
+       noutputs = gimple_asm_noutputs (asm_stmt);
        oconstraints = XALLOCAVEC (const char *, noutputs);
 
-       for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
+       for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
          {
-           tree link = gimple_asm_output_op (stmt, i);
+           tree link = gimple_asm_output_op (asm_stmt, i);
            tree op = TREE_VALUE (link);
            oconstraints[i]
              = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
@@ -2956,9 +2958,9 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace)
                changed = true;
              }
          }
-       for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
+       for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
          {
-           tree link = gimple_asm_input_op (stmt, i);
+           tree link = gimple_asm_input_op (asm_stmt, i);
            tree op = TREE_VALUE (link);
            constraint
              = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c
index 47772d6..d8d7703 100644
--- a/gcc/gimple-pretty-print.c
+++ b/gcc/gimple-pretty-print.c
@@ -1606,7 +1606,7 @@ dump_gimple_transaction (pretty_printer *buffer, gimple 
gs, int spc, int flags)
    dumpfile.h).  */
 
 static void
-dump_gimple_asm (pretty_printer *buffer, gimple gs, int spc, int flags)
+dump_gimple_asm (pretty_printer *buffer, gimple_asm gs, int spc, int flags)
 {
   unsigned int i, n, f, fields;
 
@@ -2085,7 +2085,7 @@ pp_gimple_stmt_1 (pretty_printer *buffer, gimple gs, int 
spc, int flags)
   switch (gimple_code (gs))
     {
     case GIMPLE_ASM:
-      dump_gimple_asm (buffer, gs, spc, flags);
+      dump_gimple_asm (buffer, as_a <gimple_asm> (gs), spc, flags);
       break;
 
     case GIMPLE_ASSIGN:
diff --git a/gcc/gimple-streamer-in.c b/gcc/gimple-streamer-in.c
index 2741ea7..c297ec3 100644
--- a/gcc/gimple-streamer-in.c
+++ b/gcc/gimple-streamer-in.c
@@ -218,11 +218,12 @@ input_gimple_stmt (struct lto_input_block *ib, struct 
data_in *data_in,
     }
   else if (code == GIMPLE_ASM)
     {
+      gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
       unsigned i;
 
-      for (i = 0; i < gimple_asm_noutputs (stmt); i++)
+      for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
        {
-         tree op = TREE_VALUE (gimple_asm_output_op (stmt, i));
+         tree op = TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
          if (TREE_CODE (op) == SSA_NAME)
            SSA_NAME_DEF_STMT (op) = stmt;
        }
diff --git a/gcc/gimple-streamer-out.c b/gcc/gimple-streamer-out.c
index 85a7966..77fc3fa 100644
--- a/gcc/gimple-streamer-out.c
+++ b/gcc/gimple-streamer-out.c
@@ -109,12 +109,15 @@ output_gimple_stmt (struct output_block *ob, gimple stmt)
       break;
 
     case GIMPLE_ASM:
-      streamer_write_uhwi (ob, gimple_asm_ninputs (stmt));
-      streamer_write_uhwi (ob, gimple_asm_noutputs (stmt));
-      streamer_write_uhwi (ob, gimple_asm_nclobbers (stmt));
-      streamer_write_uhwi (ob, gimple_asm_nlabels (stmt));
-      streamer_write_string (ob, ob->main_stream, gimple_asm_string (stmt),
-                            true);
+      {
+       gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+       streamer_write_uhwi (ob, gimple_asm_ninputs (asm_stmt));
+       streamer_write_uhwi (ob, gimple_asm_noutputs (asm_stmt));
+       streamer_write_uhwi (ob, gimple_asm_nclobbers (asm_stmt));
+       streamer_write_uhwi (ob, gimple_asm_nlabels (asm_stmt));
+       streamer_write_string (ob, ob->main_stream,
+                              gimple_asm_string (asm_stmt), true);
+      }
       /* Fallthru  */
 
     case GIMPLE_ASSIGN:
diff --git a/gcc/gimple-walk.c b/gcc/gimple-walk.c
index 661a69e..40d2145 100644
--- a/gcc/gimple-walk.c
+++ b/gcc/gimple-walk.c
@@ -94,7 +94,7 @@ walk_gimple_seq (gimple_seq seq, walk_stmt_fn callback_stmt,
 /* Helper function for walk_gimple_stmt.  Walk operands of a GIMPLE_ASM.  */
 
 static tree
-walk_gimple_asm (gimple stmt, walk_tree_fn callback_op,
+walk_gimple_asm (gimple_asm stmt, walk_tree_fn callback_op,
                 struct walk_stmt_info *wi)
 {
   tree ret, op;
@@ -292,7 +292,7 @@ walk_gimple_op (gimple stmt, walk_tree_fn callback_op,
       break;
 
     case GIMPLE_ASM:
-      ret = walk_gimple_asm (stmt, callback_op, wi);
+      ret = walk_gimple_asm (as_a <gimple_asm> (stmt), callback_op, wi);
       if (ret)
        return ret;
       break;
@@ -779,18 +779,18 @@ walk_stmt_load_store_addr_ops (gimple stmt, void *data,
        ret |= visit_addr (stmt, gimple_call_lhs (stmt),
                           gimple_call_lhs (stmt), data);
     }
-  else if (gimple_code (stmt) == GIMPLE_ASM)
+  else if (gimple_asm asm_stmt = dyn_cast <gimple_asm> (stmt))
     {
       unsigned noutputs;
       const char *constraint;
       const char **oconstraints;
       bool allows_mem, allows_reg, is_inout;
-      noutputs = gimple_asm_noutputs (stmt);
+      noutputs = gimple_asm_noutputs (asm_stmt);
       oconstraints = XALLOCAVEC (const char *, noutputs);
       if (visit_store || visit_addr)
-       for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
+       for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
          {
-           tree link = gimple_asm_output_op (stmt, i);
+           tree link = gimple_asm_output_op (asm_stmt, i);
            tree op = get_base_loadstore (TREE_VALUE (link));
            if (op && visit_store)
              ret |= visit_store (stmt, op, TREE_VALUE (link), data);
@@ -806,9 +806,9 @@ walk_stmt_load_store_addr_ops (gimple stmt, void *data,
              }
          }
       if (visit_load || visit_addr)
-       for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
+       for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
          {
-           tree link = gimple_asm_input_op (stmt, i);
+           tree link = gimple_asm_input_op (asm_stmt, i);
            tree op = TREE_VALUE (link);
            if (visit_addr
                && TREE_CODE (op) == ADDR_EXPR)
diff --git a/gcc/gimple.c b/gcc/gimple.c
index 0e5e473..2d86191 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -542,11 +542,11 @@ gimple_build_bind (tree vars, gimple_seq body, tree block)
    NCLOBBERS is the number of clobbered registers.
    */
 
-static inline gimple
+static inline gimple_asm
 gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
                     unsigned nclobbers, unsigned nlabels)
 {
-  gimple_statement_asm *p;
+  gimple_asm p;
   int size = strlen (string);
 
   /* ASMs with labels cannot have outputs.  This should have been
@@ -580,12 +580,12 @@ gimple_build_asm_1 (const char *string, unsigned ninputs, 
unsigned noutputs,
    CLOBBERS is a vector of the clobbered register parameters.
    LABELS is a vector of destination labels.  */
 
-gimple
+gimple_asm
 gimple_build_asm_vec (const char *string, vec<tree, va_gc> *inputs,
                       vec<tree, va_gc> *outputs, vec<tree, va_gc> *clobbers,
                      vec<tree, va_gc> *labels)
 {
-  gimple p;
+  gimple_asm p;
   unsigned i;
 
   p = gimple_build_asm_1 (string,
@@ -1821,7 +1821,7 @@ gimple_has_side_effects (const_gimple s)
     return true;
 
   if (gimple_code (s) == GIMPLE_ASM
-      && gimple_asm_volatile_p (s))
+      && gimple_asm_volatile_p (as_a <const_gimple_asm> (s)))
     return true;
 
   if (is_gimple_call (s))
@@ -1862,7 +1862,7 @@ gimple_could_trap_p_1 (gimple s, bool include_mem, bool 
include_stores)
   switch (gimple_code (s))
     {
     case GIMPLE_ASM:
-      return gimple_asm_volatile_p (s);
+      return gimple_asm_volatile_p (as_a <gimple_asm> (s));
 
     case GIMPLE_CALL:
       t = gimple_call_fndecl (s);
@@ -2477,7 +2477,7 @@ gimple_call_builtin_p (const_gimple stmt, enum 
built_in_function code)
    GIMPLE_ASM.  */
 
 bool
-gimple_asm_clobbers_memory_p (const_gimple stmt)
+gimple_asm_clobbers_memory_p (const_gimple_asm stmt)
 {
   unsigned i;
 
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 128baf5..d2dc7ce 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -1322,9 +1322,9 @@ gimple_label gimple_build_label (tree label);
 gimple_goto gimple_build_goto (tree dest);
 gimple gimple_build_nop (void);
 gimple_bind gimple_build_bind (tree, gimple_seq, tree);
-gimple gimple_build_asm_vec (const char *, vec<tree, va_gc> *,
-                            vec<tree, va_gc> *, vec<tree, va_gc> *,
-                            vec<tree, va_gc> *);
+gimple_asm gimple_build_asm_vec (const char *, vec<tree, va_gc> *,
+                                vec<tree, va_gc> *, vec<tree, va_gc> *,
+                                vec<tree, va_gc> *);
 gimple gimple_build_catch (tree, gimple_seq);
 gimple gimple_build_eh_filter (tree, gimple_seq);
 gimple gimple_build_eh_must_not_throw (tree);
@@ -1401,7 +1401,7 @@ extern bool gimple_builtin_call_types_compatible_p 
(const_gimple, tree);
 extern bool gimple_call_builtin_p (const_gimple);
 extern bool gimple_call_builtin_p (const_gimple, enum built_in_class);
 extern bool gimple_call_builtin_p (const_gimple, enum built_in_function);
-extern bool gimple_asm_clobbers_memory_p (const_gimple);
+extern bool gimple_asm_clobbers_memory_p (const_gimple_asm);
 extern void dump_decl_set (FILE *, bitmap);
 extern bool nonfreeing_call_p (gimple);
 extern bool infer_nonnull_range (gimple, tree, bool, bool);
@@ -3339,218 +3339,188 @@ gimple_bind_set_block (gimple_bind bind_stmt, tree 
block)
 }
 
 
-/* Return the number of input operands for GIMPLE_ASM GS.  */
+/* Return the number of input operands for GIMPLE_ASM ASM_STMT.  */
 
 static inline unsigned
-gimple_asm_ninputs (const_gimple gs)
+gimple_asm_ninputs (const_gimple_asm asm_stmt)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   return asm_stmt->ni;
 }
 
 
-/* Return the number of output operands for GIMPLE_ASM GS.  */
+/* Return the number of output operands for GIMPLE_ASM ASM_STMT.  */
 
 static inline unsigned
-gimple_asm_noutputs (const_gimple gs)
+gimple_asm_noutputs (const_gimple_asm asm_stmt)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   return asm_stmt->no;
 }
 
 
-/* Return the number of clobber operands for GIMPLE_ASM GS.  */
+/* Return the number of clobber operands for GIMPLE_ASM ASM_STMT.  */
 
 static inline unsigned
-gimple_asm_nclobbers (const_gimple gs)
+gimple_asm_nclobbers (const_gimple_asm asm_stmt)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   return asm_stmt->nc;
 }
 
-/* Return the number of label operands for GIMPLE_ASM GS.  */
+/* Return the number of label operands for GIMPLE_ASM ASM_STMT.  */
 
 static inline unsigned
-gimple_asm_nlabels (const_gimple gs)
+gimple_asm_nlabels (const_gimple_asm asm_stmt)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   return asm_stmt->nl;
 }
 
-/* Return input operand INDEX of GIMPLE_ASM GS.  */
+/* Return input operand INDEX of GIMPLE_ASM ASM_STMT.  */
 
 static inline tree
-gimple_asm_input_op (const_gimple gs, unsigned index)
+gimple_asm_input_op (const_gimple_asm asm_stmt, unsigned index)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->ni);
-  return gimple_op (gs, index + asm_stmt->no);
+  return gimple_op (asm_stmt, index + asm_stmt->no);
 }
 
-/* Return a pointer to input operand INDEX of GIMPLE_ASM GS.  */
+/* Return a pointer to input operand INDEX of GIMPLE_ASM ASM_STMT.  */
 
 static inline tree *
-gimple_asm_input_op_ptr (const_gimple gs, unsigned index)
+gimple_asm_input_op_ptr (const_gimple_asm asm_stmt, unsigned index)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->ni);
-  return gimple_op_ptr (gs, index + asm_stmt->no);
+  return gimple_op_ptr (asm_stmt, index + asm_stmt->no);
 }
 
 
-/* Set IN_OP to be input operand INDEX in GIMPLE_ASM GS.  */
+/* Set IN_OP to be input operand INDEX in GIMPLE_ASM ASM_STMT.  */
 
 static inline void
-gimple_asm_set_input_op (gimple gs, unsigned index, tree in_op)
+gimple_asm_set_input_op (gimple_asm asm_stmt, unsigned index, tree in_op)
 {
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->ni
                              && TREE_CODE (in_op) == TREE_LIST);
-  gimple_set_op (gs, index + asm_stmt->no, in_op);
+  gimple_set_op (asm_stmt, index + asm_stmt->no, in_op);
 }
 
 
-/* Return output operand INDEX of GIMPLE_ASM GS.  */
+/* Return output operand INDEX of GIMPLE_ASM ASM_STMT.  */
 
 static inline tree
-gimple_asm_output_op (const_gimple gs, unsigned index)
+gimple_asm_output_op (const_gimple_asm asm_stmt, unsigned index)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->no);
-  return gimple_op (gs, index);
+  return gimple_op (asm_stmt, index);
 }
 
-/* Return a pointer to output operand INDEX of GIMPLE_ASM GS.  */
+/* Return a pointer to output operand INDEX of GIMPLE_ASM ASM_STMT.  */
 
 static inline tree *
-gimple_asm_output_op_ptr (const_gimple gs, unsigned index)
+gimple_asm_output_op_ptr (const_gimple_asm asm_stmt, unsigned index)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->no);
-  return gimple_op_ptr (gs, index);
+  return gimple_op_ptr (asm_stmt, index);
 }
 
 
-/* Set OUT_OP to be output operand INDEX in GIMPLE_ASM GS.  */
+/* Set OUT_OP to be output operand INDEX in GIMPLE_ASM ASM_STMT.  */
 
 static inline void
-gimple_asm_set_output_op (gimple gs, unsigned index, tree out_op)
+gimple_asm_set_output_op (gimple_asm asm_stmt, unsigned index, tree out_op)
 {
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->no
                              && TREE_CODE (out_op) == TREE_LIST);
-  gimple_set_op (gs, index, out_op);
+  gimple_set_op (asm_stmt, index, out_op);
 }
 
 
-/* Return clobber operand INDEX of GIMPLE_ASM GS.  */
+/* Return clobber operand INDEX of GIMPLE_ASM ASM_STMT.  */
 
 static inline tree
-gimple_asm_clobber_op (const_gimple gs, unsigned index)
+gimple_asm_clobber_op (const_gimple_asm asm_stmt, unsigned index)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->nc);
-  return gimple_op (gs, index + asm_stmt->ni + asm_stmt->no);
+  return gimple_op (asm_stmt, index + asm_stmt->ni + asm_stmt->no);
 }
 
 
-/* Set CLOBBER_OP to be clobber operand INDEX in GIMPLE_ASM GS.  */
+/* Set CLOBBER_OP to be clobber operand INDEX in GIMPLE_ASM ASM_STMT.  */
 
 static inline void
-gimple_asm_set_clobber_op (gimple gs, unsigned index, tree clobber_op)
+gimple_asm_set_clobber_op (gimple_asm asm_stmt, unsigned index, tree 
clobber_op)
 {
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->nc
                              && TREE_CODE (clobber_op) == TREE_LIST);
-  gimple_set_op (gs, index + asm_stmt->ni + asm_stmt->no, clobber_op);
+  gimple_set_op (asm_stmt, index + asm_stmt->ni + asm_stmt->no, clobber_op);
 }
 
-/* Return label operand INDEX of GIMPLE_ASM GS.  */
+/* Return label operand INDEX of GIMPLE_ASM ASM_STMT.  */
 
 static inline tree
-gimple_asm_label_op (const_gimple gs, unsigned index)
+gimple_asm_label_op (const_gimple_asm asm_stmt, unsigned index)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->nl);
-  return gimple_op (gs, index + asm_stmt->ni + asm_stmt->nc);
+  return gimple_op (asm_stmt, index + asm_stmt->ni + asm_stmt->nc);
 }
 
-/* Set LABEL_OP to be label operand INDEX in GIMPLE_ASM GS.  */
+/* Set LABEL_OP to be label operand INDEX in GIMPLE_ASM ASM_STMT.  */
 
 static inline void
-gimple_asm_set_label_op (gimple gs, unsigned index, tree label_op)
+gimple_asm_set_label_op (gimple_asm asm_stmt, unsigned index, tree label_op)
 {
-  gimple_statement_asm *asm_stmt = as_a <gimple_statement_asm *> (gs);
   gcc_gimple_checking_assert (index < asm_stmt->nl
                              && TREE_CODE (label_op) == TREE_LIST);
-  gimple_set_op (gs, index + asm_stmt->ni + asm_stmt->nc, label_op);
+  gimple_set_op (asm_stmt, index + asm_stmt->ni + asm_stmt->nc, label_op);
 }
 
 /* Return the string representing the assembly instruction in
-   GIMPLE_ASM GS.  */
+   GIMPLE_ASM ASM_STMT.  */
 
 static inline const char *
-gimple_asm_string (const_gimple gs)
+gimple_asm_string (const_gimple_asm asm_stmt)
 {
-  const gimple_statement_asm *asm_stmt =
-    as_a <const gimple_statement_asm *> (gs);
   return asm_stmt->string;
 }
 
 
-/* Return true if GS is an asm statement marked volatile.  */
+/* Return true ASM_STMT ASM_STMT is an asm statement marked volatile.  */
 
 static inline bool
-gimple_asm_volatile_p (const_gimple gs)
+gimple_asm_volatile_p (const_gimple_asm asm_stmt)
 {
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
-  return (gs->subcode & GF_ASM_VOLATILE) != 0;
+  return (asm_stmt->subcode & GF_ASM_VOLATILE) != 0;
 }
 
 
-/* If VOLATLE_P is true, mark asm statement GS as volatile.  */
+/* If VOLATLE_P is true, mark asm statement ASM_STMT as volatile.  */
 
 static inline void
-gimple_asm_set_volatile (gimple gs, bool volatile_p)
+gimple_asm_set_volatile (gimple_asm asm_stmt, bool volatile_p)
 {
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
   if (volatile_p)
-    gs->subcode |= GF_ASM_VOLATILE;
+    asm_stmt->subcode |= GF_ASM_VOLATILE;
   else
-    gs->subcode &= ~GF_ASM_VOLATILE;
+    asm_stmt->subcode &= ~GF_ASM_VOLATILE;
 }
 
 
-/* If INPUT_P is true, mark asm GS as an ASM_INPUT.  */
+/* If INPUT_P is true, mark asm ASM_STMT as an ASM_INPUT.  */
 
 static inline void
-gimple_asm_set_input (gimple gs, bool input_p)
+gimple_asm_set_input (gimple_asm asm_stmt, bool input_p)
 {
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
   if (input_p)
-    gs->subcode |= GF_ASM_INPUT;
+    asm_stmt->subcode |= GF_ASM_INPUT;
   else
-    gs->subcode &= ~GF_ASM_INPUT;
+    asm_stmt->subcode &= ~GF_ASM_INPUT;
 }
 
 
-/* Return true if asm GS is an ASM_INPUT.  */
+/* Return true if asm ASM_STMT is an ASM_INPUT.  */
 
 static inline bool
-gimple_asm_input_p (const_gimple gs)
+gimple_asm_input_p (const_gimple_asm asm_stmt)
 {
-  GIMPLE_CHECK (gs, GIMPLE_ASM);
-  return (gs->subcode & GF_ASM_INPUT) != 0;
+  return (asm_stmt->subcode & GF_ASM_INPUT) != 0;
 }
 
 
diff --git a/gcc/gimplify-me.c b/gcc/gimplify-me.c
index 05e986a..08d2b9c 100644
--- a/gcc/gimplify-me.c
+++ b/gcc/gimplify-me.c
@@ -183,7 +183,8 @@ gimple_regimplify_operands (gimple stmt, 
gimple_stmt_iterator *gsi_p)
       break;
     case GIMPLE_ASM:
       {
-       size_t i, noutputs = gimple_asm_noutputs (stmt);
+       gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+       size_t i, noutputs = gimple_asm_noutputs (asm_stmt);
        const char *constraint, **oconstraints;
        bool allows_mem, allows_reg, is_inout;
 
@@ -191,7 +192,7 @@ gimple_regimplify_operands (gimple stmt, 
gimple_stmt_iterator *gsi_p)
          = (const char **) alloca ((noutputs) * sizeof (const char *));
        for (i = 0; i < noutputs; i++)
          {
-           tree op = gimple_asm_output_op (stmt, i);
+           tree op = gimple_asm_output_op (asm_stmt, i);
            constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
            oconstraints[i] = constraint;
            parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
@@ -200,9 +201,9 @@ gimple_regimplify_operands (gimple stmt, 
gimple_stmt_iterator *gsi_p)
                           is_inout ? is_gimple_min_lval : is_gimple_lvalue,
                           fb_lvalue | fb_mayfail);
          }
-       for (i = 0; i < gimple_asm_ninputs (stmt); i++)
+       for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
          {
-           tree op = gimple_asm_input_op (stmt, i);
+           tree op = gimple_asm_input_op (asm_stmt, i);
            constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (op)));
            parse_input_constraint (&constraint, 0, 0, noutputs, 0,
                                    oconstraints, &allows_mem, &allows_reg);
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index af64e45..bed3606 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -4918,7 +4918,7 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, 
gimple_seq *post_p)
   const char *constraint;
   bool allows_mem, allows_reg, is_inout;
   enum gimplify_status ret, tret;
-  gimple stmt;
+  gimple_asm stmt;
   vec<tree, va_gc> *inputs;
   vec<tree, va_gc> *outputs;
   vec<tree, va_gc> *clobbers;
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index 6beca09..8375381 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -698,14 +698,14 @@ check_stmt (gimple_stmt_iterator *gsip, funct_state 
local, bool ipa)
        }
       break;
     case GIMPLE_ASM:
-      if (gimple_asm_clobbers_memory_p (stmt))
+      if (gimple_asm_clobbers_memory_p (as_a <gimple_asm> (stmt)))
        {
          if (dump_file)
            fprintf (dump_file, "    memory asm clobber is not const/pure\n");
          /* Abandon all hope, ye who enter here. */
          local->pure_const_state = IPA_NEITHER;
        }
-      if (gimple_asm_volatile_p (stmt))
+      if (gimple_asm_volatile_p (as_a <gimple_asm> (stmt)))
        {
          if (dump_file)
            fprintf (dump_file, "    volatile is not const/pure\n");
diff --git a/gcc/ssa-iterators.h b/gcc/ssa-iterators.h
index 2c75e4a..f332b7c 100644
--- a/gcc/ssa-iterators.h
+++ b/gcc/ssa-iterators.h
@@ -610,7 +610,7 @@ op_iter_init (ssa_op_iter *ptr, gimple stmt, int flags)
            ptr->numops = 1;
            break;
          case GIMPLE_ASM:
-           ptr->numops = gimple_asm_noutputs (stmt);
+           ptr->numops = gimple_asm_noutputs (as_a <gimple_asm> (stmt));
            break;
          default:
            ptr->numops = 0;
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 1652075..8e9262f 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -1247,7 +1247,7 @@ make_goto_expr_edges (basic_block bb)
 static void
 make_gimple_asm_edges (basic_block bb)
 {
-  gimple stmt = last_stmt (bb);
+  gimple_asm stmt = as_a <gimple_asm> (last_stmt (bb));
   int i, n = gimple_asm_nlabels (stmt);
 
   for (i = 0; i < n; ++i)
@@ -1447,11 +1447,12 @@ cleanup_dead_labels (void)
 
        case GIMPLE_ASM:
          {
-           int i, n = gimple_asm_nlabels (stmt);
+           gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+           int i, n = gimple_asm_nlabels (asm_stmt);
 
            for (i = 0; i < n; ++i)
              {
-               tree cons = gimple_asm_label_op (stmt, i);
+               tree cons = gimple_asm_label_op (asm_stmt, i);
                tree label = main_block_label (TREE_VALUE (cons));
                TREE_VALUE (cons) = label;
              }
@@ -2414,7 +2415,7 @@ is_ctrl_altering_stmt (gimple t)
       return true;
 
     case GIMPLE_ASM:
-      if (gimple_asm_nlabels (t) > 0)
+      if (gimple_asm_nlabels (as_a <gimple_asm> (t)) > 0)
        return true;
       break;
 
@@ -5535,12 +5536,13 @@ gimple_redirect_edge_and_branch (edge e, basic_block 
dest)
 
     case GIMPLE_ASM:
       {
-       int i, n = gimple_asm_nlabels (stmt);
+       gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+       int i, n = gimple_asm_nlabels (asm_stmt);
        tree label = NULL;
 
        for (i = 0; i < n; ++i)
          {
-           tree cons = gimple_asm_label_op (stmt, i);
+           tree cons = gimple_asm_label_op (asm_stmt, i);
            if (label_to_block (TREE_VALUE (cons)) == e->dest)
              {
                if (!label)
@@ -7567,9 +7569,9 @@ need_fake_edge_p (gimple t)
          return true;
     }
 
-  if (gimple_code (t) == GIMPLE_ASM
-       && (gimple_asm_volatile_p (t) || gimple_asm_input_p (t)))
-    return true;
+  if (gimple_asm asm_stmt = dyn_cast <gimple_asm> (t))
+    if (gimple_asm_volatile_p (asm_stmt) || gimple_asm_input_p (asm_stmt))
+      return true;
 
   return false;
 }
diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c
index c259504..d2b4f01 100644
--- a/gcc/tree-complex.c
+++ b/gcc/tree-complex.c
@@ -1419,7 +1419,7 @@ expand_complex_comparison (gimple_stmt_iterator *gsi, 
tree ar, tree ai,
 static void
 expand_complex_asm (gimple_stmt_iterator *gsi)
 {
-  gimple stmt = gsi_stmt (*gsi);
+  gimple_asm stmt = as_a <gimple_asm> (gsi_stmt (*gsi));
   unsigned int i;
 
   for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index 89aeb30..9bd3c17 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -4388,7 +4388,8 @@ get_references_in_stmt (gimple stmt, vec<data_ref_loc, 
va_heap> *references)
        clobbers_memory = true;
     }
   else if (stmt_code == GIMPLE_ASM
-          && (gimple_asm_volatile_p (stmt) || gimple_vuse (stmt)))
+          && (gimple_asm_volatile_p (as_a <gimple_asm> (stmt))
+              || gimple_vuse (stmt)))
     clobbers_memory = true;
 
   if (!gimple_vuse (stmt))
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index df3f613..9769225 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -2773,7 +2773,7 @@ stmt_could_throw_p (gimple stmt)
     case GIMPLE_ASM:
       if (!cfun->can_throw_non_call_exceptions)
         return false;
-      return gimple_asm_volatile_p (stmt);
+      return gimple_asm_volatile_p (as_a <gimple_asm> (stmt));
 
     default:
       return false;
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 15b2cdd..2c7d6b7 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -3944,7 +3944,8 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
 
     case GIMPLE_ASM:
       {
-       int count = asm_str_count (gimple_asm_string (stmt));
+       int count =
+         asm_str_count (gimple_asm_string (as_a <gimple_asm> (stmt)));
        /* 1000 means infinity. This avoids overflows later
           with very long asm statements.  */
        if (count > 1000)
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index fb24114..67c4247 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1325,21 +1325,24 @@ scan_function (void)
              break;
 
            case GIMPLE_ASM:
-             walk_stmt_load_store_addr_ops (stmt, NULL, NULL, NULL,
-                                            asm_visit_addr);
-             if (final_bbs)
-               bitmap_set_bit (final_bbs, bb->index);
+             {
+               gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+               walk_stmt_load_store_addr_ops (asm_stmt, NULL, NULL, NULL,
+                                              asm_visit_addr);
+               if (final_bbs)
+                 bitmap_set_bit (final_bbs, bb->index);
 
-             for (i = 0; i < gimple_asm_ninputs (stmt); i++)
-               {
-                 t = TREE_VALUE (gimple_asm_input_op (stmt, i));
-                 ret |= build_access_from_expr (t, stmt, false);
-               }
-             for (i = 0; i < gimple_asm_noutputs (stmt); i++)
-               {
-                 t = TREE_VALUE (gimple_asm_output_op (stmt, i));
-                 ret |= build_access_from_expr (t, stmt, true);
-               }
+               for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
+                 {
+                   t = TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
+                   ret |= build_access_from_expr (t, asm_stmt, false);
+                 }
+               for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
+                 {
+                   t = TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
+                   ret |= build_access_from_expr (t, asm_stmt, true);
+                 }
+             }
              break;
 
            default:
@@ -3411,16 +3414,19 @@ sra_modify_function_body (void)
              break;
 
            case GIMPLE_ASM:
-             for (i = 0; i < gimple_asm_ninputs (stmt); i++)
-               {
-                 t = &TREE_VALUE (gimple_asm_input_op (stmt, i));
-                 modified |= sra_modify_expr (t, &gsi, false);
-               }
-             for (i = 0; i < gimple_asm_noutputs (stmt); i++)
-               {
-                 t = &TREE_VALUE (gimple_asm_output_op (stmt, i));
-                 modified |= sra_modify_expr (t, &gsi, true);
-               }
+             {
+               gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+               for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
+                 {
+                   t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
+                   modified |= sra_modify_expr (t, &gsi, false);
+                 }
+               for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
+                 {
+                   t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
+                   modified |= sra_modify_expr (t, &gsi, true);
+                 }
+             }
              break;
 
            default:
@@ -4672,16 +4678,19 @@ ipa_sra_modify_function_body (ipa_parm_adjustment_vec 
adjustments)
              break;
 
            case GIMPLE_ASM:
-             for (i = 0; i < gimple_asm_ninputs (stmt); i++)
-               {
-                 t = &TREE_VALUE (gimple_asm_input_op (stmt, i));
-                 modified |= ipa_modify_expr (t, true, adjustments);
-               }
-             for (i = 0; i < gimple_asm_noutputs (stmt); i++)
-               {
-                 t = &TREE_VALUE (gimple_asm_output_op (stmt, i));
-                 modified |= ipa_modify_expr (t, false, adjustments);
-               }
+             {
+               gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+               for (i = 0; i < gimple_asm_ninputs (asm_stmt); i++)
+                 {
+                   t = &TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
+                   modified |= ipa_modify_expr (t, true, adjustments);
+                 }
+               for (i = 0; i < gimple_asm_noutputs (asm_stmt); i++)
+                 {
+                   t = &TREE_VALUE (gimple_asm_output_op (asm_stmt, i));
+                   modified |= ipa_modify_expr (t, false, adjustments);
+                 }
+             }
              break;
 
            default:
diff --git a/gcc/tree-ssa-coalesce.c b/gcc/tree-ssa-coalesce.c
index e4e2201..f043096 100644
--- a/gcc/tree-ssa-coalesce.c
+++ b/gcc/tree-ssa-coalesce.c
@@ -1008,15 +1008,16 @@ create_outofssa_var_map (coalesce_list_p cl, bitmap 
used_in_copy)
 
            case GIMPLE_ASM:
              {
+               gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
                unsigned long noutputs, i;
                unsigned long ninputs;
                tree *outputs, link;
-               noutputs = gimple_asm_noutputs (stmt);
-               ninputs = gimple_asm_ninputs (stmt);
+               noutputs = gimple_asm_noutputs (asm_stmt);
+               ninputs = gimple_asm_ninputs (asm_stmt);
                outputs = (tree *) alloca (noutputs * sizeof (tree));
                for (i = 0; i < noutputs; ++i)
                  {
-                   link = gimple_asm_output_op (stmt, i);
+                   link = gimple_asm_output_op (asm_stmt, i);
                    outputs[i] = TREE_VALUE (link);
                  }
 
@@ -1027,7 +1028,7 @@ create_outofssa_var_map (coalesce_list_p cl, bitmap 
used_in_copy)
                    char *end;
                    unsigned long match;
 
-                   link = gimple_asm_input_op (stmt, i);
+                   link = gimple_asm_input_op (asm_stmt, i);
                    constraint
                      = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
                    input = TREE_VALUE (link);
diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c
index f95c0ea..8e8cd57 100644
--- a/gcc/tree-ssa-dce.c
+++ b/gcc/tree-ssa-dce.c
@@ -882,14 +882,14 @@ propagate_necessity (bool aggressive)
                    mark_all_reaching_defs_necessary (stmt);
                }
            }
-         else if (gimple_code (stmt) == GIMPLE_ASM)
+         else if (gimple_asm asm_stmt = dyn_cast <gimple_asm> (stmt))
            {
              unsigned i;
              mark_all_reaching_defs_necessary (stmt);
              /* Inputs may perform loads.  */
-             for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
+             for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
                {
-                 tree op = TREE_VALUE (gimple_asm_input_op (stmt, i));
+                 tree op = TREE_VALUE (gimple_asm_input_op (asm_stmt, i));
                  if (TREE_CODE (op) != SSA_NAME
                      && !is_gimple_min_invariant (op)
                      && TREE_CODE (op) != CONSTRUCTOR
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 1e59b76..5f20c66 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -655,7 +655,7 @@ maybe_add_call_vops (struct function *fn, gimple_call stmt)
 /* Scan operands in the ASM_EXPR stmt referred to in INFO.  */
 
 static void
-get_asm_stmt_operands (struct function *fn, gimple stmt)
+get_asm_stmt_operands (struct function *fn, gimple_asm stmt)
 {
   size_t i, noutputs;
   const char **oconstraints;
@@ -909,7 +909,7 @@ parse_ssa_operands (struct function *fn, gimple stmt)
   switch (code)
     {
     case GIMPLE_ASM:
-      get_asm_stmt_operands (fn, stmt);
+      get_asm_stmt_operands (fn, as_a <gimple_asm> (stmt));
       break;
 
     case GIMPLE_TRANSACTION:
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 4bde124..a130268 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -4752,19 +4752,19 @@ find_func_aliases (struct function *fn, gimple origt)
        }
     }
   /* Handle asms conservatively by adding escape constraints to everything.  */
-  else if (gimple_code (t) == GIMPLE_ASM)
+  else if (gimple_asm asm_stmt = dyn_cast <gimple_asm> (t))
     {
       unsigned i, noutputs;
       const char **oconstraints;
       const char *constraint;
       bool allows_mem, allows_reg, is_inout;
 
-      noutputs = gimple_asm_noutputs (t);
+      noutputs = gimple_asm_noutputs (asm_stmt);
       oconstraints = XALLOCAVEC (const char *, noutputs);
 
       for (i = 0; i < noutputs; ++i)
        {
-         tree link = gimple_asm_output_op (t, i);
+         tree link = gimple_asm_output_op (asm_stmt, i);
          tree op = TREE_VALUE (link);
 
          constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
@@ -4791,9 +4791,9 @@ find_func_aliases (struct function *fn, gimple origt)
                process_constraint (new_constraint (*lhsp, rhsc));
            }
        }
-      for (i = 0; i < gimple_asm_ninputs (t); ++i)
+      for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
        {
-         tree link = gimple_asm_input_op (t, i);
+         tree link = gimple_asm_input_op (asm_stmt, i);
          tree op = TREE_VALUE (link);
 
          constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
diff --git a/gcc/tree-ssa-threadedge.c b/gcc/tree-ssa-threadedge.c
index 45083df..50cc729 100644
--- a/gcc/tree-ssa-threadedge.c
+++ b/gcc/tree-ssa-threadedge.c
@@ -345,7 +345,8 @@ record_temporary_equivalences_from_stmts_at_dest (edge e,
       /* If the statement has volatile operands, then we assume we
         can not thread through this block.  This is overly
         conservative in some ways.  */
-      if (gimple_code (stmt) == GIMPLE_ASM && gimple_asm_volatile_p (stmt))
+      if (gimple_code (stmt) == GIMPLE_ASM
+         && gimple_asm_volatile_p (as_a <gimple_asm> (stmt)))
        return NULL;
 
       /* If duplicating this block is going to cause too much code
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index a907426..6babaee 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -1454,9 +1454,10 @@ execute_update_addresses_taken (void)
 
          else if (code == GIMPLE_ASM)
            {
-             for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
+             gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
+             for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
                {
-                 tree link = gimple_asm_output_op (stmt, i);
+                 tree link = gimple_asm_output_op (asm_stmt, i);
                  tree lhs = TREE_VALUE (link);
                  if (TREE_CODE (lhs) != SSA_NAME)
                    {
@@ -1471,9 +1472,9 @@ execute_update_addresses_taken (void)
                        bitmap_set_bit (not_reg_needs, DECL_UID (decl));
                    }
                }
-             for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
+             for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
                {
-                 tree link = gimple_asm_input_op (stmt, i);
+                 tree link = gimple_asm_input_op (asm_stmt, i);
                  if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
                    bitmap_set_bit (not_reg_needs, DECL_UID (decl));
                }
@@ -1584,16 +1585,17 @@ execute_update_addresses_taken (void)
 
            else if (gimple_code (stmt) == GIMPLE_ASM)
              {
+               gimple_asm asm_stmt = as_a <gimple_asm> (stmt);
                unsigned i;
-               for (i = 0; i < gimple_asm_noutputs (stmt); ++i)
+               for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
                  {
-                   tree link = gimple_asm_output_op (stmt, i);
+                   tree link = gimple_asm_output_op (asm_stmt, i);
                    maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
                                                suitable_for_renaming);
                  }
-               for (i = 0; i < gimple_asm_ninputs (stmt); ++i)
+               for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
                  {
-                   tree link = gimple_asm_input_op (stmt, i);
+                   tree link = gimple_asm_input_op (asm_stmt, i);
                    maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
                                                suitable_for_renaming);
                  }
-- 
1.8.5.3

Reply via email to