LCOV - code coverage report
Current view: top level - gcc - gimple.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 87.4 % 1606 1404
Test Date: 2026-10-17 16:30:31 Functions: 96.5 % 143 138
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Gimple IR support functions.
       2              : 
       3              :    Copyright (C) 2007-2026 Free Software Foundation, Inc.
       4              :    Contributed by Aldy Hernandez <aldyh@redhat.com>
       5              : 
       6              : This file is part of GCC.
       7              : 
       8              : GCC is free software; you can redistribute it and/or modify it under
       9              : the terms of the GNU General Public License as published by the Free
      10              : Software Foundation; either version 3, or (at your option) any later
      11              : version.
      12              : 
      13              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      14              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      15              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      16              : for more details.
      17              : 
      18              : You should have received a copy of the GNU General Public License
      19              : along with GCC; see the file COPYING3.  If not see
      20              : <http://www.gnu.org/licenses/>.  */
      21              : 
      22              : #include "config.h"
      23              : #include "system.h"
      24              : #include "coretypes.h"
      25              : #include "backend.h"
      26              : #include "tree.h"
      27              : #include "gimple.h"
      28              : #include "ssa.h"
      29              : #include "cgraph.h"
      30              : #include "diagnostic.h"
      31              : #include "alias.h"
      32              : #include "fold-const.h"
      33              : #include "calls.h"
      34              : #include "stor-layout.h"
      35              : #include "internal-fn.h"
      36              : #include "tree-eh.h"
      37              : #include "gimple-iterator.h"
      38              : #include "gimple-walk.h"
      39              : #include "gimplify.h"
      40              : #include "target.h"
      41              : #include "builtins.h"
      42              : #include "selftest.h"
      43              : #include "gimple-pretty-print.h"
      44              : #include "stringpool.h"
      45              : #include "attribs.h"
      46              : #include "asan.h"
      47              : #include "ubsan.h"
      48              : #include "langhooks.h"
      49              : #include "attr-fnspec.h"
      50              : #include "ipa-modref-tree.h"
      51              : #include "ipa-modref.h"
      52              : #include "dbgcnt.h"
      53              : 
      54              : /* All the tuples have their operand vector (if present) at the very bottom of
      55              :    the structure.  Therefore, the offset required to find the operands vector is
      56              :    the size of the structure minus the size of the 1-element tree array at the
      57              :    end (see gimple_ops).  An adjustment may be required if there is tail
      58              :    padding, as may happen on a host (e.g. sparc) where a pointer has 4-byte
      59              :    alignment while a uint64_t has 8-byte alignment.
      60              : 
      61              :    Unfortunately, we can't use offsetof to do this computation 100%
      62              :    straightforwardly, because these structs use inheritance and so are not
      63              :    standard layout types.  However, the fact that they are not standard layout
      64              :    types also means that tail padding will be reused in inheritance, which makes
      65              :    it possible to check for the problematic case with the following logic
      66              :    instead.  If tail padding is detected, the offset should be decreased
      67              :    accordingly.  */
      68              : 
      69              : template<typename G>
      70              : static constexpr size_t
      71              : get_tail_padding_adjustment ()
      72              : {
      73              :   struct padding_check : G
      74              :   {
      75              :     tree t;
      76              :   };
      77              :   return sizeof (padding_check) == sizeof (G) ? sizeof (tree) : 0;
      78              : }
      79              : 
      80              : #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) \
      81              :   (HAS_TREE_OP \
      82              :    ? sizeof (STRUCT) - sizeof (tree) - get_tail_padding_adjustment<STRUCT> () \
      83              :    : 0),
      84              : EXPORTED_CONST size_t gimple_ops_offset_[] = {
      85              : #include "gsstruct.def"
      86              : };
      87              : #undef DEFGSSTRUCT
      88              : 
      89              : #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) sizeof (struct STRUCT),
      90              : static const size_t gsstruct_code_size[] = {
      91              : #include "gsstruct.def"
      92              : };
      93              : #undef DEFGSSTRUCT
      94              : 
      95              : #define DEFGSCODE(SYM, NAME, GSSCODE)   NAME,
      96              : const char *const gimple_code_name[] = {
      97              : #include "gimple.def"
      98              : };
      99              : #undef DEFGSCODE
     100              : 
     101              : #define DEFGSCODE(SYM, NAME, GSSCODE)   GSSCODE,
     102              : EXPORTED_CONST enum gimple_statement_structure_enum gss_for_code_[] = {
     103              : #include "gimple.def"
     104              : };
     105              : #undef DEFGSCODE
     106              : 
     107              : /* Gimple stats.  */
     108              : 
     109              : uint64_t gimple_alloc_counts[(int) gimple_alloc_kind_all];
     110              : uint64_t gimple_alloc_sizes[(int) gimple_alloc_kind_all];
     111              : 
     112              : /* Keep in sync with gimple.h:enum gimple_alloc_kind.  */
     113              : static const char * const gimple_alloc_kind_names[] = {
     114              :     "assignments",
     115              :     "phi nodes",
     116              :     "conditionals",
     117              :     "everything else"
     118              : };
     119              : 
     120              : /* Static gimple tuple members.  */
     121              : const enum gimple_code gassign::code_;
     122              : const enum gimple_code gcall::code_;
     123              : const enum gimple_code gcond::code_;
     124              : 
     125              : 
     126              : /* Gimple tuple constructors.
     127              :    Note: Any constructor taking a ``gimple_seq'' as a parameter, can
     128              :    be passed a NULL to start with an empty sequence.  */
     129              : 
     130              : /* Set the code for statement G to CODE.  */
     131              : 
     132              : static inline void
     133    339098913 : gimple_set_code (gimple *g, enum gimple_code code)
     134              : {
     135    339098913 :   g->code = code;
     136              : }
     137              : 
     138              : /* Return the number of bytes needed to hold a GIMPLE statement with
     139              :    code CODE.  */
     140              : 
     141              : size_t
     142    416336462 : gimple_size (enum gimple_code code, unsigned num_ops)
     143              : {
     144    416336462 :   size_t size = gsstruct_code_size[gss_for_code (code)];
     145    416336462 :   if (num_ops > 0)
     146    283857268 :     size += (sizeof (tree) * (num_ops - 1));
     147    416336462 :   return size;
     148              : }
     149              : 
     150              : /* Initialize GIMPLE statement G with CODE and NUM_OPS.  */
     151              : 
     152              : void
     153    339098913 : gimple_init (gimple *g, enum gimple_code code, unsigned num_ops)
     154              : {
     155    339098913 :   gimple_set_code (g, code);
     156    339098913 :   gimple_set_num_ops (g, num_ops);
     157              : 
     158              :   /* Do not call gimple_set_modified here as it has other side
     159              :      effects and this tuple is still not completely built.  */
     160    339098913 :   g->modified = 1;
     161    339098913 :   gimple_init_singleton (g);
     162    339098913 : }
     163              : 
     164              : /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
     165              :    operands.  */
     166              : 
     167              : gimple *
     168    337375943 : gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
     169              : {
     170    337375943 :   size_t size;
     171    337375943 :   gimple *stmt;
     172              : 
     173    337375943 :   size = gimple_size (code, num_ops);
     174    337375943 :   if (GATHER_STATISTICS)
     175              :     {
     176              :       enum gimple_alloc_kind kind = gimple_alloc_kind (code);
     177              :       gimple_alloc_counts[(int) kind]++;
     178              :       gimple_alloc_sizes[(int) kind] += size;
     179              :     }
     180              : 
     181    337375943 :   stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT);
     182    337375943 :   gimple_init (stmt, code, num_ops);
     183    337375943 :   return stmt;
     184              : }
     185              : 
     186              : /* Set SUBCODE to be the code of the expression computed by statement G.  */
     187              : 
     188              : static inline void
     189    240316021 : gimple_set_subcode (gimple *g, unsigned subcode)
     190              : {
     191              :   /* We only have 16 bits for the RHS code.  Assert that we are not
     192              :      overflowing it.  */
     193    240316021 :   gcc_assert (subcode < (1 << 16));
     194    240316021 :   g->subcode = subcode;
     195    240316021 : }
     196              : 
     197              : 
     198              : 
     199              : /* Build a tuple with operands.  CODE is the statement to build (which
     200              :    must be one of the GIMPLE_WITH_OPS tuples).  SUBCODE is the subcode
     201              :    for the new tuple.  NUM_OPS is the number of operands to allocate.  */
     202              : 
     203              : #define gimple_build_with_ops(c, s, n) \
     204              :   gimple_build_with_ops_stat (c, s, n MEM_STAT_INFO)
     205              : 
     206              : static gimple *
     207    228902242 : gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode,
     208              :                             unsigned num_ops MEM_STAT_DECL)
     209              : {
     210            0 :   gimple *s = gimple_alloc (code, num_ops PASS_MEM_STAT);
     211    228902242 :   gimple_set_subcode (s, subcode);
     212              : 
     213    228902242 :   return s;
     214              : }
     215              : 
     216              : 
     217              : /* Build a GIMPLE_RETURN statement returning RETVAL.  */
     218              : 
     219              : greturn *
     220      3701628 : gimple_build_return (tree retval)
     221              : {
     222      3701628 :   greturn *s
     223      3701628 :     = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK,
     224              :                                                2));
     225      3701628 :   if (retval)
     226      2242634 :     gimple_return_set_retval (s, retval);
     227      3701628 :   return s;
     228              : }
     229              : 
     230              : /* Reset alias information on call S.  */
     231              : 
     232              : void
     233     19103457 : gimple_call_reset_alias_info (gcall *s)
     234              : {
     235     19103457 :   if (gimple_call_flags (s) & ECF_CONST)
     236      2431418 :     memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
     237              :   else
     238     16672039 :     pt_solution_reset (gimple_call_use_set (s));
     239     19103457 :   if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
     240      3692289 :     memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
     241              :   else
     242     15411168 :     pt_solution_reset (gimple_call_clobber_set (s));
     243     19103457 : }
     244              : 
     245              : /* Helper for gimple_build_call, gimple_build_call_valist,
     246              :    gimple_build_call_vec and gimple_build_call_from_tree.  Build the basic
     247              :    components of a GIMPLE_CALL statement to function FN with NARGS
     248              :    arguments.  */
     249              : 
     250              : static inline gcall *
     251     12455737 : gimple_build_call_1 (tree fn, unsigned nargs)
     252              : {
     253     12455737 :   gcall *s
     254     24911474 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     255              :                                              nargs + 3));
     256     12455737 :   if (TREE_CODE (fn) == FUNCTION_DECL)
     257     12233762 :     fn = build_fold_addr_expr (fn);
     258     12455737 :   gimple_set_op (s, 1, fn);
     259     12455737 :   gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn)));
     260     12455737 :   gimple_call_reset_alias_info (s);
     261     12455737 :   return s;
     262              : }
     263              : 
     264              : 
     265              : /* Build a GIMPLE_CALL statement to function FN with the arguments
     266              :    specified in vector ARGS.  */
     267              : 
     268              : gcall *
     269       800740 : gimple_build_call_vec (tree fn, const vec<tree> &args)
     270              : {
     271       800740 :   unsigned i;
     272       800740 :   unsigned nargs = args.length ();
     273       800740 :   gcall *call = gimple_build_call_1 (fn, nargs);
     274              : 
     275      3510185 :   for (i = 0; i < nargs; i++)
     276      1908705 :     gimple_call_set_arg (call, i, args[i]);
     277              : 
     278       800740 :   return call;
     279              : }
     280              : 
     281              : 
     282              : /* Build a GIMPLE_CALL statement to function FN.  NARGS is the number of
     283              :    arguments.  The ... are the arguments.  */
     284              : 
     285              : gcall *
     286       647967 : gimple_build_call (tree fn, unsigned nargs, ...)
     287              : {
     288       647967 :   va_list ap;
     289       647967 :   gcall *call;
     290       647967 :   unsigned i;
     291              : 
     292       647967 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     293              : 
     294       647967 :   call = gimple_build_call_1 (fn, nargs);
     295              : 
     296       647967 :   va_start (ap, nargs);
     297      1347533 :   for (i = 0; i < nargs; i++)
     298       699566 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     299       647967 :   va_end (ap);
     300              : 
     301       647967 :   return call;
     302              : }
     303              : 
     304              : 
     305              : /* Build a GIMPLE_CALL statement to function FN.  NARGS is the number of
     306              :    arguments.  AP contains the arguments.  */
     307              : 
     308              : gcall *
     309         2447 : gimple_build_call_valist (tree fn, unsigned nargs, va_list ap)
     310              : {
     311         2447 :   gcall *call;
     312         2447 :   unsigned i;
     313              : 
     314         2447 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     315              : 
     316         2447 :   call = gimple_build_call_1 (fn, nargs);
     317              : 
     318        11918 :   for (i = 0; i < nargs; i++)
     319         7024 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     320              : 
     321         2447 :   return call;
     322              : }
     323              : 
     324              : 
     325              : /* Helper for gimple_build_call_internal and gimple_build_call_internal_vec.
     326              :    Build the basic components of a GIMPLE_CALL statement to internal
     327              :    function FN with NARGS arguments.  */
     328              : 
     329              : static inline gcall *
     330       870843 : gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs)
     331              : {
     332       870843 :   gcall *s
     333      1741686 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     334              :                                              nargs + 3));
     335       870843 :   s->subcode |= GF_CALL_INTERNAL;
     336       870843 :   gimple_call_set_internal_fn (s, fn);
     337       870843 :   gimple_call_reset_alias_info (s);
     338       870843 :   return s;
     339              : }
     340              : 
     341              : 
     342              : /* Build a GIMPLE_CALL statement to internal function FN.  NARGS is
     343              :    the number of arguments.  The ... are the arguments.  */
     344              : 
     345              : gcall *
     346       482870 : gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...)
     347              : {
     348       482870 :   va_list ap;
     349       482870 :   gcall *call;
     350       482870 :   unsigned i;
     351              : 
     352       482870 :   call = gimple_build_call_internal_1 (fn, nargs);
     353       482870 :   va_start (ap, nargs);
     354      1945308 :   for (i = 0; i < nargs; i++)
     355      1462438 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     356       482870 :   va_end (ap);
     357              : 
     358       482870 :   return call;
     359              : }
     360              : 
     361              : 
     362              : /* Build a GIMPLE_CALL statement to internal function FN with the arguments
     363              :    specified in vector ARGS.  */
     364              : 
     365              : gcall *
     366       387957 : gimple_build_call_internal_vec (enum internal_fn fn, const vec<tree> &args)
     367              : {
     368       387957 :   unsigned i, nargs;
     369       387957 :   gcall *call;
     370              : 
     371       387957 :   nargs = args.length ();
     372       387957 :   call = gimple_build_call_internal_1 (fn, nargs);
     373      1927496 :   for (i = 0; i < nargs; i++)
     374      1151582 :     gimple_call_set_arg (call, i, args[i]);
     375              : 
     376       387957 :   return call;
     377              : }
     378              : 
     379              : 
     380              : /* Build a GIMPLE_CALL statement from CALL_EXPR T.  Note that T is
     381              :    assumed to be in GIMPLE form already.  Minimal checking is done of
     382              :    this fact.  */
     383              : 
     384              : gcall *
     385     11004599 : gimple_build_call_from_tree (tree t, tree fnptrtype)
     386              : {
     387     11004599 :   unsigned i, nargs;
     388     11004599 :   gcall *call;
     389              : 
     390     11004599 :   gcc_assert (TREE_CODE (t) == CALL_EXPR);
     391              : 
     392     11004599 :   nargs = call_expr_nargs (t);
     393              : 
     394     11004599 :   tree fndecl = NULL_TREE;
     395     11004599 :   if (CALL_EXPR_FN (t) == NULL_TREE)
     396           16 :     call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs);
     397              :   else
     398              :     {
     399     11004583 :       fndecl = get_callee_fndecl (t);
     400     11168788 :       call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
     401              :     }
     402              : 
     403     30705200 :   for (i = 0; i < nargs; i++)
     404     19700601 :     gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
     405              : 
     406     11004599 :   gimple_set_block (call, TREE_BLOCK (t));
     407     11004599 :   gimple_set_location (call, EXPR_LOCATION (t));
     408              : 
     409              :   /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL.  */
     410     11004599 :   gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
     411     11004599 :   gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
     412     11004599 :   gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t));
     413     11004599 :   gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
     414     11004599 :   if (fndecl
     415     10840378 :       && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
     416     13316972 :       && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl)))
     417        82798 :     gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t));
     418     10963200 :   else if (fndecl
     419     21762179 :            && (DECL_IS_OPERATOR_NEW_P (fndecl)
     420     10741729 :                || DECL_IS_OPERATOR_DELETE_P (fndecl)))
     421       273384 :     gimple_call_set_from_new_or_delete (call, CALL_FROM_NEW_OR_DELETE_P (t));
     422              :   else
     423     21653016 :     gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
     424     11004599 :   gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
     425     11004599 :   gimple_call_set_nothrow (call, TREE_NOTHROW (t));
     426     11004599 :   if (fndecl)
     427     10840378 :     gimple_call_set_expected_throw (call,
     428     10840378 :                                     flags_from_decl_or_type (fndecl)
     429     10840378 :                                     & ECF_XTHROW);
     430     11004599 :   gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t));
     431     11004599 :   copy_warning (call, t);
     432              : 
     433     11004599 :   if (fnptrtype)
     434              :     {
     435     11004446 :       gimple_call_set_fntype (call, TREE_TYPE (fnptrtype));
     436              : 
     437              :       /* Check if it's an indirect CALL and the type has the
     438              :          nocf_check attribute. In that case propagate the information
     439              :          to the gimple CALL insn.  */
     440     11004446 :       if (!fndecl)
     441              :         {
     442       164068 :           gcc_assert (POINTER_TYPE_P (fnptrtype));
     443       164068 :           tree fntype = TREE_TYPE (fnptrtype);
     444              : 
     445       164068 :           if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype)))
     446           21 :             gimple_call_set_nocf_check (call, true);
     447              :         }
     448              :     }
     449              : 
     450     11004599 :   return call;
     451              : }
     452              : 
     453              : /* Build a gcall to __builtin_unreachable as rewritten by
     454              :    -fsanitize=unreachable.  */
     455              : 
     456              : gcall *
     457       185968 : gimple_build_builtin_unreachable (location_t loc)
     458              : {
     459       185968 :   tree data = NULL_TREE;
     460       185968 :   tree fn = sanitize_unreachable_fn (&data, loc);
     461       185968 :   gcall *g = gimple_build_call (fn, data != NULL_TREE, data);
     462       185968 :   gimple_call_set_ctrl_altering (g, true);
     463       185968 :   gimple_set_location (g, loc);
     464       185968 :   return g;
     465              : }
     466              : 
     467              : /* Build a GIMPLE_ASSIGN statement.
     468              : 
     469              :    LHS of the assignment.
     470              :    RHS of the assignment which can be unary or binary.  */
     471              : 
     472              : gassign *
     473     89509836 : gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL)
     474              : {
     475     89509836 :   enum tree_code subcode;
     476     89509836 :   tree op1, op2, op3;
     477              : 
     478     89509836 :   extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3);
     479     89509836 :   return gimple_build_assign (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
     480              : }
     481              : 
     482              : 
     483              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
     484              :    OP1, OP2 and OP3.  */
     485              : 
     486              : static inline gassign *
     487     96066723 : gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1,
     488              :                        tree op2, tree op3 MEM_STAT_DECL)
     489              : {
     490     96066723 :   unsigned num_ops;
     491     96066723 :   gassign *p;
     492              : 
     493              :   /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
     494              :      code).  */
     495     96066723 :   num_ops = get_gimple_rhs_num_ops (subcode) + 1;
     496              : 
     497    192133446 :   p = as_a <gassign *> (
     498              :         gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
     499              :                                     PASS_MEM_STAT));
     500     96066723 :   gimple_assign_set_lhs (p, lhs);
     501              :   /* For COND_EXPR, op1 should not be a comparison. */
     502     96066723 :   if (op1 && subcode == COND_EXPR)
     503       278882 :     gcc_assert (!COMPARISON_CLASS_P  (op1));
     504     96066723 :   gimple_assign_set_rhs1 (p, op1);
     505     96066723 :   if (op2)
     506              :     {
     507     15158941 :       gcc_assert (num_ops > 2);
     508     15158941 :       gimple_assign_set_rhs2 (p, op2);
     509              :     }
     510              : 
     511     96066723 :   if (op3)
     512              :     {
     513       394321 :       gcc_assert (num_ops > 3);
     514       394321 :       gimple_assign_set_rhs3 (p, op3);
     515              :     }
     516              : 
     517     96066723 :   return p;
     518              : }
     519              : 
     520              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
     521              :    OP1, OP2 and OP3.  */
     522              : 
     523              : gassign *
     524     90933304 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     525              :                      tree op2, tree op3 MEM_STAT_DECL)
     526              : {
     527     90933304 :   return gimple_build_assign_1 (lhs, subcode, op1, op2, op3 PASS_MEM_STAT);
     528              : }
     529              : 
     530              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
     531              :    OP1 and OP2.  */
     532              : 
     533              : gassign *
     534      3603301 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     535              :                      tree op2 MEM_STAT_DECL)
     536              : {
     537      3603301 :   return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE
     538      3603301 :                                 PASS_MEM_STAT);
     539              : }
     540              : 
     541              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1.  */
     542              : 
     543              : gassign *
     544      1530118 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL)
     545              : {
     546      1530118 :   return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE
     547      1530118 :                                 PASS_MEM_STAT);
     548              : }
     549              : 
     550              : 
     551              : /* Build a GIMPLE_COND statement.
     552              : 
     553              :    PRED is the condition used to compare LHS and the RHS.
     554              :    T_LABEL is the label to jump to if the condition is true.
     555              :    F_LABEL is the label to jump to otherwise.  */
     556              : 
     557              : gcond *
     558      8803743 : gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
     559              :                    tree t_label, tree f_label)
     560              : {
     561      8803743 :   gcond *p;
     562              : 
     563      8803743 :   gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
     564     17607486 :   p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4));
     565      8803743 :   gimple_cond_set_lhs (p, lhs);
     566      8803743 :   gimple_cond_set_rhs (p, rhs);
     567      8803743 :   gimple_cond_set_true_label (p, t_label);
     568      8803743 :   gimple_cond_set_false_label (p, f_label);
     569      8803743 :   return p;
     570              : }
     571              : 
     572              : /* Build a GIMPLE_COND statement from the conditional expression tree
     573              :    COND.  T_LABEL and F_LABEL are as in gimple_build_cond.  */
     574              : 
     575              : gcond *
     576        99504 : gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
     577              : {
     578        99504 :   enum tree_code code;
     579        99504 :   tree lhs, rhs;
     580              : 
     581        99504 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     582        99504 :   return gimple_build_cond (code, lhs, rhs, t_label, f_label);
     583              : }
     584              : 
     585              : /* Set code, lhs, and rhs of a GIMPLE_COND from a suitable
     586              :    boolean expression tree COND.  */
     587              : 
     588              : void
     589       412532 : gimple_cond_set_condition_from_tree (gcond *stmt, tree cond)
     590              : {
     591       412532 :   enum tree_code code;
     592       412532 :   tree lhs, rhs;
     593              : 
     594       412532 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     595       412532 :   gimple_cond_set_condition (stmt, code, lhs, rhs);
     596       412532 : }
     597              : 
     598              : /* Build a GIMPLE_LABEL statement for LABEL.  */
     599              : 
     600              : glabel *
     601     19746838 : gimple_build_label (tree label)
     602              : {
     603     19746838 :   glabel *p
     604     19746838 :     = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1));
     605     19746838 :   gimple_label_set_label (p, label);
     606     19746838 :   return p;
     607              : }
     608              : 
     609              : /* Build a GIMPLE_GOTO statement to label DEST.  */
     610              : 
     611              : ggoto *
     612      7226230 : gimple_build_goto (tree dest)
     613              : {
     614      7226230 :   ggoto *p
     615      7226230 :     = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1));
     616      7226230 :   gimple_goto_set_dest (p, dest);
     617      7226230 :   return p;
     618              : }
     619              : 
     620              : 
     621              : /* Build a GIMPLE_NOP statement.  */
     622              : 
     623              : gimple *
     624     15896727 : gimple_build_nop (void)
     625              : {
     626     15896727 :   return gimple_alloc (GIMPLE_NOP, 0);
     627              : }
     628              : 
     629              : 
     630              : /* Build a GIMPLE_BIND statement.
     631              :    VARS are the variables in BODY.
     632              :    BLOCK is the containing block.  */
     633              : 
     634              : gbind *
     635      7592475 : gimple_build_bind (tree vars, gimple_seq body, tree block)
     636              : {
     637      7592475 :   gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0));
     638      7592475 :   gimple_bind_set_vars (p, vars);
     639      7592475 :   if (body)
     640      1380141 :     gimple_bind_set_body (p, body);
     641      7592475 :   if (block)
     642      6065673 :     gimple_bind_set_block (p, block);
     643      7592475 :   return p;
     644              : }
     645              : 
     646              : /* Helper function to set the simple fields of a asm stmt.
     647              : 
     648              :    STRING is a pointer to a string that is the asm blocks assembly code.
     649              :    NINPUT is the number of register inputs.
     650              :    NOUTPUT is the number of register outputs.
     651              :    NCLOBBERS is the number of clobbered registers.
     652              :    */
     653              : 
     654              : static inline gasm *
     655        87874 : gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
     656              :                     unsigned nclobbers, unsigned nlabels)
     657              : {
     658        87874 :   gasm *p;
     659        87874 :   int size = strlen (string);
     660              : 
     661        87874 :   p = as_a <gasm *> (
     662        87874 :         gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
     663              :                                ninputs + noutputs + nclobbers + nlabels));
     664              : 
     665        87874 :   p->ni = ninputs;
     666        87874 :   p->no = noutputs;
     667        87874 :   p->nc = nclobbers;
     668        87874 :   p->nl = nlabels;
     669        87874 :   p->string = ggc_alloc_string (string, size);
     670              : 
     671        87874 :   if (GATHER_STATISTICS)
     672              :     gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
     673              : 
     674        87874 :   return p;
     675              : }
     676              : 
     677              : /* Build a GIMPLE_ASM statement.
     678              : 
     679              :    STRING is the assembly code.
     680              :    NINPUT is the number of register inputs.
     681              :    NOUTPUT is the number of register outputs.
     682              :    NCLOBBERS is the number of clobbered registers.
     683              :    INPUTS is a vector of the input register parameters.
     684              :    OUTPUTS is a vector of the output register parameters.
     685              :    CLOBBERS is a vector of the clobbered register parameters.
     686              :    LABELS is a vector of destination labels.  */
     687              : 
     688              : gasm *
     689        87874 : gimple_build_asm_vec (const char *string, vec<tree, va_gc> *inputs,
     690              :                       vec<tree, va_gc> *outputs, vec<tree, va_gc> *clobbers,
     691              :                       vec<tree, va_gc> *labels)
     692              : {
     693        87874 :   gasm *p;
     694        87874 :   unsigned i;
     695              : 
     696       172188 :   p = gimple_build_asm_1 (string,
     697              :                           vec_safe_length (inputs),
     698              :                           vec_safe_length (outputs),
     699              :                           vec_safe_length (clobbers),
     700              :                           vec_safe_length (labels));
     701              : 
     702       303684 :   for (i = 0; i < vec_safe_length (inputs); i++)
     703        47186 :     gimple_asm_set_input_op (p, i, (*inputs)[i]);
     704              : 
     705       250598 :   for (i = 0; i < vec_safe_length (outputs); i++)
     706        66063 :     gimple_asm_set_output_op (p, i, (*outputs)[i]);
     707              : 
     708       301644 :   for (i = 0; i < vec_safe_length (clobbers); i++)
     709        80331 :     gimple_asm_set_clobber_op (p, i, (*clobbers)[i]);
     710              : 
     711        88821 :   for (i = 0; i < vec_safe_length (labels); i++)
     712          947 :     gimple_asm_set_label_op (p, i, (*labels)[i]);
     713              : 
     714        87874 :   return p;
     715              : }
     716              : 
     717              : /* Build a GIMPLE_CATCH statement.
     718              : 
     719              :   TYPES are the catch types.
     720              :   HANDLER is the exception handler.  */
     721              : 
     722              : gcatch *
     723        41968 : gimple_build_catch (tree types, gimple_seq handler)
     724              : {
     725        41968 :   gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0));
     726        41968 :   gimple_catch_set_types (p, types);
     727        41968 :   if (handler)
     728        41956 :     gimple_catch_set_handler (p, handler);
     729              : 
     730        41968 :   return p;
     731              : }
     732              : 
     733              : /* Build a GIMPLE_EH_FILTER statement.
     734              : 
     735              :    TYPES are the filter's types.
     736              :    FAILURE is the filter's failure action.  */
     737              : 
     738              : geh_filter *
     739         5891 : gimple_build_eh_filter (tree types, gimple_seq failure)
     740              : {
     741         5891 :   geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0));
     742         5891 :   gimple_eh_filter_set_types (p, types);
     743         5891 :   if (failure)
     744         5891 :     gimple_eh_filter_set_failure (p, failure);
     745              : 
     746         5891 :   return p;
     747              : }
     748              : 
     749              : /* Build a GIMPLE_EH_MUST_NOT_THROW statement.  */
     750              : 
     751              : geh_mnt *
     752      1381830 : gimple_build_eh_must_not_throw (tree decl)
     753              : {
     754      1381830 :   geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0));
     755              : 
     756      1381830 :   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
     757      1381830 :   gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
     758      1381830 :   gimple_eh_must_not_throw_set_fndecl (p, decl);
     759              : 
     760      1381830 :   return p;
     761              : }
     762              : 
     763              : /* Build a GIMPLE_EH_ELSE statement.  */
     764              : 
     765              : geh_else *
     766          554 : gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body)
     767              : {
     768          554 :   geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0));
     769          554 :   gimple_eh_else_set_n_body (p, n_body);
     770          554 :   gimple_eh_else_set_e_body (p, e_body);
     771          554 :   return p;
     772              : }
     773              : 
     774              : /* Build a GIMPLE_TRY statement.
     775              : 
     776              :    EVAL is the expression to evaluate.
     777              :    CLEANUP is the cleanup expression.
     778              :    KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY depending on
     779              :    whether this is a try/catch or a try/finally respectively.  */
     780              : 
     781              : gtry *
     782      3351340 : gimple_build_try (gimple_seq eval, gimple_seq cleanup,
     783              :                   enum gimple_try_flags kind)
     784              : {
     785      3351340 :   gtry *p;
     786              : 
     787      3351340 :   gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
     788      3351340 :   p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0));
     789      3351340 :   gimple_set_subcode (p, kind);
     790      3351340 :   if (eval)
     791      3255687 :     gimple_try_set_eval (p, eval);
     792      3351340 :   if (cleanup)
     793      3351340 :     gimple_try_set_cleanup (p, cleanup);
     794              : 
     795      3351340 :   return p;
     796              : }
     797              : 
     798              : /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
     799              : 
     800              :    CLEANUP is the cleanup expression.  */
     801              : 
     802              : gimple *
     803       674730 : gimple_build_wce (gimple_seq cleanup)
     804              : {
     805       674730 :   gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
     806       674730 :   if (cleanup)
     807       674730 :     gimple_wce_set_cleanup (p, cleanup);
     808              : 
     809       674730 :   return p;
     810              : }
     811              : 
     812              : 
     813              : /* Build a GIMPLE_RESX statement.  */
     814              : 
     815              : gresx *
     816       974192 : gimple_build_resx (int region)
     817              : {
     818       974192 :   gresx *p
     819       974192 :     = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0));
     820       974192 :   p->region = region;
     821       974192 :   return p;
     822              : }
     823              : 
     824              : 
     825              : /* The helper for constructing a gimple switch statement.
     826              :    INDEX is the switch's index.
     827              :    NLABELS is the number of labels in the switch excluding the default.
     828              :    DEFAULT_LABEL is the default label for the switch statement.  */
     829              : 
     830              : gswitch *
     831        68934 : gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
     832              : {
     833              :   /* nlabels + 1 default label + 1 index.  */
     834        68934 :   gcc_checking_assert (default_label);
     835       137868 :   gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH,
     836              :                                                         ERROR_MARK,
     837              :                                                         1 + 1 + nlabels));
     838        68934 :   gimple_switch_set_index (p, index);
     839        68934 :   gimple_switch_set_default_label (p, default_label);
     840        68934 :   return p;
     841              : }
     842              : 
     843              : /* Build a GIMPLE_SWITCH statement.
     844              : 
     845              :    INDEX is the switch's index.
     846              :    DEFAULT_LABEL is the default label
     847              :    ARGS is a vector of labels excluding the default.  */
     848              : 
     849              : gswitch *
     850        68934 : gimple_build_switch (tree index, tree default_label, const vec<tree> &args)
     851              : {
     852        68934 :   unsigned i, nlabels = args.length ();
     853              : 
     854        68934 :   gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label);
     855              : 
     856              :   /* Copy the labels from the vector to the switch statement.  */
     857      1242440 :   for (i = 0; i < nlabels; i++)
     858      1104572 :     gimple_switch_set_label (p, i + 1, args[i]);
     859              : 
     860        68934 :   return p;
     861              : }
     862              : 
     863              : /* Build a GIMPLE_EH_DISPATCH statement.  */
     864              : 
     865              : geh_dispatch *
     866        43547 : gimple_build_eh_dispatch (int region)
     867              : {
     868        43547 :   geh_dispatch *p
     869        43547 :     = as_a <geh_dispatch *> (
     870              :         gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0));
     871        43547 :   p->region = region;
     872        43547 :   return p;
     873              : }
     874              : 
     875              : /* Build a new GIMPLE_DEBUG_BIND statement.
     876              : 
     877              :    VAR is bound to VALUE; block and location are taken from STMT.  */
     878              : 
     879              : gdebug *
     880     71355307 : gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL)
     881              : {
     882     71355307 :   gdebug *p
     883     71355307 :     = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG,
     884              :                                                    (unsigned)GIMPLE_DEBUG_BIND, 2
     885              :                                                    PASS_MEM_STAT));
     886     71355307 :   gimple_debug_bind_set_var (p, var);
     887     71355307 :   gimple_debug_bind_set_value (p, value);
     888     71355307 :   if (stmt)
     889     70323823 :     gimple_set_location (p, gimple_location (stmt));
     890              : 
     891     71355307 :   return p;
     892              : }
     893              : 
     894              : 
     895              : /* Build a new GIMPLE_DEBUG_SOURCE_BIND statement.
     896              : 
     897              :    VAR is bound to VALUE; block and location are taken from STMT.  */
     898              : 
     899              : gdebug *
     900       752925 : gimple_build_debug_source_bind (tree var, tree value,
     901              :                                      gimple *stmt MEM_STAT_DECL)
     902              : {
     903       752925 :   gdebug *p
     904       752925 :     = as_a <gdebug *> (
     905              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     906              :                                     (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2
     907              :                                     PASS_MEM_STAT));
     908              : 
     909       752925 :   gimple_debug_source_bind_set_var (p, var);
     910       752925 :   gimple_debug_source_bind_set_value (p, value);
     911       752925 :   if (stmt)
     912       599397 :     gimple_set_location (p, gimple_location (stmt));
     913              : 
     914       752925 :   return p;
     915              : }
     916              : 
     917              : 
     918              : /* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at
     919              :    LOCATION.  */
     920              : 
     921              : gdebug *
     922      2517013 : gimple_build_debug_begin_stmt (tree block, location_t location
     923              :                                     MEM_STAT_DECL)
     924              : {
     925      2517013 :   gdebug *p
     926      2517013 :     = as_a <gdebug *> (
     927              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     928              :                                     (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0
     929              :                                     PASS_MEM_STAT));
     930              : 
     931      2517013 :   gimple_set_location (p, location);
     932      2517013 :   gimple_set_block (p, block);
     933      2517013 :   cfun->debug_marker_count++;
     934              : 
     935      2517013 :   return p;
     936              : }
     937              : 
     938              : 
     939              : /* Build a new GIMPLE_DEBUG_INLINE_ENTRY statement in BLOCK at
     940              :    LOCATION.  The BLOCK links to the inlined function.  */
     941              : 
     942              : gdebug *
     943      4230708 : gimple_build_debug_inline_entry (tree block, location_t location
     944              :                                       MEM_STAT_DECL)
     945              : {
     946      4230708 :   gdebug *p
     947      4230708 :     = as_a <gdebug *> (
     948              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     949              :                                     (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0
     950              :                                     PASS_MEM_STAT));
     951              : 
     952      4230708 :   gimple_set_location (p, location);
     953      4230708 :   gimple_set_block (p, block);
     954      4230708 :   cfun->debug_marker_count++;
     955              : 
     956      4230708 :   return p;
     957              : }
     958              : 
     959              : 
     960              : /* Build a GIMPLE_OMP_CRITICAL statement.
     961              : 
     962              :    BODY is the sequence of statements for which only one thread can execute.
     963              :    NAME is optional identifier for this critical block.
     964              :    CLAUSES are clauses for this critical block.  */
     965              : 
     966              : gomp_critical *
     967          552 : gimple_build_omp_critical (gimple_seq body, tree name, tree clauses)
     968              : {
     969          552 :   gomp_critical *p
     970          552 :     = as_a <gomp_critical *> (gimple_alloc (GIMPLE_OMP_CRITICAL, 0));
     971          552 :   gimple_omp_critical_set_name (p, name);
     972          552 :   gimple_omp_critical_set_clauses (p, clauses);
     973          552 :   if (body)
     974          457 :     gimple_omp_set_body (p, body);
     975              : 
     976          552 :   return p;
     977              : }
     978              : 
     979              : /* Build a GIMPLE_OMP_FOR statement.
     980              : 
     981              :    BODY is sequence of statements inside the for loop.
     982              :    KIND is the `for' variant.
     983              :    CLAUSES are any of the construct's clauses.
     984              :    COLLAPSE is the collapse count.
     985              :    PRE_BODY is the sequence of statements that are loop invariant.  */
     986              : 
     987              : gomp_for *
     988        53615 : gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse,
     989              :                       gimple_seq pre_body)
     990              : {
     991        53615 :   gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0));
     992        53615 :   if (body)
     993        49763 :     gimple_omp_set_body (p, body);
     994        53615 :   gimple_omp_for_set_clauses (p, clauses);
     995        53615 :   gimple_omp_for_set_kind (p, kind);
     996        53615 :   p->collapse = collapse;
     997        53615 :   p->iter =  ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse);
     998              : 
     999        53615 :   if (pre_body)
    1000         3580 :     gimple_omp_for_set_pre_body (p, pre_body);
    1001              : 
    1002        53615 :   return p;
    1003              : }
    1004              : 
    1005              : 
    1006              : /* Build a GIMPLE_OMP_PARALLEL statement.
    1007              : 
    1008              :    BODY is sequence of statements which are executed in parallel.
    1009              :    CLAUSES are the OMP parallel construct's clauses.
    1010              :    CHILD_FN is the function created for the parallel threads to execute.
    1011              :    DATA_ARG are the shared data argument(s).  */
    1012              : 
    1013              : gomp_parallel *
    1014        18585 : gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
    1015              :                            tree data_arg)
    1016              : {
    1017        18585 :   gomp_parallel *p
    1018        18585 :     = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0));
    1019        18585 :   if (body)
    1020        18392 :     gimple_omp_set_body (p, body);
    1021        18585 :   gimple_omp_parallel_set_clauses (p, clauses);
    1022        18585 :   gimple_omp_parallel_set_child_fn (p, child_fn);
    1023        18585 :   gimple_omp_parallel_set_data_arg (p, data_arg);
    1024              : 
    1025        18585 :   return p;
    1026              : }
    1027              : 
    1028              : 
    1029              : /* Build a GIMPLE_OMP_TASK statement.
    1030              : 
    1031              :    BODY is sequence of statements which are executed by the explicit task.
    1032              :    CLAUSES are the OMP task construct's clauses.
    1033              :    CHILD_FN is the function created for the parallel threads to execute.
    1034              :    DATA_ARG are the shared data argument(s).
    1035              :    COPY_FN is the optional function for firstprivate initialization.
    1036              :    ARG_SIZE and ARG_ALIGN are size and alignment of the data block.  */
    1037              : 
    1038              : gomp_task *
    1039         5692 : gimple_build_omp_task (gimple_seq body, tree clauses, tree child_fn,
    1040              :                        tree data_arg, tree copy_fn, tree arg_size,
    1041              :                        tree arg_align)
    1042              : {
    1043         5692 :   gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0));
    1044         5692 :   if (body)
    1045         5599 :     gimple_omp_set_body (p, body);
    1046         5692 :   gimple_omp_task_set_clauses (p, clauses);
    1047         5692 :   gimple_omp_task_set_child_fn (p, child_fn);
    1048         5692 :   gimple_omp_task_set_data_arg (p, data_arg);
    1049         5692 :   gimple_omp_task_set_copy_fn (p, copy_fn);
    1050         5692 :   gimple_omp_task_set_arg_size (p, arg_size);
    1051         5692 :   gimple_omp_task_set_arg_align (p, arg_align);
    1052              : 
    1053         5692 :   return p;
    1054              : }
    1055              : 
    1056              : 
    1057              : /* Build a GIMPLE_OMP_SECTION statement for a sections statement.
    1058              : 
    1059              :    BODY is the sequence of statements in the section.  */
    1060              : 
    1061              : gimple *
    1062         1279 : gimple_build_omp_section (gimple_seq body)
    1063              : {
    1064         1279 :   gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0);
    1065         1279 :   if (body)
    1066         1087 :     gimple_omp_set_body (p, body);
    1067              : 
    1068         1279 :   return p;
    1069              : }
    1070              : 
    1071              : 
    1072              : /* Build a GIMPLE_OMP_STRUCTURED_BLOCK statement.
    1073              : 
    1074              :    BODY is the structured block sequence.  */
    1075              : 
    1076              : gimple *
    1077          791 : gimple_build_omp_structured_block (gimple_seq body)
    1078              : {
    1079          791 :   gimple *p = gimple_alloc (GIMPLE_OMP_STRUCTURED_BLOCK, 0);
    1080          791 :   if (body)
    1081          791 :     gimple_omp_set_body (p, body);
    1082              : 
    1083          791 :   return p;
    1084              : }
    1085              : 
    1086              : 
    1087              : /* Build a GIMPLE_OMP_MASTER statement.
    1088              : 
    1089              :    BODY is the sequence of statements to be executed by just the master.  */
    1090              : 
    1091              : gimple *
    1092          874 : gimple_build_omp_master (gimple_seq body)
    1093              : {
    1094          874 :   gimple *p = gimple_alloc (GIMPLE_OMP_MASTER, 0);
    1095          874 :   if (body)
    1096          793 :     gimple_omp_set_body (p, body);
    1097              : 
    1098          874 :   return p;
    1099              : }
    1100              : 
    1101              : /* Build a GIMPLE_OMP_MASKED statement.
    1102              : 
    1103              :    BODY is the sequence of statements to be executed by the selected thread(s).  */
    1104              : 
    1105              : gimple *
    1106          497 : gimple_build_omp_masked (gimple_seq body, tree clauses)
    1107              : {
    1108          497 :   gimple *p = gimple_alloc (GIMPLE_OMP_MASKED, 0);
    1109          497 :   gimple_omp_masked_set_clauses (p, clauses);
    1110          497 :   if (body)
    1111          417 :     gimple_omp_set_body (p, body);
    1112              : 
    1113          497 :   return p;
    1114              : }
    1115              : 
    1116              : /* Build a GIMPLE_OMP_TASKGROUP statement.
    1117              : 
    1118              :    BODY is the sequence of statements to be executed by the taskgroup
    1119              :    construct.
    1120              :    CLAUSES are any of the construct's clauses.  */
    1121              : 
    1122              : gimple *
    1123          611 : gimple_build_omp_taskgroup (gimple_seq body, tree clauses)
    1124              : {
    1125          611 :   gimple *p = gimple_alloc (GIMPLE_OMP_TASKGROUP, 0);
    1126          611 :   gimple_omp_taskgroup_set_clauses (p, clauses);
    1127          611 :   if (body)
    1128          611 :     gimple_omp_set_body (p, body);
    1129              : 
    1130          611 :   return p;
    1131              : }
    1132              : 
    1133              : 
    1134              : /* Build a GIMPLE_OMP_CONTINUE statement.
    1135              : 
    1136              :    CONTROL_DEF is the definition of the control variable.
    1137              :    CONTROL_USE is the use of the control variable.  */
    1138              : 
    1139              : gomp_continue *
    1140        52047 : gimple_build_omp_continue (tree control_def, tree control_use)
    1141              : {
    1142        52047 :   gomp_continue *p
    1143        52047 :     = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0));
    1144        52047 :   gimple_omp_continue_set_control_def (p, control_def);
    1145        52047 :   gimple_omp_continue_set_control_use (p, control_use);
    1146        52047 :   return p;
    1147              : }
    1148              : 
    1149              : /* Build a GIMPLE_OMP_ORDERED statement.
    1150              : 
    1151              :    BODY is the sequence of statements inside a loop that will executed in
    1152              :    sequence.
    1153              :    CLAUSES are clauses for this statement.  */
    1154              : 
    1155              : gomp_ordered *
    1156         1852 : gimple_build_omp_ordered (gimple_seq body, tree clauses)
    1157              : {
    1158         1852 :   gomp_ordered *p
    1159         1852 :     = as_a <gomp_ordered *> (gimple_alloc (GIMPLE_OMP_ORDERED, 0));
    1160         1852 :   gimple_omp_ordered_set_clauses (p, clauses);
    1161         1852 :   if (body)
    1162          501 :     gimple_omp_set_body (p, body);
    1163              : 
    1164         1852 :   return p;
    1165              : }
    1166              : 
    1167              : 
    1168              : /* Build a GIMPLE_OMP_RETURN statement.
    1169              :    WAIT_P is true if this is a non-waiting return.  */
    1170              : 
    1171              : gimple *
    1172       102221 : gimple_build_omp_return (bool wait_p)
    1173              : {
    1174       102221 :   gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
    1175       102221 :   if (wait_p)
    1176        37841 :     gimple_omp_return_set_nowait (p);
    1177              : 
    1178       102221 :   return p;
    1179              : }
    1180              : 
    1181              : 
    1182              : /* Build a GIMPLE_OMP_SCAN statement.
    1183              : 
    1184              :    BODY is the sequence of statements to be executed by the scan
    1185              :    construct.
    1186              :    CLAUSES are any of the construct's clauses.  */
    1187              : 
    1188              : gomp_scan *
    1189         1324 : gimple_build_omp_scan (gimple_seq body, tree clauses)
    1190              : {
    1191         1324 :   gomp_scan *p
    1192         1324 :     = as_a <gomp_scan *> (gimple_alloc (GIMPLE_OMP_SCAN, 0));
    1193         1324 :   gimple_omp_scan_set_clauses (p, clauses);
    1194         1324 :   if (body)
    1195         1094 :     gimple_omp_set_body (p, body);
    1196              : 
    1197         1324 :   return p;
    1198              : }
    1199              : 
    1200              : 
    1201              : /* Build a GIMPLE_OMP_SECTIONS statement.
    1202              : 
    1203              :    BODY is a sequence of section statements.
    1204              :    CLAUSES are any of the OMP sections contsruct's clauses: private,
    1205              :    firstprivate, lastprivate, reduction, and nowait.  */
    1206              : 
    1207              : gomp_sections *
    1208          634 : gimple_build_omp_sections (gimple_seq body, tree clauses)
    1209              : {
    1210          634 :   gomp_sections *p
    1211          634 :     = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0));
    1212          634 :   if (body)
    1213          634 :     gimple_omp_set_body (p, body);
    1214          634 :   gimple_omp_sections_set_clauses (p, clauses);
    1215              : 
    1216          634 :   return p;
    1217              : }
    1218              : 
    1219              : 
    1220              : /* Build a GIMPLE_OMP_SECTIONS_SWITCH.  */
    1221              : 
    1222              : gimple *
    1223          386 : gimple_build_omp_sections_switch (void)
    1224              : {
    1225          386 :   return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0);
    1226              : }
    1227              : 
    1228              : 
    1229              : /* Build a GIMPLE_OMP_SINGLE statement.
    1230              : 
    1231              :    BODY is the sequence of statements that will be executed once.
    1232              :    CLAUSES are any of the OMP single construct's clauses: private, firstprivate,
    1233              :    copyprivate, nowait.  */
    1234              : 
    1235              : gomp_single *
    1236         1287 : gimple_build_omp_single (gimple_seq body, tree clauses)
    1237              : {
    1238         1287 :   gomp_single *p
    1239         1287 :     = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0));
    1240         1287 :   if (body)
    1241         1174 :     gimple_omp_set_body (p, body);
    1242         1287 :   gimple_omp_single_set_clauses (p, clauses);
    1243              : 
    1244         1287 :   return p;
    1245              : }
    1246              : 
    1247              : 
    1248              : /* Build a GIMPLE_OMP_SCOPE statement.
    1249              : 
    1250              :    BODY is the sequence of statements that will be executed once.
    1251              :    CLAUSES are any of the OMP scope construct's clauses: private, reduction,
    1252              :    nowait.  */
    1253              : 
    1254              : gimple *
    1255          242 : gimple_build_omp_scope (gimple_seq body, tree clauses)
    1256              : {
    1257          242 :   gimple *p = gimple_alloc (GIMPLE_OMP_SCOPE, 0);
    1258          242 :   gimple_omp_scope_set_clauses (p, clauses);
    1259          242 :   if (body)
    1260          168 :     gimple_omp_set_body (p, body);
    1261              : 
    1262          242 :   return p;
    1263              : }
    1264              : 
    1265              : /* Build a GIMPLE_OMP_DISPATCH statement.
    1266              : 
    1267              :    BODY is the target function call to be dispatched.
    1268              :    CLAUSES are any of the OMP dispatch construct's clauses.  */
    1269              : 
    1270              : gimple *
    1271          852 : gimple_build_omp_dispatch (gimple_seq body, tree clauses)
    1272              : {
    1273          852 :   gimple *p = gimple_alloc (GIMPLE_OMP_DISPATCH, 0);
    1274          852 :   gimple_omp_dispatch_set_clauses (p, clauses);
    1275          852 :   if (body)
    1276          852 :     gimple_omp_set_body (p, body);
    1277              : 
    1278          852 :   return p;
    1279              : }
    1280              : 
    1281              : /* Build a GIMPLE_OMP_INTEROP statement.
    1282              : 
    1283              :    CLAUSES are any of the OMP interop construct's clauses.  */
    1284              : 
    1285              : gimple *
    1286          612 : gimple_build_omp_interop (tree clauses)
    1287              : {
    1288          612 :   gimple *p = gimple_alloc (GIMPLE_OMP_INTEROP, 0);
    1289          612 :   gimple_omp_interop_set_clauses (p, clauses);
    1290              : 
    1291          612 :   return p;
    1292              : }
    1293              : 
    1294              : /* Build a GIMPLE_OMP_TARGET statement.
    1295              : 
    1296              :    BODY is the sequence of statements that will be executed.
    1297              :    KIND is the kind of the region.
    1298              :    CLAUSES are any of the construct's clauses.
    1299              :    ITERATOR_LOOPS is an optional sequence containing constructed loops
    1300              :    for OpenMP iterators.  */
    1301              : 
    1302              : gomp_target *
    1303        43201 : gimple_build_omp_target (gimple_seq body, int kind, tree clauses,
    1304              :                          gimple_seq iterator_loops)
    1305              : {
    1306        43201 :   gomp_target *p
    1307        43201 :     = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0));
    1308        43201 :   if (body)
    1309        29386 :     gimple_omp_set_body (p, body);
    1310        43201 :   gimple_omp_target_set_clauses (p, clauses);
    1311        43201 :   gimple_omp_target_set_kind (p, kind);
    1312        43201 :   gimple_omp_target_set_iterator_loops (p, iterator_loops);
    1313              : 
    1314        43201 :   return p;
    1315              : }
    1316              : 
    1317              : 
    1318              : /* Build a GIMPLE_OMP_TEAMS statement.
    1319              : 
    1320              :    BODY is the sequence of statements that will be executed.
    1321              :    CLAUSES are any of the OMP teams construct's clauses.  */
    1322              : 
    1323              : gomp_teams *
    1324         8892 : gimple_build_omp_teams (gimple_seq body, tree clauses)
    1325              : {
    1326         8892 :   gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0));
    1327         8892 :   if (body)
    1328         8892 :     gimple_omp_set_body (p, body);
    1329         8892 :   gimple_omp_teams_set_clauses (p, clauses);
    1330              : 
    1331         8892 :   return p;
    1332              : }
    1333              : 
    1334              : 
    1335              : /* Build a GIMPLE_OMP_ATOMIC_LOAD statement.  */
    1336              : 
    1337              : gomp_atomic_load *
    1338        10327 : gimple_build_omp_atomic_load (tree lhs, tree rhs, enum omp_memory_order mo)
    1339              : {
    1340        10327 :   gomp_atomic_load *p
    1341        10327 :     = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0));
    1342        10327 :   gimple_omp_atomic_load_set_lhs (p, lhs);
    1343        10327 :   gimple_omp_atomic_load_set_rhs (p, rhs);
    1344        10327 :   gimple_omp_atomic_set_memory_order (p, mo);
    1345        10327 :   return p;
    1346              : }
    1347              : 
    1348              : /* Build a GIMPLE_OMP_ATOMIC_STORE statement.
    1349              : 
    1350              :    VAL is the value we are storing.  */
    1351              : 
    1352              : gomp_atomic_store *
    1353        10327 : gimple_build_omp_atomic_store (tree val, enum omp_memory_order mo)
    1354              : {
    1355        10327 :   gomp_atomic_store *p
    1356        10327 :     = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0));
    1357        10327 :   gimple_omp_atomic_store_set_val (p, val);
    1358        10327 :   gimple_omp_atomic_set_memory_order (p, mo);
    1359        10327 :   return p;
    1360              : }
    1361              : 
    1362              : /* Build a GIMPLE_ASSUME statement.  */
    1363              : 
    1364              : gimple *
    1365          128 : gimple_build_assume (tree guard, gimple_seq body)
    1366              : {
    1367          128 :   gimple_statement_assume *p
    1368          128 :     = as_a <gimple_statement_assume *> (gimple_alloc (GIMPLE_ASSUME, 0));
    1369          128 :   gimple_assume_set_guard (p, guard);
    1370          128 :   *gimple_assume_body_ptr (p) = body;
    1371          128 :   return p;
    1372              : }
    1373              : 
    1374              : /* Build a GIMPLE_TRANSACTION statement.  */
    1375              : 
    1376              : gtransaction *
    1377          545 : gimple_build_transaction (gimple_seq body)
    1378              : {
    1379          545 :   gtransaction *p
    1380          545 :     = as_a <gtransaction *> (gimple_alloc (GIMPLE_TRANSACTION, 0));
    1381          545 :   gimple_transaction_set_body (p, body);
    1382          545 :   gimple_transaction_set_label_norm (p, 0);
    1383          545 :   gimple_transaction_set_label_uninst (p, 0);
    1384          545 :   gimple_transaction_set_label_over (p, 0);
    1385          545 :   return p;
    1386              : }
    1387              : 
    1388              : #if defined ENABLE_GIMPLE_CHECKING
    1389              : /* Complain of a gimple type mismatch and die.  */
    1390              : 
    1391              : void
    1392            0 : gimple_check_failed (const gimple *gs, const char *file, int line,
    1393              :                      const char *function, enum gimple_code code,
    1394              :                      enum tree_code subcode)
    1395              : {
    1396            0 :   internal_error ("gimple check: expected %s(%s), have %s(%s) in %s, at %s:%d",
    1397            0 :                   gimple_code_name[code],
    1398              :                   get_tree_code_name (subcode),
    1399            0 :                   gimple_code_name[gimple_code (gs)],
    1400            0 :                   gs->subcode > 0
    1401            0 :                     ? get_tree_code_name ((enum tree_code) gs->subcode)
    1402              :                     : "",
    1403              :                   function, trim_filename (file), line);
    1404              : }
    1405              : #endif /* ENABLE_GIMPLE_CHECKING */
    1406              : 
    1407              : 
    1408              : /* Link gimple statement GS to the end of the sequence *SEQ_P.  If
    1409              :    *SEQ_P is NULL, a new sequence is allocated.  */
    1410              : 
    1411              : void
    1412     48260750 : gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs)
    1413              : {
    1414     48260750 :   gimple_stmt_iterator si;
    1415     48260750 :   if (gs == NULL)
    1416            0 :     return;
    1417              : 
    1418     48260750 :   si = gsi_last (*seq_p);
    1419     48260750 :   gsi_insert_after (&si, gs, GSI_NEW_STMT);
    1420              : }
    1421              : 
    1422              : /* Link gimple statement GS to the end of the sequence *SEQ_P.  If
    1423              :    *SEQ_P is NULL, a new sequence is allocated.  This function is
    1424              :    similar to gimple_seq_add_stmt, but does not scan the operands.
    1425              :    During gimplification, we need to manipulate statement sequences
    1426              :    before the def/use vectors have been constructed.  */
    1427              : 
    1428              : void
    1429    199728242 : gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs)
    1430              : {
    1431    199728242 :   gimple_stmt_iterator si;
    1432              : 
    1433    199728242 :   if (gs == NULL)
    1434            0 :     return;
    1435              : 
    1436    199728242 :   si = gsi_last (*seq_p);
    1437    199728242 :   gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT);
    1438              : }
    1439              : 
    1440              : /* Append sequence SRC to the end of sequence *DST_P.  If *DST_P is
    1441              :    NULL, a new sequence is allocated.  */
    1442              : 
    1443              : void
    1444     17244288 : gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
    1445              : {
    1446     17244288 :   gimple_stmt_iterator si;
    1447     17244288 :   if (src == NULL)
    1448      5224751 :     return;
    1449              : 
    1450     12019537 :   si = gsi_last (*dst_p);
    1451     12019537 :   gsi_insert_seq_after (&si, src, GSI_NEW_STMT);
    1452              : }
    1453              : 
    1454              : /* Append sequence SRC to the end of sequence *DST_P.  If *DST_P is
    1455              :    NULL, a new sequence is allocated.  This function is
    1456              :    similar to gimple_seq_add_seq, but does not scan the operands.  */
    1457              : 
    1458              : void
    1459       279861 : gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src)
    1460              : {
    1461       279861 :   gimple_stmt_iterator si;
    1462       279861 :   if (src == NULL)
    1463        98385 :     return;
    1464              : 
    1465       181476 :   si = gsi_last (*dst_p);
    1466       181476 :   gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT);
    1467              : }
    1468              : 
    1469              : /* Determine whether to assign a location to the statement GS.  */
    1470              : 
    1471              : static bool
    1472    268449994 : should_carry_location_p (gimple *gs)
    1473              : {
    1474              :   /* Don't emit a line note for a label.  We particularly don't want to
    1475              :      emit one for the break label, since it doesn't actually correspond
    1476              :      to the beginning of the loop/switch.  */
    1477    268449994 :   if (gimple_code (gs) == GIMPLE_LABEL)
    1478            0 :     return false;
    1479              : 
    1480              :   return true;
    1481              : }
    1482              : 
    1483              : /* Set the location for gimple statement GS to LOCATION.  */
    1484              : 
    1485              : static void
    1486    681869714 : annotate_one_with_location (gimple *gs, location_t location)
    1487              : {
    1488    681869714 :   if (!gimple_has_location (gs)
    1489    338105432 :       && !gimple_do_not_emit_location_p (gs)
    1490    681869714 :       && should_carry_location_p (gs))
    1491     26349258 :     gimple_set_location (gs, location);
    1492    681869714 : }
    1493              : 
    1494              : /* Set LOCATION for all the statements after iterator GSI in sequence
    1495              :    SEQ.  If GSI is pointing to the end of the sequence, start with the
    1496              :    first statement in SEQ.  */
    1497              : 
    1498              : void
    1499    101197487 : annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
    1500              :                                   location_t location)
    1501              : {
    1502    101197487 :   if (gsi_end_p (gsi))
    1503    101197487 :     gsi = gsi_start (seq);
    1504              :   else
    1505     66103413 :     gsi_next (&gsi);
    1506              : 
    1507    782713406 :   for (; !gsi_end_p (gsi); gsi_next (&gsi))
    1508    681515919 :     annotate_one_with_location (gsi_stmt (gsi), location);
    1509    101197487 : }
    1510              : 
    1511              : /* Set the location for all the statements in a sequence STMT_P to LOCATION.  */
    1512              : 
    1513              : void
    1514       231420 : annotate_all_with_location (gimple_seq stmt_p, location_t location)
    1515              : {
    1516       231420 :   gimple_stmt_iterator i;
    1517              : 
    1518       231420 :   if (gimple_seq_empty_p (stmt_p))
    1519       231420 :     return;
    1520              : 
    1521       576508 :   for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
    1522              :     {
    1523       353795 :       gimple *gs = gsi_stmt (i);
    1524       353795 :       annotate_one_with_location (gs, location);
    1525              :     }
    1526              : }
    1527              : 
    1528              : /* Helper function of empty_body_p.  Return true if STMT is an empty
    1529              :    statement.  */
    1530              : 
    1531              : static bool
    1532        36781 : empty_stmt_p (gimple *stmt)
    1533              : {
    1534        36781 :   if (gimple_code (stmt) == GIMPLE_NOP)
    1535              :     return true;
    1536        36779 :   if (gbind *bind_stmt = dyn_cast <gbind *> (stmt))
    1537        21824 :     return empty_body_p (gimple_bind_body (bind_stmt));
    1538              :   return false;
    1539              : }
    1540              : 
    1541              : 
    1542              : /* Return true if BODY contains nothing but empty statements.  */
    1543              : 
    1544              : bool
    1545        36860 : empty_body_p (gimple_seq body)
    1546              : {
    1547        36860 :   gimple_stmt_iterator i;
    1548              : 
    1549        36860 :   if (gimple_seq_empty_p (body))
    1550              :     return true;
    1551        36968 :   for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
    1552        36781 :     if (!empty_stmt_p (gsi_stmt (i))
    1553        36781 :         && !is_gimple_debug (gsi_stmt (i)))
    1554              :       return false;
    1555              : 
    1556              :   return true;
    1557              : }
    1558              : 
    1559              : 
    1560              : /* Perform a deep copy of sequence SRC and return the result.  */
    1561              : 
    1562              : gimple_seq
    1563      1911230 : gimple_seq_copy (gimple_seq src)
    1564              : {
    1565      1911230 :   gimple_stmt_iterator gsi;
    1566      1911230 :   gimple_seq new_seq = NULL;
    1567      1911230 :   gimple *stmt;
    1568              : 
    1569      4286979 :   for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
    1570              :     {
    1571      2375749 :       stmt = gimple_copy (gsi_stmt (gsi));
    1572      2375749 :       gimple_seq_add_stmt (&new_seq, stmt);
    1573              :     }
    1574              : 
    1575      1911230 :   return new_seq;
    1576              : }
    1577              : 
    1578              : 
    1579              : 
    1580              : /* Return true if calls C1 and C2 are known to go to the same function.  */
    1581              : 
    1582              : bool
    1583      1036842 : gimple_call_same_target_p (const gimple *c1, const gimple *c2)
    1584              : {
    1585      1036842 :   if (gimple_call_internal_p (c1))
    1586         8420 :     return (gimple_call_internal_p (c2)
    1587         8420 :             && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
    1588        16840 :             && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
    1589            0 :                 || c1 == c2));
    1590              :   else
    1591      1028422 :     return (gimple_call_fn (c1) == gimple_call_fn (c2)
    1592      1028422 :             || (gimple_call_fndecl (c1)
    1593      1027793 :                 && gimple_call_fndecl (c1) == gimple_call_fndecl (c2)));
    1594              : }
    1595              : 
    1596              : /* Detect flags from a GIMPLE_CALL.  This is just like
    1597              :    call_expr_flags, but for gimple tuples.  */
    1598              : 
    1599              : int
    1600   4405236556 : gimple_call_flags (const gimple *stmt)
    1601              : {
    1602   4405236556 :   int flags = 0;
    1603              : 
    1604   4405236556 :   if (gimple_call_internal_p (stmt))
    1605    123487988 :     flags = internal_fn_flags (gimple_call_internal_fn (stmt));
    1606              :   else
    1607              :     {
    1608   4281748568 :       tree decl = gimple_call_fndecl (stmt);
    1609   4281748568 :       if (decl)
    1610   4155846201 :         flags = flags_from_decl_or_type (decl);
    1611   4281748568 :       flags |= flags_from_decl_or_type (gimple_call_fntype (stmt));
    1612              :     }
    1613              : 
    1614   4405236556 :   if (stmt->subcode & GF_CALL_NOTHROW)
    1615    782996352 :     flags |= ECF_NOTHROW;
    1616   4405236556 :   if (stmt->subcode & GF_CALL_XTHROW)
    1617     16936748 :     flags |= ECF_XTHROW;
    1618              : 
    1619   4405236556 :   if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
    1620            0 :     flags |= ECF_BY_DESCRIPTOR;
    1621              : 
    1622   4405236556 :   return flags;
    1623              : }
    1624              : 
    1625              : /* Return the "fn spec" string for call STMT.  */
    1626              : 
    1627              : attr_fnspec
    1628    456858172 : gimple_call_fnspec (const gcall *stmt)
    1629              : {
    1630    456858172 :   tree type, attr;
    1631              : 
    1632    456858172 :   if (gimple_call_internal_p (stmt))
    1633              :     {
    1634      9784896 :       const_tree spec = internal_fn_fnspec (gimple_call_internal_fn (stmt));
    1635      9784896 :       if (spec)
    1636       394378 :         return spec;
    1637              :       else
    1638      9390518 :         return "";
    1639              :     }
    1640              : 
    1641    447073276 :   type = gimple_call_fntype (stmt);
    1642    447073276 :   if (type)
    1643              :     {
    1644    447073276 :       attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
    1645    447073276 :       if (attr)
    1646     61660571 :         return TREE_VALUE (TREE_VALUE (attr));
    1647              :     }
    1648    385412705 :   if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
    1649    114984768 :     return builtin_fnspec (gimple_call_fndecl (stmt));
    1650    270427937 :   tree fndecl = gimple_call_fndecl (stmt);
    1651              :   /* If the call is to a replaceable operator delete and results
    1652              :      from a delete expression as opposed to a direct call to
    1653              :      such operator, then we can treat it as free.  */
    1654    270427937 :   if (fndecl
    1655    256280137 :       && DECL_IS_OPERATOR_DELETE_P (fndecl)
    1656      8071399 :       && DECL_IS_REPLACEABLE_OPERATOR (fndecl)
    1657    278493473 :       && gimple_call_from_new_or_delete (stmt))
    1658              :     {
    1659      8009956 :       if (flag_assume_sane_operators_new_delete)
    1660      8008461 :         return ".co ";
    1661              :       else
    1662         1495 :         return ". o ";
    1663              :     }
    1664              :   /* Similarly operator new can be treated as malloc.  */
    1665    262417981 :   if (fndecl
    1666    248270181 :       && DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
    1667    265645047 :       && gimple_call_from_new_or_delete (stmt))
    1668              :     {
    1669      3192157 :       if (flag_assume_sane_operators_new_delete)
    1670      3191164 :         return "mC";
    1671              :       else
    1672          993 :         return "m ";
    1673              :     }
    1674    259225824 :   return "";
    1675              : }
    1676              : 
    1677              : /* Detects argument flags for argument number ARG on call STMT.  */
    1678              : 
    1679              : int
    1680    125838648 : gimple_call_arg_flags (const gcall *stmt, unsigned arg)
    1681              : {
    1682    125838648 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1683    125838648 :   int flags = 0;
    1684              : 
    1685    125838648 :   if (fnspec.known_p ())
    1686     24614908 :     flags = fnspec.arg_eaf_flags (arg);
    1687    125838648 :   tree callee = gimple_call_fndecl (stmt);
    1688    125838648 :   if (callee)
    1689              :     {
    1690    117755561 :       cgraph_node *node = cgraph_node::get (callee);
    1691    117755561 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1692              :                                 : NULL;
    1693              : 
    1694    117536945 :       if (summary && summary->arg_flags.length () > arg)
    1695              :         {
    1696     24102200 :           int modref_flags = summary->arg_flags[arg];
    1697              : 
    1698              :           /* We have possibly optimized out load.  Be conservative here.  */
    1699     24102200 :           if (!node->binds_to_current_def_p ())
    1700     12123026 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1701     24102200 :           if (dbg_cnt (ipa_mod_ref_pta))
    1702     24102200 :             flags |= modref_flags;
    1703              :         }
    1704              :     }
    1705    125838648 :   return flags;
    1706              : }
    1707              : 
    1708              : /* Detects argument flags for return slot on call STMT.  */
    1709              : 
    1710              : int
    1711       102969 : gimple_call_retslot_flags (const gcall *stmt)
    1712              : {
    1713       102969 :   int flags = implicit_retslot_eaf_flags;
    1714              : 
    1715       102969 :   tree callee = gimple_call_fndecl (stmt);
    1716       102969 :   if (callee)
    1717              :     {
    1718        94205 :       cgraph_node *node = cgraph_node::get (callee);
    1719        94205 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1720              :                                 : NULL;
    1721              : 
    1722        94205 :       if (summary)
    1723              :         {
    1724        65921 :           int modref_flags = summary->retslot_flags;
    1725              : 
    1726              :           /* We have possibly optimized out load.  Be conservative here.  */
    1727        65921 :           if (!node->binds_to_current_def_p ())
    1728        55401 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1729        65921 :           if (dbg_cnt (ipa_mod_ref_pta))
    1730        65921 :             flags |= modref_flags;
    1731              :         }
    1732              :     }
    1733       102969 :   return flags;
    1734              : }
    1735              : 
    1736              : /* Detects argument flags for static chain on call STMT.  */
    1737              : 
    1738              : int
    1739       180519 : gimple_call_static_chain_flags (const gcall *stmt)
    1740              : {
    1741       180519 :   int flags = 0;
    1742              : 
    1743       180519 :   tree callee = gimple_call_fndecl (stmt);
    1744       180519 :   if (callee)
    1745              :     {
    1746        28011 :       cgraph_node *node = cgraph_node::get (callee);
    1747        28011 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1748              :                                 : NULL;
    1749              : 
    1750              :       /* Nested functions should always bind to current def since
    1751              :          there is no public ABI for them.  */
    1752        28011 :       gcc_checking_assert (node->binds_to_current_def_p ());
    1753        28011 :       if (summary)
    1754              :         {
    1755        26174 :           int modref_flags = summary->static_chain_flags;
    1756              : 
    1757        26174 :           if (dbg_cnt (ipa_mod_ref_pta))
    1758       180519 :             flags |= modref_flags;
    1759              :         }
    1760              :     }
    1761       180519 :   return flags;
    1762              : }
    1763              : 
    1764              : /* Detects return flags for the call STMT.  */
    1765              : 
    1766              : int
    1767     50098767 : gimple_call_return_flags (const gcall *stmt)
    1768              : {
    1769     50098767 :   if (gimple_call_flags (stmt) & ECF_MALLOC)
    1770              :     return ERF_NOALIAS;
    1771              : 
    1772     48000875 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1773              : 
    1774     48000875 :   unsigned int arg_no;
    1775     48000875 :   if (fnspec.returns_arg (&arg_no))
    1776      1132805 :     return ERF_RETURNS_ARG | arg_no;
    1777              : 
    1778     46868070 :   if (fnspec.returns_noalias_p ())
    1779         6076 :     return ERF_NOALIAS;
    1780              :   return 0;
    1781              : }
    1782              : 
    1783              : 
    1784              : /* Return true if call STMT is known to return a non-zero result.  */
    1785              : 
    1786              : bool
    1787     13686928 : gimple_call_nonnull_result_p (gcall *call)
    1788              : {
    1789     13686928 :   tree fndecl = gimple_call_fndecl (call);
    1790     13686928 :   if (!fndecl)
    1791              :     return false;
    1792     12508585 :   if (flag_delete_null_pointer_checks && !flag_check_new
    1793     12508530 :       && DECL_IS_OPERATOR_NEW_P (fndecl)
    1794     13082765 :       && !TREE_NOTHROW (fndecl))
    1795              :     return true;
    1796              : 
    1797              :   /* References are always non-NULL.  */
    1798     11950271 :   if (flag_delete_null_pointer_checks
    1799     11950271 :       && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
    1800              :     return true;
    1801              : 
    1802     11950271 :   if (flag_delete_null_pointer_checks
    1803     23894050 :       && lookup_attribute ("returns_nonnull",
    1804     11943779 :                            TYPE_ATTRIBUTES (gimple_call_fntype (call))))
    1805              :     return true;
    1806     11883897 :   return gimple_alloca_call_p (call);
    1807              : }
    1808              : 
    1809              : 
    1810              : /* If CALL returns a non-null result in an argument, return that arg.  */
    1811              : 
    1812              : tree
    1813     12989986 : gimple_call_nonnull_arg (gcall *call)
    1814              : {
    1815     12989986 :   tree fndecl = gimple_call_fndecl (call);
    1816     12989986 :   if (!fndecl)
    1817              :     return NULL_TREE;
    1818              : 
    1819     11818135 :   unsigned rf = gimple_call_return_flags (call);
    1820     11818135 :   if (rf & ERF_RETURNS_ARG)
    1821              :     {
    1822            0 :       unsigned argnum = rf & ERF_RETURN_ARG_MASK;
    1823            0 :       if (argnum < gimple_call_num_args (call))
    1824              :         {
    1825            0 :           tree arg = gimple_call_arg (call, argnum);
    1826            0 :           if (SSA_VAR_P (arg)
    1827            0 :               && infer_nonnull_range_by_attribute (call, arg))
    1828            0 :             return arg;
    1829              :         }
    1830              :     }
    1831              :   return NULL_TREE;
    1832              : }
    1833              : 
    1834              : 
    1835              : /* Return true if GS is a copy assignment.  */
    1836              : 
    1837              : bool
    1838    204440705 : gimple_assign_copy_p (gimple *gs)
    1839              : {
    1840    204440705 :   return (gimple_assign_single_p (gs)
    1841    204440705 :           && is_gimple_val (gimple_op (gs, 1)));
    1842              : }
    1843              : 
    1844              : 
    1845              : /* Return true if GS is a SSA_NAME copy assignment.  */
    1846              : 
    1847              : bool
    1848     41079125 : gimple_assign_ssa_name_copy_p (gimple *gs)
    1849              : {
    1850     41079125 :   return (gimple_assign_single_p (gs)
    1851     23294464 :           && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
    1852     54608020 :           && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME);
    1853              : }
    1854              : 
    1855              : 
    1856              : /* Return true if GS is an assignment with a unary RHS, but the
    1857              :    operator has no effect on the assigned value.  The logic is adapted
    1858              :    from STRIP_NOPS.  This predicate is intended to be used in tuplifying
    1859              :    instances in which STRIP_NOPS was previously applied to the RHS of
    1860              :    an assignment.
    1861              : 
    1862              :    NOTE: In the use cases that led to the creation of this function
    1863              :    and of gimple_assign_single_p, it is typical to test for either
    1864              :    condition and to proceed in the same manner.  In each case, the
    1865              :    assigned value is represented by the single RHS operand of the
    1866              :    assignment.  I suspect there may be cases where gimple_assign_copy_p,
    1867              :    gimple_assign_single_p, or equivalent logic is used where a similar
    1868              :    treatment of unary NOPs is appropriate.  */
    1869              : 
    1870              : bool
    1871        47195 : gimple_assign_unary_nop_p (gimple *gs)
    1872              : {
    1873        47195 :   return (is_gimple_assign (gs)
    1874        47195 :           && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
    1875        41725 :               || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
    1876         5470 :           && gimple_assign_rhs1 (gs) != error_mark_node
    1877        58135 :           && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
    1878         5470 :               == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs)))));
    1879              : }
    1880              : 
    1881              : /* Return true if GS is an assignment that loads from its rhs1.  */
    1882              : 
    1883              : bool
    1884    554980759 : gimple_assign_load_p (const gimple *gs)
    1885              : {
    1886    554980759 :   tree rhs;
    1887    554980759 :   if (!gimple_assign_single_p (gs))
    1888              :     return false;
    1889    337403738 :   rhs = gimple_assign_rhs1 (gs);
    1890    337403738 :   if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
    1891              :     return true;
    1892    337403734 :   if (handled_component_p (rhs))
    1893     91993888 :     rhs = TREE_OPERAND (rhs, 0);
    1894    337403734 :   return (handled_component_p (rhs)
    1895    311086099 :           || DECL_P (rhs)
    1896    251919958 :           || TREE_CODE (rhs) == MEM_REF
    1897    185998626 :           || TREE_CODE (rhs) == TARGET_MEM_REF);
    1898              : }
    1899              : 
    1900              : 
    1901              : /* Set BB to be the basic block holding G.  */
    1902              : 
    1903              : void
    1904    767713526 : gimple_set_bb (gimple *stmt, basic_block bb)
    1905              : {
    1906    767713526 :   stmt->bb = bb;
    1907              : 
    1908    767713526 :   if (gimple_code (stmt) != GIMPLE_LABEL)
    1909              :     return;
    1910              : 
    1911              :   /* If the statement is a label, add the label to block-to-labels map
    1912              :      so that we can speed up edge creation for GIMPLE_GOTOs.  */
    1913     39384383 :   if (cfun->cfg)
    1914              :     {
    1915     39384269 :       tree t;
    1916     39384269 :       int uid;
    1917              : 
    1918     39384269 :       t = gimple_label_label (as_a <glabel *> (stmt));
    1919     39384269 :       uid = LABEL_DECL_UID (t);
    1920     39384269 :       if (uid == -1)
    1921              :         {
    1922     20089181 :           unsigned old_len =
    1923     20089181 :             vec_safe_length (label_to_block_map_for_fn (cfun));
    1924     20089181 :           LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
    1925     20089181 :           if (old_len <= (unsigned) uid)
    1926      9515301 :             vec_safe_grow_cleared (label_to_block_map_for_fn (cfun), uid + 1);
    1927              :         }
    1928              : 
    1929     39384269 :       (*label_to_block_map_for_fn (cfun))[uid] = bb;
    1930              :     }
    1931              : }
    1932              : 
    1933              : 
    1934              : /* Modify the RHS of the assignment pointed-to by GSI using the
    1935              :    operands in the expression tree EXPR.
    1936              : 
    1937              :    NOTE: The statement pointed-to by GSI may be reallocated if it
    1938              :    did not have enough operand slots.
    1939              : 
    1940              :    This function is useful to convert an existing tree expression into
    1941              :    the flat representation used for the RHS of a GIMPLE assignment.
    1942              :    It will reallocate memory as needed to expand or shrink the number
    1943              :    of operand slots needed to represent EXPR.
    1944              : 
    1945              :    NOTE: If you find yourself building a tree and then calling this
    1946              :    function, you are most certainly doing it the slow way.  It is much
    1947              :    better to build a new assignment or to use the function
    1948              :    gimple_assign_set_rhs_with_ops, which does not require an
    1949              :    expression tree to be built.  */
    1950              : 
    1951              : void
    1952      5323685 : gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
    1953              : {
    1954      5323685 :   enum tree_code subcode;
    1955      5323685 :   tree op1, op2, op3;
    1956              : 
    1957      5323685 :   extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
    1958      5323685 :   gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
    1959      5323685 : }
    1960              : 
    1961              : 
    1962              : /* Set the RHS of assignment statement pointed-to by GSI to CODE with
    1963              :    operands OP1, OP2 and OP3.
    1964              : 
    1965              :    NOTE: The statement pointed-to by GSI may be reallocated if it
    1966              :    did not have enough operand slots.  */
    1967              : 
    1968              : void
    1969      8062439 : gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
    1970              :                                 tree op1, tree op2, tree op3)
    1971              : {
    1972      8062439 :   unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
    1973      8062439 :   gimple *stmt = gsi_stmt (*gsi);
    1974      8062439 :   gimple *old_stmt = stmt;
    1975              : 
    1976              :   /* If the new CODE needs more operands, allocate a new statement.  */
    1977      8062439 :   if (gimple_num_ops (stmt) < new_rhs_ops + 1)
    1978              :     {
    1979       207130 :       tree lhs = gimple_assign_lhs (old_stmt);
    1980       207130 :       stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
    1981       207130 :       memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
    1982       207130 :       gimple_init_singleton (stmt);
    1983              : 
    1984              :       /* The LHS needs to be reset as this also changes the SSA name
    1985              :          on the LHS.  */
    1986       207130 :       gimple_assign_set_lhs (stmt, lhs);
    1987              :     }
    1988              : 
    1989      8062439 :   gimple_set_num_ops (stmt, new_rhs_ops + 1);
    1990      8062439 :   gimple_set_subcode (stmt, code);
    1991      8062439 :   gimple_assign_set_rhs1 (stmt, op1);
    1992      8062439 :   if (new_rhs_ops > 1)
    1993      1191692 :     gimple_assign_set_rhs2 (stmt, op2);
    1994      1191692 :   if (new_rhs_ops > 2)
    1995        36358 :     gimple_assign_set_rhs3 (stmt, op3);
    1996      8062439 :   if (stmt != old_stmt)
    1997       207130 :     gsi_replace (gsi, stmt, false);
    1998      8062439 : }
    1999              : 
    2000              : 
    2001              : /* Return the LHS of a statement that performs an assignment,
    2002              :    either a GIMPLE_ASSIGN or a GIMPLE_CALL.  Returns NULL_TREE
    2003              :    for a call to a function that returns no value, or for a
    2004              :    statement other than an assignment or a call.  */
    2005              : 
    2006              : tree
    2007   7696565031 : gimple_get_lhs (const gimple *stmt)
    2008              : {
    2009   7696565031 :   enum gimple_code code = gimple_code (stmt);
    2010              : 
    2011   7696565031 :   if (code == GIMPLE_ASSIGN)
    2012   4756024968 :     return gimple_assign_lhs (stmt);
    2013   2940540063 :   else if (code == GIMPLE_CALL)
    2014    551786414 :     return gimple_call_lhs (stmt);
    2015   2388753649 :   else if (code == GIMPLE_PHI)
    2016    146322511 :     return gimple_phi_result (stmt);
    2017              :   else
    2018              :     return NULL_TREE;
    2019              : }
    2020              : 
    2021              : 
    2022              : /* Set the LHS of a statement that performs an assignment,
    2023              :    either a GIMPLE_ASSIGN or a GIMPLE_CALL.  */
    2024              : 
    2025              : void
    2026      2264501 : gimple_set_lhs (gimple *stmt, tree lhs)
    2027              : {
    2028      2264501 :   enum gimple_code code = gimple_code (stmt);
    2029              : 
    2030      2264501 :   if (code == GIMPLE_ASSIGN)
    2031      1052447 :     gimple_assign_set_lhs (stmt, lhs);
    2032      1212054 :   else if (code == GIMPLE_CALL)
    2033      1212054 :     gimple_call_set_lhs (stmt, lhs);
    2034              :   else
    2035            0 :     gcc_unreachable ();
    2036      2264501 : }
    2037              : 
    2038              : 
    2039              : /* Return a deep copy of statement STMT.  All the operands from STMT
    2040              :    are reallocated and copied using unshare_expr.  The DEF, USE, VDEF
    2041              :    and VUSE operand arrays are set to empty in the new copy.  The new
    2042              :    copy isn't part of any sequence.  */
    2043              : 
    2044              : gimple *
    2045     77030419 : gimple_copy (gimple *stmt)
    2046              : {
    2047     77030419 :   enum gimple_code code = gimple_code (stmt);
    2048     77030419 :   unsigned num_ops = gimple_num_ops (stmt);
    2049     77030419 :   gimple *copy = gimple_alloc (code, num_ops);
    2050     77030419 :   unsigned i;
    2051              : 
    2052              :   /* Shallow copy all the fields from STMT.  */
    2053     77030419 :   memcpy (copy, stmt, gimple_size (code));
    2054     77030419 :   gimple_init_singleton (copy);
    2055              : 
    2056              :   /* If STMT has sub-statements, deep-copy them as well.  */
    2057     77030419 :   if (gimple_has_substatements (stmt))
    2058              :     {
    2059        42597 :       gimple_seq new_seq;
    2060        42597 :       tree t;
    2061              : 
    2062        42597 :       switch (gimple_code (stmt))
    2063              :         {
    2064          357 :         case GIMPLE_BIND:
    2065          357 :           {
    2066          357 :             gbind *bind_stmt = as_a <gbind *> (stmt);
    2067          357 :             gbind *bind_copy = as_a <gbind *> (copy);
    2068          357 :             new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
    2069          357 :             gimple_bind_set_body (bind_copy, new_seq);
    2070          357 :             gimple_bind_set_vars (bind_copy,
    2071              :                                   unshare_expr (gimple_bind_vars (bind_stmt)));
    2072          357 :             gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
    2073              :           }
    2074          357 :           break;
    2075              : 
    2076        17498 :         case GIMPLE_CATCH:
    2077        17498 :           {
    2078        17498 :             gcatch *catch_stmt = as_a <gcatch *> (stmt);
    2079        17498 :             gcatch *catch_copy = as_a <gcatch *> (copy);
    2080        17498 :             new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt));
    2081        17498 :             gimple_catch_set_handler (catch_copy, new_seq);
    2082        17498 :             t = unshare_expr (gimple_catch_types (catch_stmt));
    2083        17498 :             gimple_catch_set_types (catch_copy, t);
    2084              :           }
    2085        17498 :           break;
    2086              : 
    2087            0 :         case GIMPLE_EH_FILTER:
    2088            0 :           {
    2089            0 :             geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt);
    2090            0 :             geh_filter *eh_filter_copy = as_a <geh_filter *> (copy);
    2091            0 :             new_seq
    2092            0 :               = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt));
    2093            0 :             gimple_eh_filter_set_failure (eh_filter_copy, new_seq);
    2094            0 :             t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt));
    2095            0 :             gimple_eh_filter_set_types (eh_filter_copy, t);
    2096              :           }
    2097            0 :           break;
    2098              : 
    2099          273 :         case GIMPLE_EH_ELSE:
    2100          273 :           {
    2101          273 :             geh_else *eh_else_stmt = as_a <geh_else *> (stmt);
    2102          273 :             geh_else *eh_else_copy = as_a <geh_else *> (copy);
    2103          273 :             new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt));
    2104          273 :             gimple_eh_else_set_n_body (eh_else_copy, new_seq);
    2105          273 :             new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt));
    2106          273 :             gimple_eh_else_set_e_body (eh_else_copy, new_seq);
    2107              :           }
    2108          273 :           break;
    2109              : 
    2110        24187 :         case GIMPLE_TRY:
    2111        24187 :           {
    2112        24187 :             gtry *try_stmt = as_a <gtry *> (stmt);
    2113        24187 :             gtry *try_copy = as_a <gtry *> (copy);
    2114        24187 :             new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
    2115        24187 :             gimple_try_set_eval (try_copy, new_seq);
    2116        24187 :             new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
    2117        24187 :             gimple_try_set_cleanup (try_copy, new_seq);
    2118              :           }
    2119        24187 :           break;
    2120              : 
    2121          276 :         case GIMPLE_OMP_FOR:
    2122          276 :           new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
    2123          276 :           gimple_omp_for_set_pre_body (copy, new_seq);
    2124          276 :           t = unshare_expr (gimple_omp_for_clauses (stmt));
    2125          276 :           gimple_omp_for_set_clauses (copy, t);
    2126          276 :           {
    2127          276 :             gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
    2128          276 :             omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
    2129          276 :               ( gimple_omp_for_collapse (stmt));
    2130              :           }
    2131          564 :           for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
    2132              :             {
    2133          288 :               gimple_omp_for_set_cond (copy, i,
    2134              :                                        gimple_omp_for_cond (stmt, i));
    2135          288 :               gimple_omp_for_set_index (copy, i,
    2136              :                                         gimple_omp_for_index (stmt, i));
    2137          288 :               t = unshare_expr (gimple_omp_for_initial (stmt, i));
    2138          288 :               gimple_omp_for_set_initial (copy, i, t);
    2139          288 :               t = unshare_expr (gimple_omp_for_final (stmt, i));
    2140          288 :               gimple_omp_for_set_final (copy, i, t);
    2141          288 :               t = unshare_expr (gimple_omp_for_incr (stmt, i));
    2142          288 :               gimple_omp_for_set_incr (copy, i, t);
    2143              :             }
    2144          276 :           goto copy_omp_body;
    2145              : 
    2146            0 :         case GIMPLE_OMP_PARALLEL:
    2147            0 :           {
    2148            0 :             gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt);
    2149            0 :             gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy);
    2150            0 :             t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt));
    2151            0 :             gimple_omp_parallel_set_clauses (omp_par_copy, t);
    2152            0 :             t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt));
    2153            0 :             gimple_omp_parallel_set_child_fn (omp_par_copy, t);
    2154            0 :             t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt));
    2155            0 :             gimple_omp_parallel_set_data_arg (omp_par_copy, t);
    2156              :           }
    2157            0 :           goto copy_omp_body;
    2158              : 
    2159            0 :         case GIMPLE_OMP_TASK:
    2160            0 :           t = unshare_expr (gimple_omp_task_clauses (stmt));
    2161            0 :           gimple_omp_task_set_clauses (copy, t);
    2162            0 :           t = unshare_expr (gimple_omp_task_child_fn (stmt));
    2163            0 :           gimple_omp_task_set_child_fn (copy, t);
    2164            0 :           t = unshare_expr (gimple_omp_task_data_arg (stmt));
    2165            0 :           gimple_omp_task_set_data_arg (copy, t);
    2166            0 :           t = unshare_expr (gimple_omp_task_copy_fn (stmt));
    2167            0 :           gimple_omp_task_set_copy_fn (copy, t);
    2168            0 :           t = unshare_expr (gimple_omp_task_arg_size (stmt));
    2169            0 :           gimple_omp_task_set_arg_size (copy, t);
    2170            0 :           t = unshare_expr (gimple_omp_task_arg_align (stmt));
    2171            0 :           gimple_omp_task_set_arg_align (copy, t);
    2172            0 :           goto copy_omp_body;
    2173              : 
    2174            0 :         case GIMPLE_OMP_CRITICAL:
    2175            0 :           t = unshare_expr (gimple_omp_critical_name
    2176            0 :                                 (as_a <gomp_critical *> (stmt)));
    2177            0 :           gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t);
    2178            0 :           t = unshare_expr (gimple_omp_critical_clauses
    2179            0 :                                 (as_a <gomp_critical *> (stmt)));
    2180            0 :           gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t);
    2181            0 :           goto copy_omp_body;
    2182              : 
    2183            0 :         case GIMPLE_OMP_ORDERED:
    2184            0 :           t = unshare_expr (gimple_omp_ordered_clauses
    2185            0 :                                 (as_a <gomp_ordered *> (stmt)));
    2186            0 :           gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t);
    2187            0 :           goto copy_omp_body;
    2188              : 
    2189            0 :         case GIMPLE_OMP_SCAN:
    2190            0 :           t = gimple_omp_scan_clauses (as_a <gomp_scan *> (stmt));
    2191            0 :           t = unshare_expr (t);
    2192            0 :           gimple_omp_scan_set_clauses (as_a <gomp_scan *> (copy), t);
    2193            0 :           goto copy_omp_body;
    2194              : 
    2195            0 :         case GIMPLE_OMP_TASKGROUP:
    2196            0 :           t = unshare_expr (gimple_omp_taskgroup_clauses (stmt));
    2197            0 :           gimple_omp_taskgroup_set_clauses (copy, t);
    2198            0 :           goto copy_omp_body;
    2199              : 
    2200            0 :         case GIMPLE_OMP_SECTIONS:
    2201            0 :           t = unshare_expr (gimple_omp_sections_clauses (stmt));
    2202            0 :           gimple_omp_sections_set_clauses (copy, t);
    2203            0 :           t = unshare_expr (gimple_omp_sections_control (stmt));
    2204            0 :           gimple_omp_sections_set_control (copy, t);
    2205            0 :           goto copy_omp_body;
    2206              : 
    2207            0 :         case GIMPLE_OMP_SINGLE:
    2208            0 :           {
    2209            0 :             gomp_single *omp_single_copy = as_a <gomp_single *> (copy);
    2210            0 :             t = unshare_expr (gimple_omp_single_clauses (stmt));
    2211            0 :             gimple_omp_single_set_clauses (omp_single_copy, t);
    2212              :           }
    2213            0 :           goto copy_omp_body;
    2214              : 
    2215            0 :         case GIMPLE_OMP_SCOPE:
    2216            0 :           t = unshare_expr (gimple_omp_scope_clauses (stmt));
    2217            0 :           gimple_omp_scope_set_clauses (copy, t);
    2218            0 :           goto copy_omp_body;
    2219              : 
    2220            0 :         case GIMPLE_OMP_DISPATCH:
    2221            0 :           t = unshare_expr (gimple_omp_dispatch_clauses (stmt));
    2222            0 :           gimple_omp_dispatch_set_clauses (copy, t);
    2223            0 :           goto copy_omp_body;
    2224              : 
    2225            0 :         case GIMPLE_OMP_INTEROP:
    2226            0 :           t = unshare_expr (gimple_omp_interop_clauses (stmt));
    2227            0 :           gimple_omp_interop_set_clauses (copy, t);
    2228            0 :           break;
    2229              : 
    2230            0 :         case GIMPLE_OMP_TARGET:
    2231            0 :           {
    2232            0 :             gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt);
    2233            0 :             gomp_target *omp_target_copy = as_a <gomp_target *> (copy);
    2234            0 :             t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt));
    2235            0 :             gimple_omp_target_set_clauses (omp_target_copy, t);
    2236            0 :             t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt));
    2237            0 :             gimple_omp_target_set_data_arg (omp_target_copy, t);
    2238              :           }
    2239            0 :           goto copy_omp_body;
    2240              : 
    2241            0 :         case GIMPLE_OMP_TEAMS:
    2242            0 :           {
    2243            0 :             gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy);
    2244            0 :             t = unshare_expr (gimple_omp_teams_clauses (stmt));
    2245            0 :             gimple_omp_teams_set_clauses (omp_teams_copy, t);
    2246              :           }
    2247              :           /* FALLTHRU  */
    2248              : 
    2249          276 :         case GIMPLE_OMP_SECTION:
    2250          276 :         case GIMPLE_OMP_MASTER:
    2251          276 :         case GIMPLE_OMP_STRUCTURED_BLOCK:
    2252          276 :         copy_omp_body:
    2253          276 :           new_seq = gimple_seq_copy (gimple_omp_body (stmt));
    2254          276 :           gimple_omp_set_body (copy, new_seq);
    2255          276 :           break;
    2256              : 
    2257            0 :         case GIMPLE_OMP_MASKED:
    2258            0 :           t = unshare_expr (gimple_omp_masked_clauses (stmt));
    2259            0 :           gimple_omp_masked_set_clauses (copy, t);
    2260            0 :           goto copy_omp_body;
    2261              : 
    2262            0 :         case GIMPLE_ASSUME:
    2263            0 :           new_seq = gimple_seq_copy (gimple_assume_body (stmt));
    2264            0 :           *gimple_assume_body_ptr (copy) = new_seq;
    2265            0 :           gimple_assume_set_guard (copy,
    2266              :                                    unshare_expr (gimple_assume_guard (stmt)));
    2267            0 :           break;
    2268              : 
    2269            6 :         case GIMPLE_TRANSACTION:
    2270            6 :           new_seq = gimple_seq_copy (gimple_transaction_body (
    2271            6 :                                        as_a <gtransaction *> (stmt)));
    2272            6 :           gimple_transaction_set_body (as_a <gtransaction *> (copy),
    2273              :                                        new_seq);
    2274            6 :           break;
    2275              : 
    2276            0 :         case GIMPLE_WITH_CLEANUP_EXPR:
    2277            0 :           new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt));
    2278            0 :           gimple_wce_set_cleanup (copy, new_seq);
    2279            0 :           break;
    2280              : 
    2281            0 :         default:
    2282            0 :           gcc_unreachable ();
    2283              :         }
    2284              :     }
    2285              : 
    2286     77030419 :   switch (gimple_code (stmt))
    2287              :     {
    2288            0 :     case GIMPLE_OMP_ATOMIC_LOAD:
    2289            0 :       {
    2290            0 :         gomp_atomic_load *g = as_a <gomp_atomic_load *> (copy);
    2291            0 :         gimple_omp_atomic_load_set_lhs (g,
    2292              :           unshare_expr (gimple_omp_atomic_load_lhs (g)));
    2293            0 :         gimple_omp_atomic_load_set_rhs (g,
    2294              :           unshare_expr (gimple_omp_atomic_load_rhs (g)));
    2295            0 :         break;
    2296              :       }
    2297            0 :     case GIMPLE_OMP_ATOMIC_STORE:
    2298            0 :       {
    2299            0 :         gomp_atomic_store *g = as_a <gomp_atomic_store *> (copy);
    2300            0 :         gimple_omp_atomic_store_set_val (g,
    2301              :           unshare_expr (gimple_omp_atomic_store_val (g)));
    2302            0 :         break;
    2303              :       }
    2304              :     default:
    2305              :       break;
    2306              :     }
    2307              : 
    2308              :   /* Make copy of operands.  */
    2309    234659028 :   for (i = 0; i < num_ops; i++)
    2310    157628609 :     gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
    2311              : 
    2312     77030419 :   if (gimple_has_mem_ops (stmt))
    2313              :     {
    2314     34916793 :       gimple_set_vdef (copy, gimple_vdef (stmt));
    2315     34916793 :       gimple_set_vuse (copy, gimple_vuse (stmt));
    2316              :     }
    2317              : 
    2318              :   /* Clear out SSA operand vectors on COPY.  */
    2319     77030419 :   if (gimple_has_ops (stmt))
    2320              :     {
    2321     76573994 :       gimple_set_use_ops (copy, NULL);
    2322              : 
    2323              :       /* SSA operands need to be updated.  */
    2324     76573994 :       gimple_set_modified (copy, true);
    2325              :     }
    2326              : 
    2327     77030419 :   if (gimple_debug_nonbind_marker_p (stmt))
    2328     17146172 :     cfun->debug_marker_count++;
    2329              : 
    2330     77030419 :   return copy;
    2331              : }
    2332              : 
    2333              : /* Move OLD_STMT's vuse and vdef operands to NEW_STMT, on the assumption
    2334              :    that OLD_STMT is about to be removed.  */
    2335              : 
    2336              : void
    2337       768114 : gimple_move_vops (gimple *new_stmt, gimple *old_stmt)
    2338              : {
    2339       768114 :   tree vdef = gimple_vdef (old_stmt);
    2340      1536228 :   gimple_set_vuse (new_stmt, gimple_vuse (old_stmt));
    2341       768114 :   gimple_set_vdef (new_stmt, vdef);
    2342       768114 :   if (vdef && TREE_CODE (vdef) == SSA_NAME)
    2343       267840 :     SSA_NAME_DEF_STMT (vdef) = new_stmt;
    2344       768114 : }
    2345              : 
    2346              : /* Return true if statement S has side-effects.  We consider a
    2347              :    statement to have side effects if:
    2348              : 
    2349              :    - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST.
    2350              :    - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS.  */
    2351              : 
    2352              : bool
    2353    897935792 : gimple_has_side_effects (const gimple *s)
    2354              : {
    2355    897935792 :   if (is_gimple_debug (s))
    2356              :     return false;
    2357              : 
    2358              :   /* We don't have to scan the arguments to check for
    2359              :      volatile arguments, though, at present, we still
    2360              :      do a scan to check for TREE_SIDE_EFFECTS.  */
    2361   1345369519 :   if (gimple_has_volatile_ops (s))
    2362              :     return true;
    2363              : 
    2364    676051713 :   if (gimple_code (s) == GIMPLE_ASM
    2365    676051713 :       && gimple_asm_volatile_p (as_a <const gasm *> (s)))
    2366              :     return true;
    2367              : 
    2368    675515381 :   if (is_gimple_call (s))
    2369              :     {
    2370     97225570 :       int flags = gimple_call_flags (s);
    2371              : 
    2372              :       /* An infinite loop is considered a side effect.  */
    2373     97225570 :       if (!(flags & (ECF_CONST | ECF_PURE))
    2374     19249764 :           || (flags & ECF_LOOPING_CONST_OR_PURE))
    2375              :         return true;
    2376              : 
    2377     17057386 :       return false;
    2378              :     }
    2379              : 
    2380              :   return false;
    2381              : }
    2382              : 
    2383              : /* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
    2384              :    Return true if S can trap.  When INCLUDE_MEM is true, check whether
    2385              :    the memory operations could trap.  When INCLUDE_STORES is true, also
    2386              :    check a memory LHS with store semantics.  */
    2387              : 
    2388              : bool
    2389     77085092 : gimple_could_trap_p_1 (const gimple *s, bool include_mem, bool include_stores)
    2390              : {
    2391     77085092 :   tree t, div = NULL_TREE;
    2392     77085092 :   enum tree_code op;
    2393              : 
    2394     77085092 :   if (include_mem)
    2395              :     {
    2396     51944823 :       unsigned i, start = 0;
    2397              : 
    2398              :       /* Use store semantics for the LHS.  A call marked for return-slot
    2399              :          optimization can still use a temporary and a caller-side copy.  */
    2400     51944823 :       if (include_stores
    2401     47640082 :           && gimple_store_p (s)
    2402     56680416 :           && lhs_could_trap_p (gimple_get_lhs (s)))
    2403              :         return true;
    2404              : 
    2405     52276643 :       if (gimple_has_lhs (s))
    2406     51368356 :         start = 1;
    2407              : 
    2408    132695612 :       for (i = start; i < gimple_num_ops (s); i++)
    2409     86138640 :         if (tree_could_trap_p (gimple_op (s, i)))
    2410              :           return true;
    2411              :     }
    2412              : 
    2413     71697241 :   switch (gimple_code (s))
    2414              :     {
    2415        10400 :     case GIMPLE_ASM:
    2416        10400 :       return gimple_asm_volatile_p (as_a <const gasm *> (s));
    2417              : 
    2418      1602506 :     case GIMPLE_CALL:
    2419      1602506 :       {
    2420      1602506 :         if (gimple_call_internal_p (s))
    2421              :           return false;
    2422      1384079 :         t = gimple_call_fndecl (s);
    2423              :         /* Assume that indirect and calls to weak functions may trap.  */
    2424      1384079 :         if (!t || !DECL_P (t) || DECL_WEAK (t))
    2425              :           return true;
    2426              : 
    2427              :         /* Any floating point builtin operation could trap.  */
    2428      1357421 :         if (gimple_call_builtin_p (s))
    2429              :           {
    2430       994068 :             if (fndecl_built_in_p (t, BUILT_IN_NORMAL))
    2431       888657 :               switch (DECL_FUNCTION_CODE (t))
    2432              :                 {
    2433              :                 CASE_FLT_FN (BUILT_IN_COPYSIGN):
    2434              :                 CASE_FLT_FN_FLOATN_NX (BUILT_IN_COPYSIGN):
    2435              :                   return false;
    2436              :                 default:
    2437              :                   break;
    2438              :                 }
    2439       943818 :             tree type = TREE_TYPE (gimple_call_fntype (s));
    2440       943818 :             bool fp_operation = FLOAT_TYPE_P (type);
    2441        51056 :             return fp_operation && flag_trapping_math;
    2442              :           }
    2443              :         return false;
    2444              :       }
    2445     58715797 :     case GIMPLE_ASSIGN:
    2446     58715797 :       op = gimple_assign_rhs_code (s);
    2447              : 
    2448              :       /* COND_EXPR does not trap.  */
    2449     58715797 :       if (op == COND_EXPR)
    2450              :         return false;
    2451              : 
    2452              :       /* For comparisons we need to check rhs operand types instead of lhs type
    2453              :          (which is BOOLEAN_TYPE).  */
    2454     58617230 :       if (TREE_CODE_CLASS (op) == tcc_comparison)
    2455      2591006 :         t = TREE_TYPE (gimple_assign_rhs1 (s));
    2456              :       else
    2457     56026224 :         t = TREE_TYPE (gimple_assign_lhs (s));
    2458              : 
    2459     58617230 :       if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
    2460     35329836 :         div = gimple_assign_rhs2 (s);
    2461              : 
    2462     61785445 :       return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
    2463     58617230 :                                       (INTEGRAL_TYPE_P (t)
    2464     44626066 :                                        && TYPE_OVERFLOW_TRAPS (t)),
    2465     58617230 :                                       div));
    2466              : 
    2467      6450321 :     case GIMPLE_COND:
    2468      6450321 :       t = TREE_TYPE (gimple_cond_lhs (s));
    2469      6450321 :       return operation_could_trap_p (gimple_cond_code (s),
    2470     12900642 :                                      FLOAT_TYPE_P (t), false, NULL_TREE);
    2471              : 
    2472              :     default:
    2473              :       break;
    2474              :     }
    2475              : 
    2476              :   return false;
    2477              : }
    2478              : 
    2479              : /* Return true if statement S can trap.  */
    2480              : 
    2481              : bool
    2482     47640082 : gimple_could_trap_p (const gimple *s)
    2483              : {
    2484     47640082 :   return gimple_could_trap_p_1 (s, true, true);
    2485              : }
    2486              : 
    2487              : /* Return true if RHS of a GIMPLE_ASSIGN S can trap.  */
    2488              : 
    2489              : bool
    2490      3324366 : gimple_assign_rhs_could_trap_p (gimple *s)
    2491              : {
    2492      3324366 :   gcc_assert (is_gimple_assign (s));
    2493      3324366 :   return gimple_could_trap_p_1 (s, true, false);
    2494              : }
    2495              : 
    2496              : 
    2497              : /* Print debugging information for gimple stmts generated.  */
    2498              : 
    2499              : void
    2500            0 : dump_gimple_statistics (void)
    2501              : {
    2502            0 :   int i;
    2503            0 :   uint64_t total_tuples = 0, total_bytes = 0;
    2504              : 
    2505            0 :   if (! GATHER_STATISTICS)
    2506              :     {
    2507            0 :       fprintf (stderr, "No GIMPLE statistics\n");
    2508            0 :       return;
    2509              :     }
    2510              : 
    2511              :   fprintf (stderr, "\nGIMPLE statements\n");
    2512              :   fprintf (stderr, "Kind                   Stmts      Bytes\n");
    2513              :   fprintf (stderr, "---------------------------------------\n");
    2514              :   for (i = 0; i < (int) gimple_alloc_kind_all; ++i)
    2515              :     {
    2516              :       fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n",
    2517              :                gimple_alloc_kind_names[i],
    2518              :                SIZE_AMOUNT (gimple_alloc_counts[i]),
    2519              :                SIZE_AMOUNT (gimple_alloc_sizes[i]));
    2520              :       total_tuples += gimple_alloc_counts[i];
    2521              :       total_bytes += gimple_alloc_sizes[i];
    2522              :     }
    2523              :   fprintf (stderr, "---------------------------------------\n");
    2524              :   fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n", "Total",
    2525              :            SIZE_AMOUNT (total_tuples), SIZE_AMOUNT (total_bytes));
    2526              :   fprintf (stderr, "---------------------------------------\n");
    2527              : }
    2528              : 
    2529              : 
    2530              : /* Return the number of operands needed on the RHS of a GIMPLE
    2531              :    assignment for an expression with tree code CODE.  */
    2532              : 
    2533              : unsigned
    2534    104429946 : get_gimple_rhs_num_ops (enum tree_code code)
    2535              : {
    2536    104429946 :   switch (get_gimple_rhs_class (code))
    2537              :     {
    2538              :     case GIMPLE_UNARY_RHS:
    2539              :     case GIMPLE_SINGLE_RHS:
    2540              :       return 1;
    2541              :     case GIMPLE_BINARY_RHS:
    2542              :       return 2;
    2543              :     case GIMPLE_TERNARY_RHS:
    2544              :       return 3;
    2545            0 :     default:
    2546            0 :       gcc_unreachable ();
    2547              :     }
    2548              : }
    2549              : 
    2550              : #define DEFTREECODE(SYM, STRING, TYPE, NARGS)                               \
    2551              :   (unsigned char)                                                           \
    2552              :   ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS                                   \
    2553              :    : ((TYPE) == tcc_binary                                                  \
    2554              :       || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS                      \
    2555              :    : ((TYPE) == tcc_constant                                                \
    2556              :       || (TYPE) == tcc_declaration                                          \
    2557              :       || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS                       \
    2558              :    : ((SYM) == TRUTH_AND_EXPR                                               \
    2559              :       || (SYM) == TRUTH_OR_EXPR                                             \
    2560              :       || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS                       \
    2561              :    : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS                             \
    2562              :    : ((SYM) == COND_EXPR                                                    \
    2563              :       || (SYM) == WIDEN_MULT_PLUS_EXPR                                      \
    2564              :       || (SYM) == WIDEN_MULT_MINUS_EXPR                                     \
    2565              :       || (SYM) == DOT_PROD_EXPR                                             \
    2566              :       || (SYM) == SAD_EXPR                                                  \
    2567              :       || (SYM) == REALIGN_LOAD_EXPR                                         \
    2568              :       || (SYM) == VEC_COND_EXPR                                             \
    2569              :       || (SYM) == VEC_PERM_EXPR                                             \
    2570              :       || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS                     \
    2571              :    : ((SYM) == CONSTRUCTOR                                                  \
    2572              :       || (SYM) == OBJ_TYPE_REF                                              \
    2573              :       || (SYM) == ADDR_EXPR                                                 \
    2574              :       || (SYM) == WITH_SIZE_EXPR                                            \
    2575              :       || (SYM) == SSA_NAME                                                  \
    2576              :       || (SYM) == OMP_NEXT_VARIANT                                          \
    2577              :       || (SYM) == OMP_TARGET_DEVICE_MATCHES) ? GIMPLE_SINGLE_RHS            \
    2578              :    : GIMPLE_INVALID_RHS),
    2579              : #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS,
    2580              : 
    2581              : const unsigned char gimple_rhs_class_table[] = {
    2582              : #include "all-tree.def"
    2583              : };
    2584              : 
    2585              : #undef DEFTREECODE
    2586              : #undef END_OF_BASE_TREE_CODES
    2587              : 
    2588              : /* Build a GIMPLE_CALL identical to STMT but skipping the arguments in
    2589              :    the positions marked by the set ARGS_TO_SKIP.  */
    2590              : 
    2591              : gcall *
    2592            0 : gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip)
    2593              : {
    2594            0 :   int i;
    2595            0 :   int nargs = gimple_call_num_args (stmt);
    2596            0 :   auto_vec<tree> vargs (nargs);
    2597            0 :   gcall *new_stmt;
    2598              : 
    2599            0 :   for (i = 0; i < nargs; i++)
    2600            0 :     if (!bitmap_bit_p (args_to_skip, i))
    2601            0 :       vargs.quick_push (gimple_call_arg (stmt, i));
    2602              : 
    2603            0 :   if (gimple_call_internal_p (stmt))
    2604            0 :     new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt),
    2605              :                                                vargs);
    2606              :   else
    2607            0 :     new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
    2608              : 
    2609            0 :   if (gimple_call_lhs (stmt))
    2610            0 :     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
    2611              : 
    2612            0 :   gimple_set_vuse (new_stmt, gimple_vuse (stmt));
    2613            0 :   gimple_set_vdef (new_stmt, gimple_vdef (stmt));
    2614              : 
    2615            0 :   if (gimple_has_location (stmt))
    2616            0 :     gimple_set_location (new_stmt, gimple_location (stmt));
    2617            0 :   gimple_call_copy_flags (new_stmt, stmt);
    2618            0 :   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
    2619              : 
    2620            0 :   gimple_set_modified (new_stmt, true);
    2621              : 
    2622            0 :   return new_stmt;
    2623            0 : }
    2624              : 
    2625              : 
    2626              : 
    2627              : /* Return true if the field decls F1 and F2 are at the same offset.
    2628              : 
    2629              :    This is intended to be used on GIMPLE types only.  */
    2630              : 
    2631              : bool
    2632     62905437 : gimple_compare_field_offset (tree f1, tree f2)
    2633              : {
    2634     62905437 :   if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
    2635              :     {
    2636     62905374 :       tree offset1 = DECL_FIELD_OFFSET (f1);
    2637     62905374 :       tree offset2 = DECL_FIELD_OFFSET (f2);
    2638     62905374 :       return ((offset1 == offset2
    2639              :                /* Once gimplification is done, self-referential offsets are
    2640              :                   instantiated as operand #2 of the COMPONENT_REF built for
    2641              :                   each access and reset.  Therefore, they are not relevant
    2642              :                   anymore and fields are interchangeable provided that they
    2643              :                   represent the same access.  */
    2644            0 :                || (TREE_CODE (offset1) == PLACEHOLDER_EXPR
    2645            0 :                    && TREE_CODE (offset2) == PLACEHOLDER_EXPR
    2646            0 :                    && (DECL_SIZE (f1) == DECL_SIZE (f2)
    2647            0 :                        || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR
    2648            0 :                            && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR)
    2649            0 :                        || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0))
    2650            0 :                    && DECL_ALIGN (f1) == DECL_ALIGN (f2))
    2651            0 :                || operand_equal_p (offset1, offset2, 0))
    2652    125810748 :               && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
    2653     62905374 :                                      DECL_FIELD_BIT_OFFSET (f2)));
    2654              :     }
    2655              : 
    2656              :   /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN
    2657              :      should be, so handle differing ones specially by decomposing
    2658              :      the offset into a byte and bit offset manually.  */
    2659           63 :   if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1))
    2660           63 :       && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2)))
    2661              :     {
    2662           63 :       unsigned HOST_WIDE_INT byte_offset1, byte_offset2;
    2663           63 :       unsigned HOST_WIDE_INT bit_offset1, bit_offset2;
    2664           63 :       bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1));
    2665           63 :       byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1))
    2666           63 :                       + bit_offset1 / BITS_PER_UNIT);
    2667           63 :       bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2));
    2668           63 :       byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2))
    2669           63 :                       + bit_offset2 / BITS_PER_UNIT);
    2670           63 :       if (byte_offset1 != byte_offset2)
    2671              :         return false;
    2672           63 :       return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT;
    2673              :     }
    2674              : 
    2675              :   return false;
    2676              : }
    2677              : 
    2678              : 
    2679              : /* Return a type the same as TYPE except unsigned or
    2680              :    signed according to UNSIGNEDP.  */
    2681              : 
    2682              : static tree
    2683       609387 : gimple_signed_or_unsigned_type (bool unsignedp, tree type)
    2684              : {
    2685       609387 :   tree type1;
    2686       609387 :   int i;
    2687              : 
    2688       609387 :   type1 = TYPE_MAIN_VARIANT (type);
    2689       609387 :   if (type1 == signed_char_type_node
    2690       609387 :       || type1 == char_type_node
    2691       609387 :       || type1 == unsigned_char_type_node)
    2692            0 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2693       609387 :   if (type1 == integer_type_node || type1 == unsigned_type_node)
    2694       354250 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2695       255137 :   if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
    2696       233298 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2697        21839 :   if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
    2698           30 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
    2699        21809 :   if (type1 == long_long_integer_type_node
    2700        21720 :       || type1 == long_long_unsigned_type_node)
    2701           89 :     return unsignedp
    2702           89 :            ? long_long_unsigned_type_node
    2703            0 :            : long_long_integer_type_node;
    2704              : 
    2705        36009 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    2706        21720 :     if (int_n_enabled_p[i]
    2707        21720 :         && (type1 == int_n_trees[i].unsigned_type
    2708        14661 :             || type1 == int_n_trees[i].signed_type))
    2709         7431 :         return unsignedp
    2710         7431 :           ? int_n_trees[i].unsigned_type
    2711         7431 :           : int_n_trees[i].signed_type;
    2712              : 
    2713              : #if HOST_BITS_PER_WIDE_INT >= 64
    2714        14289 :   if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
    2715            0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
    2716              : #endif
    2717        14289 :   if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
    2718            0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
    2719        14289 :   if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
    2720            0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
    2721        14289 :   if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
    2722            0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
    2723        14289 :   if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
    2724            0 :     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
    2725              : 
    2726              : #define GIMPLE_FIXED_TYPES(NAME)            \
    2727              :   if (type1 == short_ ## NAME ## _type_node \
    2728              :       || type1 == unsigned_short_ ## NAME ## _type_node) \
    2729              :     return unsignedp ? unsigned_short_ ## NAME ## _type_node \
    2730              :                      : short_ ## NAME ## _type_node; \
    2731              :   if (type1 == NAME ## _type_node \
    2732              :       || type1 == unsigned_ ## NAME ## _type_node) \
    2733              :     return unsignedp ? unsigned_ ## NAME ## _type_node \
    2734              :                      : NAME ## _type_node; \
    2735              :   if (type1 == long_ ## NAME ## _type_node \
    2736              :       || type1 == unsigned_long_ ## NAME ## _type_node) \
    2737              :     return unsignedp ? unsigned_long_ ## NAME ## _type_node \
    2738              :                      : long_ ## NAME ## _type_node; \
    2739              :   if (type1 == long_long_ ## NAME ## _type_node \
    2740              :       || type1 == unsigned_long_long_ ## NAME ## _type_node) \
    2741              :     return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
    2742              :                      : long_long_ ## NAME ## _type_node;
    2743              : 
    2744              : #define GIMPLE_FIXED_MODE_TYPES(NAME) \
    2745              :   if (type1 == NAME ## _type_node \
    2746              :       || type1 == u ## NAME ## _type_node) \
    2747              :     return unsignedp ? u ## NAME ## _type_node \
    2748              :                      : NAME ## _type_node;
    2749              : 
    2750              : #define GIMPLE_FIXED_TYPES_SAT(NAME) \
    2751              :   if (type1 == sat_ ## short_ ## NAME ## _type_node \
    2752              :       || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
    2753              :     return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
    2754              :                      : sat_ ## short_ ## NAME ## _type_node; \
    2755              :   if (type1 == sat_ ## NAME ## _type_node \
    2756              :       || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
    2757              :     return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
    2758              :                      : sat_ ## NAME ## _type_node; \
    2759              :   if (type1 == sat_ ## long_ ## NAME ## _type_node \
    2760              :       || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
    2761              :     return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
    2762              :                      : sat_ ## long_ ## NAME ## _type_node; \
    2763              :   if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
    2764              :       || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
    2765              :     return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
    2766              :                      : sat_ ## long_long_ ## NAME ## _type_node;
    2767              : 
    2768              : #define GIMPLE_FIXED_MODE_TYPES_SAT(NAME)       \
    2769              :   if (type1 == sat_ ## NAME ## _type_node \
    2770              :       || type1 == sat_ ## u ## NAME ## _type_node) \
    2771              :     return unsignedp ? sat_ ## u ## NAME ## _type_node \
    2772              :                      : sat_ ## NAME ## _type_node;
    2773              : 
    2774        14289 :   GIMPLE_FIXED_TYPES (fract);
    2775        14289 :   GIMPLE_FIXED_TYPES_SAT (fract);
    2776        14289 :   GIMPLE_FIXED_TYPES (accum);
    2777        14289 :   GIMPLE_FIXED_TYPES_SAT (accum);
    2778              : 
    2779        14289 :   GIMPLE_FIXED_MODE_TYPES (qq);
    2780        14289 :   GIMPLE_FIXED_MODE_TYPES (hq);
    2781        14289 :   GIMPLE_FIXED_MODE_TYPES (sq);
    2782        14289 :   GIMPLE_FIXED_MODE_TYPES (dq);
    2783        14289 :   GIMPLE_FIXED_MODE_TYPES (tq);
    2784        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (qq);
    2785        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (hq);
    2786        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (sq);
    2787        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (dq);
    2788        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (tq);
    2789        14289 :   GIMPLE_FIXED_MODE_TYPES (ha);
    2790        14289 :   GIMPLE_FIXED_MODE_TYPES (sa);
    2791        14289 :   GIMPLE_FIXED_MODE_TYPES (da);
    2792        14289 :   GIMPLE_FIXED_MODE_TYPES (ta);
    2793        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (ha);
    2794        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (sa);
    2795        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (da);
    2796        14289 :   GIMPLE_FIXED_MODE_TYPES_SAT (ta);
    2797              : 
    2798              :   /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
    2799              :      the precision; they have precision set to match their range, but
    2800              :      may use a wider mode to match an ABI.  If we change modes, we may
    2801              :      wind up with bad conversions.  For INTEGER_TYPEs in C, must check
    2802              :      the precision as well, so as to yield correct results for
    2803              :      bit-field types.  C++ does not have these separate bit-field
    2804              :      types, and producing a signed or unsigned variant of an
    2805              :      ENUMERAL_TYPE may cause other problems as well.  */
    2806        14289 :   if (!INTEGRAL_TYPE_P (type)
    2807        14289 :       || TYPE_UNSIGNED (type) == unsignedp)
    2808              :     return type;
    2809              : 
    2810              : #define TYPE_OK(node)                                                       \
    2811              :   (TYPE_MODE (type) == TYPE_MODE (node)                                     \
    2812              :    && TYPE_PRECISION (type) == TYPE_PRECISION (node))
    2813        14289 :   if (TYPE_OK (signed_char_type_node))
    2814          517 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2815        13772 :   if (TYPE_OK (integer_type_node))
    2816         3513 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2817        10259 :   if (TYPE_OK (short_integer_type_node))
    2818         4754 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2819         5505 :   if (TYPE_OK (long_integer_type_node))
    2820            6 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
    2821         5499 :   if (TYPE_OK (long_long_integer_type_node))
    2822            0 :     return (unsignedp
    2823            0 :             ? long_long_unsigned_type_node
    2824            0 :             : long_long_integer_type_node);
    2825              : 
    2826        10971 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    2827         5499 :     if (int_n_enabled_p[i]
    2828         5499 :         && TYPE_MODE (type) == int_n_data[i].m
    2829         5526 :         && TYPE_PRECISION (type) == int_n_data[i].bitsize)
    2830           27 :         return unsignedp
    2831           27 :           ? int_n_trees[i].unsigned_type
    2832           27 :           : int_n_trees[i].signed_type;
    2833              : 
    2834              : #if HOST_BITS_PER_WIDE_INT >= 64
    2835         5472 :   if (TYPE_OK (intTI_type_node))
    2836            0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
    2837              : #endif
    2838         5472 :   if (TYPE_OK (intDI_type_node))
    2839            0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
    2840         5472 :   if (TYPE_OK (intSI_type_node))
    2841            0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
    2842         5472 :   if (TYPE_OK (intHI_type_node))
    2843            0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
    2844         5472 :   if (TYPE_OK (intQI_type_node))
    2845            0 :     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
    2846              : 
    2847              : #undef GIMPLE_FIXED_TYPES
    2848              : #undef GIMPLE_FIXED_MODE_TYPES
    2849              : #undef GIMPLE_FIXED_TYPES_SAT
    2850              : #undef GIMPLE_FIXED_MODE_TYPES_SAT
    2851              : #undef TYPE_OK
    2852              : 
    2853         5472 :   return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
    2854              : }
    2855              : 
    2856              : 
    2857              : /* Return an unsigned type the same as TYPE in other respects.  */
    2858              : 
    2859              : tree
    2860            0 : gimple_unsigned_type (tree type)
    2861              : {
    2862            0 :   return gimple_signed_or_unsigned_type (true, type);
    2863              : }
    2864              : 
    2865              : 
    2866              : /* Return a signed type the same as TYPE in other respects.  */
    2867              : 
    2868              : tree
    2869       609387 : gimple_signed_type (tree type)
    2870              : {
    2871       609387 :   return gimple_signed_or_unsigned_type (false, type);
    2872              : }
    2873              : 
    2874              : 
    2875              : /* Return the typed-based alias set for T, which may be an expression
    2876              :    or a type.  Return -1 if we don't do anything special.  */
    2877              : 
    2878              : alias_set_type
    2879      8753239 : gimple_get_alias_set (tree t)
    2880              : {
    2881              :   /* That's all the expressions we handle specially.  */
    2882      8753239 :   if (!TYPE_P (t))
    2883              :     return -1;
    2884              : 
    2885              :   /* For convenience, follow the C standard when dealing with
    2886              :      character types.  Any object may be accessed via an lvalue that
    2887              :      has character type.  */
    2888      2479530 :   if (t == char_type_node
    2889      1933422 :       || t == signed_char_type_node
    2890      1933422 :       || t == unsigned_char_type_node)
    2891              :     return 0;
    2892              : 
    2893              :   /* Allow aliasing between signed and unsigned variants of the same
    2894              :      type.  We treat the signed variant as canonical.  */
    2895      1933422 :   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
    2896              :     {
    2897       608479 :       tree t1 = gimple_signed_type (t);
    2898              : 
    2899              :       /* t1 == t can happen for boolean nodes which are always unsigned.  */
    2900       608479 :       if (t1 != t)
    2901       608479 :         return get_alias_set (t1);
    2902              :     }
    2903              : 
    2904              :   /* Allow aliasing between enumeral types and the underlying
    2905              :      integer type.  This is required for C since those are
    2906              :      compatible types.  */
    2907      1324943 :   else if (TREE_CODE (t) == ENUMERAL_TYPE)
    2908              :     {
    2909            0 :       tree t1 = lang_hooks.types.type_for_size (tree_to_uhwi (TYPE_SIZE (t)),
    2910              :                                                 false /* short-cut above */);
    2911            0 :       return get_alias_set (t1);
    2912              :     }
    2913              : 
    2914              :   return -1;
    2915              : }
    2916              : 
    2917              : 
    2918              : /* Return true when STMTs arguments and return value match those of FNDECL,
    2919              :    a decl of a builtin function.  */
    2920              : 
    2921              : bool
    2922    295583477 : gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
    2923              : {
    2924    295583477 :   gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
    2925              : 
    2926    295583477 :   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
    2927    293207165 :     if (tree decl = builtin_decl_explicit (DECL_FUNCTION_CODE (fndecl)))
    2928    295583477 :       fndecl = decl;
    2929              : 
    2930    295583477 :   tree ret = gimple_call_lhs (stmt);
    2931    295583477 :   if (ret
    2932    478382597 :       && !useless_type_conversion_p (TREE_TYPE (ret),
    2933    182799120 :                                      TREE_TYPE (TREE_TYPE (fndecl))))
    2934              :     return false;
    2935              : 
    2936    295561494 :   tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
    2937    295561494 :   unsigned nargs = gimple_call_num_args (stmt);
    2938   1211837007 :   for (unsigned i = 0; i < nargs; ++i)
    2939              :     {
    2940              :       /* Variadic args follow.  */
    2941    654196280 :       if (!targs)
    2942              :         return true;
    2943    625732078 :       tree arg = gimple_call_arg (stmt, i);
    2944    625732078 :       tree type = TREE_VALUE (targs);
    2945    625732078 :       if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
    2946              :         return false;
    2947    620714019 :       targs = TREE_CHAIN (targs);
    2948              :     }
    2949    523332682 :   if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
    2950         7153 :     return false;
    2951              :   return true;
    2952              : }
    2953              : 
    2954              : /* Return true when STMT is operator a replaceable delete call.  */
    2955              : 
    2956              : bool
    2957      2759794 : gimple_call_operator_delete_p (const gcall *stmt)
    2958              : {
    2959      2759794 :   tree fndecl;
    2960              : 
    2961      2759794 :   if ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE)
    2962      2759794 :     return DECL_IS_OPERATOR_DELETE_P (fndecl);
    2963              :   return false;
    2964              : }
    2965              : 
    2966              : /* Return true when STMT is builtins call.  */
    2967              : 
    2968              : bool
    2969     71179174 : gimple_call_builtin_p (const gimple *stmt)
    2970              : {
    2971     71179174 :   tree fndecl;
    2972     71179174 :   if (is_gimple_call (stmt)
    2973     22522116 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    2974     92434750 :       && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
    2975      4975048 :     return gimple_builtin_call_types_compatible_p (stmt, fndecl);
    2976              :   return false;
    2977              : }
    2978              : 
    2979              : /* Return true when STMT is builtins call to CLASS.  */
    2980              : 
    2981              : bool
    2982   1057971324 : gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
    2983              : {
    2984   1057971324 :   tree fndecl;
    2985   1057971324 :   if (is_gimple_call (stmt)
    2986    806252494 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    2987   1826529723 :       && DECL_BUILT_IN_CLASS (fndecl) == klass)
    2988    197730618 :     return gimple_builtin_call_types_compatible_p (stmt, fndecl);
    2989              :   return false;
    2990              : }
    2991              : 
    2992              : /* Return true when STMT is builtins call to CODE of CLASS.  */
    2993              : 
    2994              : bool
    2995   3048672153 : gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
    2996              : {
    2997   3048672153 :   tree fndecl;
    2998   3048672153 :   if (is_gimple_call (stmt)
    2999    909521573 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    3000   3914876135 :       && fndecl_built_in_p (fndecl, code))
    3001      2712511 :     return gimple_builtin_call_types_compatible_p (stmt, fndecl);
    3002              :   return false;
    3003              : }
    3004              : 
    3005              : /* If CALL is a call to a combined_fn (i.e. an internal function or
    3006              :    a normal built-in function), return its code, otherwise return
    3007              :    CFN_LAST.  */
    3008              : 
    3009              : combined_fn
    3010    192582875 : gimple_call_combined_fn (const gimple *stmt)
    3011              : {
    3012    192582875 :   if (const gcall *call = dyn_cast <const gcall *> (stmt))
    3013              :     {
    3014    192371050 :       if (gimple_call_internal_p (call))
    3015      8851948 :         return as_combined_fn (gimple_call_internal_fn (call));
    3016              : 
    3017    183519102 :       tree fndecl = gimple_call_fndecl (stmt);
    3018    183519102 :       if (fndecl
    3019    177037106 :           && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
    3020    256116968 :           && gimple_builtin_call_types_compatible_p (stmt, fndecl))
    3021     72035976 :         return as_combined_fn (DECL_FUNCTION_CODE (fndecl));
    3022              :     }
    3023              :   return CFN_LAST;
    3024              : }
    3025              : 
    3026              : /* Return true if STMT clobbers memory.  STMT is required to be a
    3027              :    GIMPLE_ASM.  */
    3028              : 
    3029              : bool
    3030     10712064 : gimple_asm_clobbers_memory_p (const gasm *stmt)
    3031              : {
    3032     10712064 :   unsigned i;
    3033              : 
    3034     14775827 :   for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
    3035              :     {
    3036      8423649 :       tree op = gimple_asm_clobber_op (stmt, i);
    3037      8423649 :       if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
    3038              :         return true;
    3039              :     }
    3040              : 
    3041              :   /* Non-empty basic ASM implicitly clobbers memory.  */
    3042      6352178 :   if (gimple_asm_basic_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
    3043        74574 :     return true;
    3044              : 
    3045              :   return false;
    3046              : }
    3047              : 
    3048              : /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE.  */
    3049              : 
    3050              : void
    3051         5338 : dump_decl_set (FILE *file, bitmap set)
    3052              : {
    3053         5338 :   if (set)
    3054              :     {
    3055         5338 :       bitmap_iterator bi;
    3056         5338 :       unsigned i;
    3057              : 
    3058         5338 :       fprintf (file, "{ ");
    3059              : 
    3060        22230 :       EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
    3061              :         {
    3062        16892 :           fprintf (file, "D.%u", i);
    3063        16892 :           fprintf (file, " ");
    3064              :         }
    3065              : 
    3066         5338 :       fprintf (file, "}");
    3067              :     }
    3068              :   else
    3069            0 :     fprintf (file, "NIL");
    3070         5338 : }
    3071              : 
    3072              : /* Return true when CALL is a call stmt that definitely doesn't
    3073              :    free any memory or makes it unavailable otherwise.  */
    3074              : bool
    3075     10219063 : nonfreeing_call_p (gimple *call)
    3076              : {
    3077     10219063 :   if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
    3078     10219063 :       && gimple_call_flags (call) & ECF_LEAF)
    3079      4457575 :     switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call)))
    3080              :       {
    3081              :         /* Just in case these become ECF_LEAF in the future.  */
    3082              :         case BUILT_IN_FREE:
    3083              :         case BUILT_IN_TM_FREE:
    3084              :         case BUILT_IN_REALLOC:
    3085              :         case BUILT_IN_STACK_RESTORE:
    3086              :         case BUILT_IN_GOMP_FREE:
    3087              :         case BUILT_IN_GOMP_REALLOC:
    3088              :           return false;
    3089      4255290 :         default:
    3090      4255290 :           return true;
    3091              :       }
    3092      5761488 :   else if (gimple_call_internal_p (call))
    3093       769333 :     switch (gimple_call_internal_fn (call))
    3094              :       {
    3095              :       case IFN_ABNORMAL_DISPATCHER:
    3096              :         return true;
    3097        35682 :       case IFN_ASAN_MARK:
    3098        35682 :         return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
    3099       727645 :       default:
    3100       727645 :         if (gimple_call_flags (call) & ECF_LEAF)
    3101              :           return true;
    3102       148466 :         return false;
    3103              :       }
    3104              : 
    3105      4992155 :   tree fndecl = gimple_call_fndecl (call);
    3106      4992155 :   if (!fndecl)
    3107              :     return false;
    3108      4829346 :   struct cgraph_node *n = cgraph_node::get (fndecl);
    3109      4829346 :   if (!n)
    3110              :     return false;
    3111      4827968 :   enum availability availability;
    3112      4827968 :   n = n->function_symbol (&availability);
    3113      4827968 :   if (!n || availability <= AVAIL_INTERPOSABLE)
    3114              :     return false;
    3115      1175195 :   return n->nonfreeing_fn;
    3116              : }
    3117              : 
    3118              : /* Return true when CALL is a call stmt that definitely need not
    3119              :    be considered to be a memory barrier.  */
    3120              : bool
    3121      1680730 : nonbarrier_call_p (gimple *call)
    3122              : {
    3123      1680730 :   if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
    3124       661596 :     return true;
    3125              :   /* Should extend this to have a nonbarrier_fn flag, just as above in
    3126              :      the nonfreeing case.  */
    3127              :   return false;
    3128              : }
    3129              : 
    3130              : /* Callback for walk_stmt_load_store_ops.
    3131              : 
    3132              :    Return TRUE if OP will dereference the tree stored in DATA, FALSE
    3133              :    otherwise.
    3134              : 
    3135              :    This routine only makes a superficial check for a dereference.  Thus
    3136              :    it must only be used if it is safe to return a false negative.  */
    3137              : static bool
    3138     78384616 : check_loadstore (gimple *stmt, tree op, tree, void *data)
    3139              : {
    3140    156769232 :   if (TREE_CODE (op) == MEM_REF
    3141     78384616 :       || (TREE_CODE (op) == TARGET_MEM_REF
    3142      1383357 :           && !TMR_INDEX2 (op)
    3143      1367354 :           && (!TMR_INDEX (op)
    3144       646630 :               || (TMR_STEP (op)
    3145       587231 :                   && expr_not_equal_to (TMR_STEP (op),
    3146     78971847 :                                         wi::one (TYPE_PRECISION (TREE_TYPE
    3147              :                                                         (TMR_STEP (op)))),
    3148              :                                         stmt)))))
    3149              :     {
    3150              :       /* Some address spaces may legitimately dereference zero.  */
    3151     40701913 :       addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
    3152     40701913 :       if (targetm.addr_space.zero_address_valid (as))
    3153              :         return false;
    3154              : 
    3155     40700807 :       return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
    3156              :     }
    3157              :   return false;
    3158              : }
    3159              : 
    3160              : 
    3161              : /* Return true if OP can be inferred to be non-NULL after STMT executes,
    3162              :    either by using a pointer dereference or attributes.  */
    3163              : bool
    3164            0 : infer_nonnull_range (gimple *stmt, tree op)
    3165              : {
    3166            0 :   return (infer_nonnull_range_by_dereference (stmt, op)
    3167            0 :           || infer_nonnull_range_by_attribute (stmt, op));
    3168              : }
    3169              : 
    3170              : /* Return true if OP can be inferred to be non-NULL after STMT
    3171              :    executes by using a pointer dereference.  */
    3172              : bool
    3173    353213462 : infer_nonnull_range_by_dereference (gimple *stmt, tree op)
    3174              : {
    3175              :   /* We can only assume that a pointer dereference will yield
    3176              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3177    353213462 :   if (!flag_delete_null_pointer_checks
    3178    352999236 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3179    352999236 :       || gimple_code (stmt) == GIMPLE_ASM
    3180    705786322 :       || gimple_clobber_p (stmt))
    3181              :     return false;
    3182              : 
    3183    345071858 :   if (walk_stmt_load_store_ops (stmt, (void *)op,
    3184              :                                 check_loadstore, check_loadstore))
    3185              :     return true;
    3186              : 
    3187              :   return false;
    3188              : }
    3189              : 
    3190              : /* Return true if OP can be inferred to be a non-NULL after STMT
    3191              :    executes by using attributes.  If OP2 and OP3 are non-NULL and
    3192              :    nonnull_if_nonzero is the only attribute implying OP being non-NULL
    3193              :    and the corresponding argument(s) aren't non-zero INTEGER_CST, set *OP2
    3194              :    and *OP3 to the corresponding arguments and return true (in that case
    3195              :    returning true doesn't mean OP can be unconditionally inferred to be
    3196              :    non-NULL, but conditionally).  */
    3197              : bool
    3198     80385933 : infer_nonnull_range_by_attribute (gimple *stmt, tree op, tree *op2, tree *op3)
    3199              : {
    3200     80385933 :   if (op2)
    3201              :     {
    3202         3934 :       *op2 = NULL_TREE;
    3203         3934 :       *op3 = NULL_TREE;
    3204              :     }
    3205              : 
    3206              :   /* We can only assume that a pointer dereference will yield
    3207              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3208     80385933 :   if (!flag_delete_null_pointer_checks
    3209     80357178 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3210    160743111 :       || gimple_code (stmt) == GIMPLE_ASM)
    3211              :     return false;
    3212              : 
    3213     80306672 :   if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
    3214              :     {
    3215      4544360 :       tree fntype = gimple_call_fntype (stmt);
    3216      4544360 :       tree attrs = TYPE_ATTRIBUTES (fntype);
    3217      4642161 :       for (; attrs; attrs = TREE_CHAIN (attrs))
    3218              :         {
    3219      1185625 :           attrs = lookup_attribute ("nonnull", attrs);
    3220              : 
    3221              :           /* If "nonnull" wasn't specified, we know nothing about
    3222              :              the argument, unless "nonnull_if_nonzero" attribute is
    3223              :              present.  */
    3224      1185625 :           if (attrs == NULL_TREE)
    3225              :             break;
    3226              : 
    3227              :           /* If "nonnull" applies to all the arguments, then ARG
    3228              :              is non-null if it's in the argument list.  */
    3229       257364 :           if (TREE_VALUE (attrs) == NULL_TREE)
    3230              :             {
    3231       463264 :               for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
    3232              :                 {
    3233       312639 :                   if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
    3234       304913 :                       && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
    3235              :                     return true;
    3236              :                 }
    3237              :               return false;
    3238              :             }
    3239              : 
    3240              :           /* Now see if op appears in the nonnull list.  */
    3241       246404 :           for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
    3242              :             {
    3243       148603 :               unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
    3244       148603 :               if (idx < gimple_call_num_args (stmt))
    3245              :                 {
    3246       148602 :                   tree arg = gimple_call_arg (stmt, idx);
    3247       148602 :                   if (operand_equal_p (op, arg, 0))
    3248              :                     return true;
    3249              :                 }
    3250              :             }
    3251              :         }
    3252              : 
    3253      4384797 :       for (attrs = TYPE_ATTRIBUTES (fntype);
    3254      4593068 :            (attrs = lookup_attribute ("nonnull_if_nonzero", attrs));
    3255       208271 :            attrs = TREE_CHAIN (attrs))
    3256              :         {
    3257       209086 :           tree args = TREE_VALUE (attrs);
    3258       209086 :           unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (args)) - 1;
    3259       209086 :           unsigned int idx2
    3260       209086 :             = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args))) - 1;
    3261       209086 :           unsigned int idx3 = idx2;
    3262       209086 :           if (tree chain2 = TREE_CHAIN (TREE_CHAIN (args)))
    3263         4348 :             idx3 = TREE_INT_CST_LOW (TREE_VALUE (chain2)) - 1;
    3264       209086 :           if (idx < gimple_call_num_args (stmt)
    3265       209074 :               && idx2 < gimple_call_num_args (stmt)
    3266       209063 :               && idx3 < gimple_call_num_args (stmt)
    3267       418149 :               && operand_equal_p (op, gimple_call_arg (stmt, idx), 0))
    3268              :             {
    3269          815 :               tree arg2 = gimple_call_arg (stmt, idx2);
    3270          815 :               tree arg3 = gimple_call_arg (stmt, idx3);
    3271         1630 :               if (!INTEGRAL_TYPE_P (TREE_TYPE (arg2))
    3272         1630 :                   || !INTEGRAL_TYPE_P (TREE_TYPE (arg3)))
    3273              :                 return false;
    3274          815 :               if (integer_nonzerop (arg2) && integer_nonzerop (arg3))
    3275              :                 return true;
    3276          593 :               if (integer_zerop (arg2) || integer_zerop (arg3))
    3277              :                 return false;
    3278          503 :               if (op2)
    3279              :                 {
    3280              :                   /* This case is meant for ubsan instrumentation.
    3281              :                      The caller can check at runtime if *OP2 and *OP3 are
    3282              :                      non-zero and OP is null.  */
    3283          132 :                   *op2 = arg2;
    3284          132 :                   *op3 = arg3;
    3285          132 :                   return true;
    3286              :                 }
    3287          371 :               return tree_expr_nonzero_p (arg2) && tree_expr_nonzero_p (arg3);
    3288              :             }
    3289              :         }
    3290              :     }
    3291              : 
    3292              :   /* If this function is marked as returning non-null, then we can
    3293              :      infer OP is non-null if it is used in the return statement.  */
    3294     80146294 :   if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
    3295       971652 :     if (gimple_return_retval (return_stmt)
    3296       558658 :         && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
    3297      1065314 :         && lookup_attribute ("returns_nonnull",
    3298        93662 :                              TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
    3299              :       return true;
    3300              : 
    3301              :   return false;
    3302              : }
    3303              : 
    3304              : /* Compare two case labels.  Because the front end should already have
    3305              :    made sure that case ranges do not overlap, it is enough to only compare
    3306              :    the CASE_LOW values of each case label.  */
    3307              : 
    3308              : static int
    3309     43814048 : compare_case_labels (const void *p1, const void *p2)
    3310              : {
    3311     43814048 :   const_tree const case1 = *(const_tree const*)p1;
    3312     43814048 :   const_tree const case2 = *(const_tree const*)p2;
    3313              : 
    3314              :   /* The 'default' case label always goes first.  */
    3315     43814048 :   if (!CASE_LOW (case1))
    3316              :     return -1;
    3317     43814048 :   else if (!CASE_LOW (case2))
    3318              :     return 1;
    3319              :   else
    3320     43814048 :     return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
    3321              : }
    3322              : 
    3323              : /* Sort the case labels in LABEL_VEC in place in ascending order.  */
    3324              : 
    3325              : void
    3326        71369 : sort_case_labels (vec<tree> &label_vec)
    3327              : {
    3328        71369 :   label_vec.qsort (compare_case_labels);
    3329        71369 : }
    3330              : 
    3331              : /* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
    3332              : 
    3333              :    LABELS is a vector that contains all case labels to look at.
    3334              : 
    3335              :    INDEX_TYPE is the type of the switch index expression.  Case labels
    3336              :    in LABELS are discarded if their values are not in the value range
    3337              :    covered by INDEX_TYPE.  The remaining case label values are folded
    3338              :    to INDEX_TYPE.
    3339              : 
    3340              :    If a default case exists in LABELS, it is removed from LABELS and
    3341              :    returned in DEFAULT_CASEP.  If no default case exists, but the
    3342              :    case labels already cover the whole range of INDEX_TYPE, a default
    3343              :    case is returned pointing to one of the existing case labels.
    3344              :    Otherwise DEFAULT_CASEP is set to NULL_TREE.
    3345              : 
    3346              :    DEFAULT_CASEP may be NULL, in which case the above comment doesn't
    3347              :    apply and no action is taken regardless of whether a default case is
    3348              :    found or not.  */
    3349              : 
    3350              : void
    3351        62743 : preprocess_case_label_vec_for_gimple (vec<tree> &labels,
    3352              :                                       tree index_type,
    3353              :                                       tree *default_casep)
    3354              : {
    3355        62743 :   tree min_value, max_value;
    3356        62743 :   tree default_case = NULL_TREE;
    3357        62743 :   size_t i, len;
    3358              : 
    3359        62743 :   i = 0;
    3360        62743 :   min_value = TYPE_MIN_VALUE (index_type);
    3361        62743 :   max_value = TYPE_MAX_VALUE (index_type);
    3362      1159495 :   while (i < labels.length ())
    3363              :     {
    3364      1096752 :       tree elt = labels[i];
    3365      1096752 :       tree low = CASE_LOW (elt);
    3366      1096752 :       tree high = CASE_HIGH (elt);
    3367      1096752 :       bool remove_element = false;
    3368              : 
    3369      1096752 :       if (low)
    3370              :         {
    3371      1060961 :           gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
    3372      1060961 :           gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
    3373              : 
    3374              :           /* This is a non-default case label, i.e. it has a value.
    3375              : 
    3376              :              See if the case label is reachable within the range of
    3377              :              the index type.  Remove out-of-range case values.  Turn
    3378              :              case ranges into a canonical form (high > low strictly)
    3379              :              and convert the case label values to the index type.
    3380              : 
    3381              :              NB: The type of gimple_switch_index() may be the promoted
    3382              :              type, but the case labels retain the original type.  */
    3383              : 
    3384        12803 :           if (high)
    3385              :             {
    3386              :               /* This is a case range.  Discard empty ranges.
    3387              :                  If the bounds or the range are equal, turn this
    3388              :                  into a simple (one-value) case.  */
    3389        12803 :               int cmp = tree_int_cst_compare (high, low);
    3390        12803 :               if (cmp < 0)
    3391              :                 remove_element = true;
    3392        12803 :               else if (cmp == 0)
    3393              :                 high = NULL_TREE;
    3394              :             }
    3395              : 
    3396      1049812 :           if (! high)
    3397              :             {
    3398              :               /* If the simple case value is unreachable, ignore it.  */
    3399      1059307 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3400      1059307 :                    && tree_int_cst_compare (low, min_value) < 0)
    3401      2118571 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3402      1059264 :                       && tree_int_cst_compare (low, max_value) > 0))
    3403              :                 remove_element = true;
    3404              :               else
    3405      1059146 :                 low = fold_convert (index_type, low);
    3406              :             }
    3407              :           else
    3408              :             {
    3409              :               /* If the entire case range is unreachable, ignore it.  */
    3410         1654 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3411         1654 :                    && tree_int_cst_compare (high, min_value) < 0)
    3412         3296 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3413         1642 :                       && tree_int_cst_compare (low, max_value) > 0))
    3414              :                 remove_element = true;
    3415              :               else
    3416              :                 {
    3417              :                   /* If the lower bound is less than the index type's
    3418              :                      minimum value, truncate the range bounds.  */
    3419         1642 :                   if (TREE_CODE (min_value) == INTEGER_CST
    3420         1642 :                       && tree_int_cst_compare (low, min_value) < 0)
    3421              :                     low = min_value;
    3422         1642 :                   low = fold_convert (index_type, low);
    3423              : 
    3424              :                   /* If the upper bound is greater than the index type's
    3425              :                      maximum value, truncate the range bounds.  */
    3426         1642 :                   if (TREE_CODE (max_value) == INTEGER_CST
    3427         1642 :                       && tree_int_cst_compare (high, max_value) > 0)
    3428              :                     high = max_value;
    3429         1642 :                   high = fold_convert (index_type, high);
    3430              : 
    3431              :                   /* We may have folded a case range to a one-value case.  */
    3432         1642 :                   if (tree_int_cst_equal (low, high))
    3433            0 :                     high = NULL_TREE;
    3434              :                 }
    3435              :             }
    3436              : 
    3437      1060961 :           CASE_LOW (elt) = low;
    3438      1060961 :           CASE_HIGH (elt) = high;
    3439              :         }
    3440              :       else
    3441              :         {
    3442        35791 :           gcc_assert (!default_case);
    3443        35791 :           default_case = elt;
    3444              :           /* The default case must be passed separately to the
    3445              :              gimple_build_switch routine.  But if DEFAULT_CASEP
    3446              :              is NULL, we do not remove the default case (it would
    3447              :              be completely lost).  */
    3448        35791 :           if (default_casep)
    3449              :             remove_element = true;
    3450              :         }
    3451              : 
    3452      1060961 :       if (remove_element)
    3453        35964 :         labels.ordered_remove (i);
    3454              :       else
    3455      1060788 :         i++;
    3456              :     }
    3457        62743 :   len = i;
    3458              : 
    3459        62743 :   if (!labels.is_empty ())
    3460        61863 :     sort_case_labels (labels);
    3461              : 
    3462        62743 :   if (default_casep && !default_case)
    3463              :     {
    3464              :       /* If the switch has no default label, add one, so that we jump
    3465              :          around the switch body.  If the labels already cover the whole
    3466              :          range of the switch index_type, add the default label pointing
    3467              :          to one of the existing labels.  */
    3468        15081 :       if (len
    3469        14600 :           && TYPE_MIN_VALUE (index_type)
    3470        14600 :           && TYPE_MAX_VALUE (index_type)
    3471        29681 :           && tree_int_cst_equal (CASE_LOW (labels[0]),
    3472        14600 :                                  TYPE_MIN_VALUE (index_type)))
    3473              :         {
    3474         4442 :           tree low, high = CASE_HIGH (labels[len - 1]);
    3475         4442 :           if (!high)
    3476         4399 :             high = CASE_LOW (labels[len - 1]);
    3477         4442 :           if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
    3478              :             {
    3479           62 :               tree widest_label = labels[0];
    3480          131 :               for (i = 1; i < len; i++)
    3481              :                 {
    3482           83 :                   high = CASE_LOW (labels[i]);
    3483           83 :                   low = CASE_HIGH (labels[i - 1]);
    3484           83 :                   if (!low)
    3485           53 :                     low = CASE_LOW (labels[i - 1]);
    3486              : 
    3487           83 :                   if (CASE_HIGH (labels[i]) != NULL_TREE
    3488          114 :                       && (CASE_HIGH (widest_label) == NULL_TREE
    3489           26 :                           || (wi::gtu_p
    3490           52 :                               (wi::to_wide (CASE_HIGH (labels[i]))
    3491           78 :                                - wi::to_wide (CASE_LOW (labels[i])),
    3492           26 :                                wi::to_wide (CASE_HIGH (widest_label))
    3493          161 :                                - wi::to_wide (CASE_LOW (widest_label))))))
    3494           17 :                     widest_label = labels[i];
    3495              : 
    3496           83 :                   if (wi::to_wide (low) + 1 != wi::to_wide (high))
    3497              :                     break;
    3498              :                 }
    3499           62 :               if (i == len)
    3500              :                 {
    3501              :                   /* Designate the label with the widest range to be the
    3502              :                      default label.  */
    3503           48 :                   tree label = CASE_LABEL (widest_label);
    3504           48 :                   default_case = build_case_label (NULL_TREE, NULL_TREE,
    3505              :                                                    label);
    3506              :                 }
    3507              :             }
    3508              :         }
    3509              :     }
    3510              : 
    3511        62743 :   if (default_casep)
    3512        50872 :     *default_casep = default_case;
    3513        62743 : }
    3514              : 
    3515              : /* Set the location of all statements in SEQ to LOC.  */
    3516              : 
    3517              : void
    3518      1055723 : gimple_seq_set_location (gimple_seq seq, location_t loc)
    3519              : {
    3520      2141547 :   for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
    3521      1085824 :     gimple_set_location (gsi_stmt (i), loc);
    3522      1055723 : }
    3523              : 
    3524              : /* Release SSA_NAMEs in SEQ as well as the GIMPLE statements.  */
    3525              : 
    3526              : void
    3527    821546212 : gimple_seq_discard (gimple_seq seq)
    3528              : {
    3529    821546212 :   gimple_stmt_iterator gsi;
    3530              : 
    3531    822124511 :   for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
    3532              :     {
    3533       389724 :       gimple *stmt = gsi_stmt (gsi);
    3534       389724 :       gsi_remove (&gsi, true);
    3535       389724 :       release_defs (stmt);
    3536       389724 :       ggc_free (stmt);
    3537              :     }
    3538    821546212 : }
    3539              : 
    3540              : /* See if STMT now calls function that takes no parameters and if so, drop
    3541              :    call arguments.  This is used when devirtualization machinery redirects
    3542              :    to __builtin_unreachable or __cxa_pure_virtual.  */
    3543              : 
    3544              : void
    3545      1206689 : maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
    3546              : {
    3547      1206689 :   tree decl = gimple_call_fndecl (stmt);
    3548      1206689 :   if (TYPE_ARG_TYPES (TREE_TYPE (decl))
    3549      1205851 :       && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
    3550      1452806 :       && gimple_call_num_args (stmt))
    3551              :     {
    3552       125544 :       gimple_set_num_ops (stmt, 3);
    3553       125544 :       update_stmt_fn (fn, stmt);
    3554              :     }
    3555      1206689 : }
    3556              : 
    3557              : /* Return false if STMT will likely expand to real function call.  */
    3558              : 
    3559              : bool
    3560      3445001 : gimple_inexpensive_call_p (gcall *stmt)
    3561              : {
    3562      3445001 :   if (gimple_call_internal_p (stmt))
    3563              :     return true;
    3564      3387650 :   tree decl = gimple_call_fndecl (stmt);
    3565      3387650 :   if (decl && is_inexpensive_builtin (decl))
    3566              :     return true;
    3567              :   return false;
    3568              : }
    3569              : 
    3570              : /* Return a non-artificial location for STMT.  If STMT does not have
    3571              :    location information, get the location from EXPR.  */
    3572              : 
    3573              : location_t
    3574       124121 : gimple_or_expr_nonartificial_location (gimple *stmt, tree expr)
    3575              : {
    3576       124121 :   location_t loc = gimple_nonartificial_location (stmt);
    3577       124121 :   if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr))
    3578           46 :     loc = tree_nonartificial_location (expr);
    3579       124121 :   return expansion_point_location_if_in_system_header (loc);
    3580              : }
    3581              : 
    3582              : 
    3583              : #if CHECKING_P
    3584              : 
    3585              : namespace selftest {
    3586              : 
    3587              : /* Selftests for core gimple structures.  */
    3588              : 
    3589              : /* Verify that STMT is pretty-printed as EXPECTED.
    3590              :    Helper function for selftests.  */
    3591              : 
    3592              : static void
    3593           20 : verify_gimple_pp (const char *expected, gimple *stmt)
    3594              : {
    3595           20 :   pretty_printer pp;
    3596           20 :   pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
    3597           20 :   ASSERT_STREQ (expected, pp_formatted_text (&pp));
    3598           20 : }
    3599              : 
    3600              : /* Build a GIMPLE_ASSIGN equivalent to
    3601              :      tmp = 5;
    3602              :    and verify various properties of it.  */
    3603              : 
    3604              : static void
    3605            4 : test_assign_single ()
    3606              : {
    3607            4 :   tree type = integer_type_node;
    3608            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3609              :                          get_identifier ("tmp"),
    3610              :                          type);
    3611            4 :   tree rhs = build_int_cst (type, 5);
    3612            4 :   gassign *stmt = gimple_build_assign (lhs, rhs);
    3613            4 :   verify_gimple_pp ("tmp = 5;", stmt);
    3614              : 
    3615            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3616            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3617            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3618            4 :   ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
    3619            4 :   ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
    3620            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3621            4 :   ASSERT_TRUE (gimple_assign_single_p (stmt));
    3622            8 :   ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
    3623            4 : }
    3624              : 
    3625              : /* Build a GIMPLE_ASSIGN equivalent to
    3626              :      tmp = a * b;
    3627              :    and verify various properties of it.  */
    3628              : 
    3629              : static void
    3630            4 : test_assign_binop ()
    3631              : {
    3632            4 :   tree type = integer_type_node;
    3633            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3634              :                          get_identifier ("tmp"),
    3635              :                          type);
    3636            4 :   tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3637              :                        get_identifier ("a"),
    3638              :                        type);
    3639            4 :   tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3640              :                        get_identifier ("b"),
    3641              :                        type);
    3642            4 :   gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
    3643            4 :   verify_gimple_pp ("tmp = a * b;", stmt);
    3644              : 
    3645            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3646            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3647            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3648            4 :   ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
    3649            8 :   ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
    3650            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3651            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3652            4 :   ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
    3653            4 : }
    3654              : 
    3655              : /* Verify that GIMPLE trap queries distinguish a register definition and a
    3656              :    trapping store from their nontrapping right-hand sides.  */
    3657              : 
    3658              : static void
    3659            4 : test_could_trap ()
    3660              : {
    3661            4 :   tree reg_lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3662              :                              get_identifier ("readonly_reg"),
    3663              :                              integer_type_node);
    3664            4 :   TREE_READONLY (reg_lhs) = 1;
    3665            4 :   gassign *stmt = gimple_build_assign (reg_lhs, integer_one_node);
    3666              : 
    3667            4 :   ASSERT_FALSE (gimple_store_p (stmt));
    3668            4 :   ASSERT_FALSE (gimple_could_trap_p (stmt));
    3669            4 :   ASSERT_FALSE (gimple_assign_rhs_could_trap_p (stmt));
    3670              : 
    3671            4 :   tree mem_lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3672              :                              get_identifier ("readonly_mem"),
    3673              :                              integer_type_node);
    3674            4 :   TREE_READONLY (mem_lhs) = 1;
    3675            4 :   TREE_STATIC (mem_lhs) = 1;
    3676            4 :   TREE_ADDRESSABLE (mem_lhs) = 1;
    3677            4 :   stmt = gimple_build_assign (mem_lhs, integer_one_node);
    3678              : 
    3679            4 :   ASSERT_TRUE (gimple_store_p (stmt));
    3680            4 :   ASSERT_TRUE (gimple_could_trap_p (stmt));
    3681            4 :   ASSERT_FALSE (gimple_assign_rhs_could_trap_p (stmt));
    3682              : 
    3683            4 :   tree record_type = make_node (RECORD_TYPE);
    3684            4 :   tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL,
    3685              :                            get_identifier ("value"), integer_type_node);
    3686            4 :   DECL_CONTEXT (field) = record_type;
    3687            4 :   TYPE_FIELDS (record_type) = field;
    3688            4 :   layout_type (record_type);
    3689              : 
    3690            4 :   tree call_lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3691              :                               get_identifier ("readonly_call_mem"),
    3692              :                               record_type);
    3693            4 :   TREE_READONLY (call_lhs) = 1;
    3694            4 :   TREE_STATIC (call_lhs) = 1;
    3695            4 :   TREE_ADDRESSABLE (call_lhs) = 1;
    3696              : 
    3697            4 :   tree fn_type = build_function_type_list (record_type, NULL_TREE);
    3698            4 :   tree fn = build_fn_decl ("nothrow_call", fn_type);
    3699            4 :   gcall *call = gimple_build_call (fn, 0);
    3700            4 :   gimple_call_set_lhs (call, call_lhs);
    3701            4 :   gimple_call_set_nothrow (call, true);
    3702              : 
    3703            4 :   ASSERT_TRUE (gimple_store_p (call));
    3704            4 :   ASSERT_TRUE (gimple_could_trap_p (call));
    3705            4 :   ASSERT_FALSE (gimple_could_trap_p_1 (call, true, false));
    3706              : 
    3707            4 :   gimple_call_set_return_slot_opt (call, true);
    3708            4 :   ASSERT_TRUE (gimple_could_trap_p (call));
    3709            4 :   ASSERT_FALSE (gimple_could_trap_p_1 (call, true, false));
    3710            4 : }
    3711              : 
    3712              : /* Build a GIMPLE_NOP and verify various properties of it.  */
    3713              : 
    3714              : static void
    3715            4 : test_nop_stmt ()
    3716              : {
    3717            4 :   gimple *stmt = gimple_build_nop ();
    3718            4 :   verify_gimple_pp ("GIMPLE_NOP", stmt);
    3719            4 :   ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
    3720            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3721            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3722            4 : }
    3723              : 
    3724              : /* Build a GIMPLE_RETURN equivalent to
    3725              :      return 7;
    3726              :    and verify various properties of it.  */
    3727              : 
    3728              : static void
    3729            4 : test_return_stmt ()
    3730              : {
    3731            4 :   tree type = integer_type_node;
    3732            4 :   tree val = build_int_cst (type, 7);
    3733            4 :   greturn *stmt = gimple_build_return (val);
    3734            4 :   verify_gimple_pp ("return 7;", stmt);
    3735              : 
    3736            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3737            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3738            4 :   ASSERT_EQ (val, gimple_return_retval (stmt));
    3739            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3740            4 : }
    3741              : 
    3742              : /* Build a GIMPLE_RETURN equivalent to
    3743              :      return;
    3744              :    and verify various properties of it.  */
    3745              : 
    3746              : static void
    3747            4 : test_return_without_value ()
    3748              : {
    3749            4 :   greturn *stmt = gimple_build_return (NULL);
    3750            4 :   verify_gimple_pp ("return;", stmt);
    3751              : 
    3752            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3753            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3754            4 :   ASSERT_EQ (NULL, gimple_return_retval (stmt));
    3755            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3756            4 : }
    3757              : 
    3758              : /* Run all of the selftests within this file.  */
    3759              : 
    3760              : void
    3761            4 : gimple_cc_tests ()
    3762              : {
    3763            4 :   test_assign_single ();
    3764            4 :   test_assign_binop ();
    3765            4 :   test_could_trap ();
    3766            4 :   test_nop_stmt ();
    3767            4 :   test_return_stmt ();
    3768            4 :   test_return_without_value ();
    3769            4 : }
    3770              : 
    3771              : } // namespace selftest
    3772              : 
    3773              : 
    3774              : #endif /* CHECKING_P */
        

Generated by: LCOV version 2.5.0-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.