LCOV - code coverage report
Current view: top level - gcc - gimple.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 87.1 % 1563 1361
Test Date: 2026-02-28 14:20:25 Functions: 96.5 % 144 139
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    312820623 : gimple_set_code (gimple *g, enum gimple_code code)
     134              : {
     135    312820623 :   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    380792673 : gimple_size (enum gimple_code code, unsigned num_ops)
     143              : {
     144    380792673 :   size_t size = gsstruct_code_size[gss_for_code (code)];
     145    380792673 :   if (num_ops > 0)
     146    262475485 :     size += (sizeof (tree) * (num_ops - 1));
     147    380792673 :   return size;
     148              : }
     149              : 
     150              : /* Initialize GIMPLE statement G with CODE and NUM_OPS.  */
     151              : 
     152              : void
     153    312820623 : gimple_init (gimple *g, enum gimple_code code, unsigned num_ops)
     154              : {
     155    312820623 :   gimple_set_code (g, code);
     156    312820623 :   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    312820623 :   g->modified = 1;
     161    312820623 :   gimple_init_singleton (g);
     162    312820623 : }
     163              : 
     164              : /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
     165              :    operands.  */
     166              : 
     167              : gimple *
     168    311083579 : gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
     169              : {
     170    311083579 :   size_t size;
     171    311083579 :   gimple *stmt;
     172              : 
     173    311083579 :   size = gimple_size (code, num_ops);
     174    311083579 :   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    311083579 :   stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT);
     182    311083579 :   gimple_init (stmt, code, num_ops);
     183    311083579 :   return stmt;
     184              : }
     185              : 
     186              : /* Set SUBCODE to be the code of the expression computed by statement G.  */
     187              : 
     188              : static inline void
     189    223764325 : 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    223764325 :   gcc_assert (subcode < (1 << 16));
     194    223764325 :   g->subcode = subcode;
     195    223764325 : }
     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    213608653 : 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    213608653 :   gimple_set_subcode (s, subcode);
     212              : 
     213    213608653 :   return s;
     214              : }
     215              : 
     216              : 
     217              : /* Build a GIMPLE_RETURN statement returning RETVAL.  */
     218              : 
     219              : greturn *
     220      3522861 : gimple_build_return (tree retval)
     221              : {
     222      3522861 :   greturn *s
     223      3522861 :     = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK,
     224              :                                                2));
     225      3522861 :   if (retval)
     226      2147543 :     gimple_return_set_retval (s, retval);
     227      3522861 :   return s;
     228              : }
     229              : 
     230              : /* Reset alias information on call S.  */
     231              : 
     232              : void
     233     17585242 : gimple_call_reset_alias_info (gcall *s)
     234              : {
     235     17585242 :   if (gimple_call_flags (s) & ECF_CONST)
     236      2135131 :     memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
     237              :   else
     238     15450111 :     pt_solution_reset (gimple_call_use_set (s));
     239     17585242 :   if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
     240      3342607 :     memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
     241              :   else
     242     14242635 :     pt_solution_reset (gimple_call_clobber_set (s));
     243     17585242 : }
     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     11739798 : gimple_build_call_1 (tree fn, unsigned nargs)
     252              : {
     253     11739798 :   gcall *s
     254     23479596 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     255              :                                              nargs + 3));
     256     11739798 :   if (TREE_CODE (fn) == FUNCTION_DECL)
     257     11529093 :     fn = build_fold_addr_expr (fn);
     258     11739798 :   gimple_set_op (s, 1, fn);
     259     11739798 :   gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn)));
     260     11739798 :   gimple_call_reset_alias_info (s);
     261     11739798 :   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       652950 : gimple_build_call_vec (tree fn, const vec<tree> &args)
     270              : {
     271       652950 :   unsigned i;
     272       652950 :   unsigned nargs = args.length ();
     273       652950 :   gcall *call = gimple_build_call_1 (fn, nargs);
     274              : 
     275      3025012 :   for (i = 0; i < nargs; i++)
     276      1719112 :     gimple_call_set_arg (call, i, args[i]);
     277              : 
     278       652950 :   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       592838 : gimple_build_call (tree fn, unsigned nargs, ...)
     287              : {
     288       592838 :   va_list ap;
     289       592838 :   gcall *call;
     290       592838 :   unsigned i;
     291              : 
     292       592838 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     293              : 
     294       592838 :   call = gimple_build_call_1 (fn, nargs);
     295              : 
     296       592838 :   va_start (ap, nargs);
     297      1224476 :   for (i = 0; i < nargs; i++)
     298       631638 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     299       592838 :   va_end (ap);
     300              : 
     301       592838 :   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         2434 : gimple_build_call_valist (tree fn, unsigned nargs, va_list ap)
     310              : {
     311         2434 :   gcall *call;
     312         2434 :   unsigned i;
     313              : 
     314         2434 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     315              : 
     316         2434 :   call = gimple_build_call_1 (fn, nargs);
     317              : 
     318        11822 :   for (i = 0; i < nargs; i++)
     319         6954 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     320              : 
     321         2434 :   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       786162 : gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs)
     331              : {
     332       786162 :   gcall *s
     333      1572324 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     334              :                                              nargs + 3));
     335       786162 :   s->subcode |= GF_CALL_INTERNAL;
     336       786162 :   gimple_call_set_internal_fn (s, fn);
     337       786162 :   gimple_call_reset_alias_info (s);
     338       786162 :   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       450602 : gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...)
     347              : {
     348       450602 :   va_list ap;
     349       450602 :   gcall *call;
     350       450602 :   unsigned i;
     351              : 
     352       450602 :   call = gimple_build_call_internal_1 (fn, nargs);
     353       450602 :   va_start (ap, nargs);
     354      1809864 :   for (i = 0; i < nargs; i++)
     355      1359262 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     356       450602 :   va_end (ap);
     357              : 
     358       450602 :   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       335555 : gimple_build_call_internal_vec (enum internal_fn fn, const vec<tree> &args)
     367              : {
     368       335555 :   unsigned i, nargs;
     369       335555 :   gcall *call;
     370              : 
     371       335555 :   nargs = args.length ();
     372       335555 :   call = gimple_build_call_internal_1 (fn, nargs);
     373      1665546 :   for (i = 0; i < nargs; i++)
     374       994436 :     gimple_call_set_arg (call, i, args[i]);
     375              : 
     376       335555 :   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     10491581 : gimple_build_call_from_tree (tree t, tree fnptrtype)
     386              : {
     387     10491581 :   unsigned i, nargs;
     388     10491581 :   gcall *call;
     389              : 
     390     10491581 :   gcc_assert (TREE_CODE (t) == CALL_EXPR);
     391              : 
     392     10491581 :   nargs = call_expr_nargs (t);
     393              : 
     394     10491581 :   tree fndecl = NULL_TREE;
     395     10491581 :   if (CALL_EXPR_FN (t) == NULL_TREE)
     396            5 :     call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs);
     397              :   else
     398              :     {
     399     10491576 :       fndecl = get_callee_fndecl (t);
     400     10653691 :       call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
     401              :     }
     402              : 
     403     29265527 :   for (i = 0; i < nargs; i++)
     404     18773946 :     gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
     405              : 
     406     10491581 :   gimple_set_block (call, TREE_BLOCK (t));
     407     10491581 :   gimple_set_location (call, EXPR_LOCATION (t));
     408              : 
     409              :   /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL.  */
     410     10491581 :   gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
     411     10491581 :   gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
     412     10491581 :   gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t));
     413     10491581 :   gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
     414     10491581 :   if (fndecl
     415     10329461 :       && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
     416     12738462 :       && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl)))
     417        41329 :     gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t));
     418     10450252 :   else if (fndecl
     419     20738384 :            && (DECL_IS_OPERATOR_NEW_P (fndecl)
     420     10224317 :                || DECL_IS_OPERATOR_DELETE_P (fndecl)))
     421       148921 :     gimple_call_set_from_new_or_delete (call, CALL_FROM_NEW_OR_DELETE_P (t));
     422              :   else
     423     10301331 :     gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
     424     10491581 :   gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
     425     10491581 :   gimple_call_set_nothrow (call, TREE_NOTHROW (t));
     426     10491581 :   if (fndecl)
     427     31150503 :     gimple_call_set_expected_throw (call,
     428     10329461 :                                     flags_from_decl_or_type (fndecl)
     429     10329461 :                                     & ECF_XTHROW);
     430     10491581 :   gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t));
     431     10491581 :   copy_warning (call, t);
     432              : 
     433     10491581 :   if (fnptrtype)
     434              :     {
     435     10491454 :       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     10491454 :       if (!fndecl)
     441              :         {
     442       161993 :           gcc_assert (POINTER_TYPE_P (fnptrtype));
     443       161993 :           tree fntype = TREE_TYPE (fnptrtype);
     444              : 
     445       161993 :           if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype)))
     446           21 :             gimple_call_set_nocf_check (call, true);
     447              :         }
     448              :     }
     449              : 
     450     10491581 :   return call;
     451              : }
     452              : 
     453              : /* Build a gcall to __builtin_unreachable as rewritten by
     454              :    -fsanitize=unreachable.  */
     455              : 
     456              : gcall *
     457       174411 : gimple_build_builtin_unreachable (location_t loc)
     458              : {
     459       174411 :   tree data = NULL_TREE;
     460       174411 :   tree fn = sanitize_unreachable_fn (&data, loc);
     461       174411 :   gcall *g = gimple_build_call (fn, data != NULL_TREE, data);
     462       174411 :   gimple_call_set_ctrl_altering (g, true);
     463       174411 :   gimple_set_location (g, loc);
     464       174411 :   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     86255762 : gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL)
     474              : {
     475     86255762 :   enum tree_code subcode;
     476     86255762 :   tree op1, op2, op3;
     477              : 
     478     86255762 :   extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3);
     479     86255762 :   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     92285837 : gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1,
     488              :                        tree op2, tree op3 MEM_STAT_DECL)
     489              : {
     490     92285837 :   unsigned num_ops;
     491     92285837 :   gassign *p;
     492              : 
     493              :   /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
     494              :      code).  */
     495     92285837 :   num_ops = get_gimple_rhs_num_ops (subcode) + 1;
     496              : 
     497    184571674 :   p = as_a <gassign *> (
     498              :         gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
     499              :                                     PASS_MEM_STAT));
     500     92285837 :   gimple_assign_set_lhs (p, lhs);
     501              :   /* For COND_EXPR, op1 should not be a comparison. */
     502     92285837 :   if (op1 && subcode == COND_EXPR)
     503       269377 :     gcc_assert (!COMPARISON_CLASS_P  (op1));
     504     92285837 :   gimple_assign_set_rhs1 (p, op1);
     505     92285837 :   if (op2)
     506              :     {
     507     14627825 :       gcc_assert (num_ops > 2);
     508     14627825 :       gimple_assign_set_rhs2 (p, op2);
     509              :     }
     510              : 
     511     92285837 :   if (op3)
     512              :     {
     513       382822 :       gcc_assert (num_ops > 3);
     514       382822 :       gimple_assign_set_rhs3 (p, op3);
     515              :     }
     516              : 
     517     92285837 :   return p;
     518              : }
     519              : 
     520              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
     521              :    OP1, OP2 and OP3.  */
     522              : 
     523              : gassign *
     524     87552421 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     525              :                      tree op2, tree op3 MEM_STAT_DECL)
     526              : {
     527     87552421 :   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      3344076 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     535              :                      tree op2 MEM_STAT_DECL)
     536              : {
     537      3344076 :   return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE
     538      3344076 :                                 PASS_MEM_STAT);
     539              : }
     540              : 
     541              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1.  */
     542              : 
     543              : gassign *
     544      1389340 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL)
     545              : {
     546      1389340 :   return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE
     547      1389340 :                                 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     10688087 : gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
     559              :                    tree t_label, tree f_label)
     560              : {
     561     10688087 :   gcond *p;
     562              : 
     563     10688087 :   gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
     564     21376174 :   p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4));
     565     10688087 :   gimple_cond_set_lhs (p, lhs);
     566     10688087 :   gimple_cond_set_rhs (p, rhs);
     567     10688087 :   gimple_cond_set_true_label (p, t_label);
     568     10688087 :   gimple_cond_set_false_label (p, f_label);
     569     10688087 :   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       102375 : gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
     577              : {
     578       102375 :   enum tree_code code;
     579       102375 :   tree lhs, rhs;
     580              : 
     581       102375 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     582       102375 :   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       404964 : gimple_cond_set_condition_from_tree (gcond *stmt, tree cond)
     590              : {
     591       404964 :   enum tree_code code;
     592       404964 :   tree lhs, rhs;
     593              : 
     594       404964 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     595       404964 :   gimple_cond_set_condition (stmt, code, lhs, rhs);
     596       404964 : }
     597              : 
     598              : /* Build a GIMPLE_LABEL statement for LABEL.  */
     599              : 
     600              : glabel *
     601     19142999 : gimple_build_label (tree label)
     602              : {
     603     19142999 :   glabel *p
     604     19142999 :     = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1));
     605     19142999 :   gimple_label_set_label (p, label);
     606     19142999 :   return p;
     607              : }
     608              : 
     609              : /* Build a GIMPLE_GOTO statement to label DEST.  */
     610              : 
     611              : ggoto *
     612      6964243 : gimple_build_goto (tree dest)
     613              : {
     614      6964243 :   ggoto *p
     615      6964243 :     = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1));
     616      6964243 :   gimple_goto_set_dest (p, dest);
     617      6964243 :   return p;
     618              : }
     619              : 
     620              : 
     621              : /* Build a GIMPLE_NOP statement.  */
     622              : 
     623              : gimple *
     624     15026351 : gimple_build_nop (void)
     625              : {
     626     15026351 :   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      7327972 : gimple_build_bind (tree vars, gimple_seq body, tree block)
     636              : {
     637      7327972 :   gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0));
     638      7327972 :   gimple_bind_set_vars (p, vars);
     639      7327972 :   if (body)
     640      1274344 :     gimple_bind_set_body (p, body);
     641      7327972 :   if (block)
     642      5907819 :     gimple_bind_set_block (p, block);
     643      7327972 :   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       102248 : gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
     656              :                     unsigned nclobbers, unsigned nlabels)
     657              : {
     658       102248 :   gasm *p;
     659       102248 :   int size = strlen (string);
     660              : 
     661       102248 :   p = as_a <gasm *> (
     662       102248 :         gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
     663              :                                ninputs + noutputs + nclobbers + nlabels));
     664              : 
     665       102248 :   p->ni = ninputs;
     666       102248 :   p->no = noutputs;
     667       102248 :   p->nc = nclobbers;
     668       102248 :   p->nl = nlabels;
     669       102248 :   p->string = ggc_alloc_string (string, size);
     670              : 
     671       102248 :   if (GATHER_STATISTICS)
     672              :     gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
     673              : 
     674       102248 :   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       102248 : 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       102248 :   gasm *p;
     694       102248 :   unsigned i;
     695              : 
     696       200947 :   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       329217 :   for (i = 0; i < vec_safe_length (inputs); i++)
     703        45906 :     gimple_asm_set_input_op (p, i, (*inputs)[i]);
     704              : 
     705       260986 :   for (i = 0; i < vec_safe_length (outputs); i++)
     706        64398 :     gimple_asm_set_output_op (p, i, (*outputs)[i]);
     707              : 
     708       361336 :   for (i = 0; i < vec_safe_length (clobbers); i++)
     709        95437 :     gimple_asm_set_clobber_op (p, i, (*clobbers)[i]);
     710              : 
     711       103130 :   for (i = 0; i < vec_safe_length (labels); i++)
     712          882 :     gimple_asm_set_label_op (p, i, (*labels)[i]);
     713              : 
     714       102248 :   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        39583 : gimple_build_catch (tree types, gimple_seq handler)
     724              : {
     725        39583 :   gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0));
     726        39583 :   gimple_catch_set_types (p, types);
     727        39583 :   if (handler)
     728        39571 :     gimple_catch_set_handler (p, handler);
     729              : 
     730        39583 :   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         5332 : gimple_build_eh_filter (tree types, gimple_seq failure)
     740              : {
     741         5332 :   geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0));
     742         5332 :   gimple_eh_filter_set_types (p, types);
     743         5332 :   if (failure)
     744         5332 :     gimple_eh_filter_set_failure (p, failure);
     745              : 
     746         5332 :   return p;
     747              : }
     748              : 
     749              : /* Build a GIMPLE_EH_MUST_NOT_THROW statement.  */
     750              : 
     751              : geh_mnt *
     752      1226416 : gimple_build_eh_must_not_throw (tree decl)
     753              : {
     754      1226416 :   geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0));
     755              : 
     756      1226416 :   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
     757      1226416 :   gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
     758      1226416 :   gimple_eh_must_not_throw_set_fndecl (p, decl);
     759              : 
     760      1226416 :   return p;
     761              : }
     762              : 
     763              : /* Build a GIMPLE_EH_ELSE statement.  */
     764              : 
     765              : geh_else *
     766          429 : gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body)
     767              : {
     768          429 :   geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0));
     769          429 :   gimple_eh_else_set_n_body (p, n_body);
     770          429 :   gimple_eh_else_set_e_body (p, e_body);
     771          429 :   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      3019316 : gimple_build_try (gimple_seq eval, gimple_seq cleanup,
     783              :                   enum gimple_try_flags kind)
     784              : {
     785      3019316 :   gtry *p;
     786              : 
     787      3019316 :   gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
     788      3019316 :   p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0));
     789      3019316 :   gimple_set_subcode (p, kind);
     790      3019316 :   if (eval)
     791      2931272 :     gimple_try_set_eval (p, eval);
     792      3019316 :   if (cleanup)
     793      3019316 :     gimple_try_set_cleanup (p, cleanup);
     794              : 
     795      3019316 :   return p;
     796              : }
     797              : 
     798              : /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
     799              : 
     800              :    CLEANUP is the cleanup expression.  */
     801              : 
     802              : gimple *
     803       581847 : gimple_build_wce (gimple_seq cleanup)
     804              : {
     805       581847 :   gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
     806       581847 :   if (cleanup)
     807       581847 :     gimple_wce_set_cleanup (p, cleanup);
     808              : 
     809       581847 :   return p;
     810              : }
     811              : 
     812              : 
     813              : /* Build a GIMPLE_RESX statement.  */
     814              : 
     815              : gresx *
     816       856443 : gimple_build_resx (int region)
     817              : {
     818       856443 :   gresx *p
     819       856443 :     = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0));
     820       856443 :   p->region = region;
     821       856443 :   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        67862 : gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
     832              : {
     833              :   /* nlabels + 1 default label + 1 index.  */
     834        67862 :   gcc_checking_assert (default_label);
     835       135724 :   gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH,
     836              :                                                         ERROR_MARK,
     837              :                                                         1 + 1 + nlabels));
     838        67862 :   gimple_switch_set_index (p, index);
     839        67862 :   gimple_switch_set_default_label (p, default_label);
     840        67862 :   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        67862 : gimple_build_switch (tree index, tree default_label, const vec<tree> &args)
     851              : {
     852        67862 :   unsigned i, nlabels = args.length ();
     853              : 
     854        67862 :   gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label);
     855              : 
     856              :   /* Copy the labels from the vector to the switch statement.  */
     857      1233732 :   for (i = 0; i < nlabels; i++)
     858      1098008 :     gimple_switch_set_label (p, i + 1, args[i]);
     859              : 
     860        67862 :   return p;
     861              : }
     862              : 
     863              : /* Build a GIMPLE_EH_DISPATCH statement.  */
     864              : 
     865              : geh_dispatch *
     866        41587 : gimple_build_eh_dispatch (int region)
     867              : {
     868        41587 :   geh_dispatch *p
     869        41587 :     = as_a <geh_dispatch *> (
     870              :         gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0));
     871        41587 :   p->region = region;
     872        41587 :   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     60595354 : gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL)
     881              : {
     882     60595354 :   gdebug *p
     883     60595354 :     = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG,
     884              :                                                    (unsigned)GIMPLE_DEBUG_BIND, 2
     885              :                                                    PASS_MEM_STAT));
     886     60595354 :   gimple_debug_bind_set_var (p, var);
     887     60595354 :   gimple_debug_bind_set_value (p, value);
     888     60595354 :   if (stmt)
     889     59637960 :     gimple_set_location (p, gimple_location (stmt));
     890              : 
     891     60595354 :   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       597442 : gimple_build_debug_source_bind (tree var, tree value,
     901              :                                      gimple *stmt MEM_STAT_DECL)
     902              : {
     903       597442 :   gdebug *p
     904       597442 :     = as_a <gdebug *> (
     905              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     906              :                                     (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2
     907              :                                     PASS_MEM_STAT));
     908              : 
     909       597442 :   gimple_debug_source_bind_set_var (p, var);
     910       597442 :   gimple_debug_source_bind_set_value (p, value);
     911       597442 :   if (stmt)
     912       466035 :     gimple_set_location (p, gimple_location (stmt));
     913              : 
     914       597442 :   return p;
     915              : }
     916              : 
     917              : 
     918              : /* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at
     919              :    LOCATION.  */
     920              : 
     921              : gdebug *
     922      2450805 : gimple_build_debug_begin_stmt (tree block, location_t location
     923              :                                     MEM_STAT_DECL)
     924              : {
     925      2450805 :   gdebug *p
     926      2450805 :     = as_a <gdebug *> (
     927              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     928              :                                     (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0
     929              :                                     PASS_MEM_STAT));
     930              : 
     931      2450805 :   gimple_set_location (p, location);
     932      2450805 :   gimple_set_block (p, block);
     933      2450805 :   cfun->debug_marker_count++;
     934              : 
     935      2450805 :   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      3766925 : gimple_build_debug_inline_entry (tree block, location_t location
     944              :                                       MEM_STAT_DECL)
     945              : {
     946      3766925 :   gdebug *p
     947      3766925 :     = as_a <gdebug *> (
     948              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     949              :                                     (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0
     950              :                                     PASS_MEM_STAT));
     951              : 
     952      3766925 :   gimple_set_location (p, location);
     953      3766925 :   gimple_set_block (p, block);
     954      3766925 :   cfun->debug_marker_count++;
     955              : 
     956      3766925 :   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          546 : gimple_build_omp_critical (gimple_seq body, tree name, tree clauses)
     968              : {
     969          546 :   gomp_critical *p
     970          546 :     = as_a <gomp_critical *> (gimple_alloc (GIMPLE_OMP_CRITICAL, 0));
     971          546 :   gimple_omp_critical_set_name (p, name);
     972          546 :   gimple_omp_critical_set_clauses (p, clauses);
     973          546 :   if (body)
     974          456 :     gimple_omp_set_body (p, body);
     975              : 
     976          546 :   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        53356 : gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse,
     989              :                       gimple_seq pre_body)
     990              : {
     991        53356 :   gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0));
     992        53356 :   if (body)
     993        49501 :     gimple_omp_set_body (p, body);
     994        53356 :   gimple_omp_for_set_clauses (p, clauses);
     995        53356 :   gimple_omp_for_set_kind (p, kind);
     996        53356 :   p->collapse = collapse;
     997        53356 :   p->iter =  ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse);
     998              : 
     999        53356 :   if (pre_body)
    1000         3571 :     gimple_omp_for_set_pre_body (p, pre_body);
    1001              : 
    1002        53356 :   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        18410 : gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
    1015              :                            tree data_arg)
    1016              : {
    1017        18410 :   gomp_parallel *p
    1018        18410 :     = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0));
    1019        18410 :   if (body)
    1020        18214 :     gimple_omp_set_body (p, body);
    1021        18410 :   gimple_omp_parallel_set_clauses (p, clauses);
    1022        18410 :   gimple_omp_parallel_set_child_fn (p, child_fn);
    1023        18410 :   gimple_omp_parallel_set_data_arg (p, data_arg);
    1024              : 
    1025        18410 :   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         5429 : 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         5429 :   gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0));
    1044         5429 :   if (body)
    1045         5339 :     gimple_omp_set_body (p, body);
    1046         5429 :   gimple_omp_task_set_clauses (p, clauses);
    1047         5429 :   gimple_omp_task_set_child_fn (p, child_fn);
    1048         5429 :   gimple_omp_task_set_data_arg (p, data_arg);
    1049         5429 :   gimple_omp_task_set_copy_fn (p, copy_fn);
    1050         5429 :   gimple_omp_task_set_arg_size (p, arg_size);
    1051         5429 :   gimple_omp_task_set_arg_align (p, arg_align);
    1052              : 
    1053         5429 :   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         1271 : gimple_build_omp_section (gimple_seq body)
    1063              : {
    1064         1271 :   gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0);
    1065         1271 :   if (body)
    1066         1079 :     gimple_omp_set_body (p, body);
    1067              : 
    1068         1271 :   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          487 : gimple_build_omp_masked (gimple_seq body, tree clauses)
    1107              : {
    1108          487 :   gimple *p = gimple_alloc (GIMPLE_OMP_MASKED, 0);
    1109          487 :   gimple_omp_masked_set_clauses (p, clauses);
    1110          487 :   if (body)
    1111          407 :     gimple_omp_set_body (p, body);
    1112              : 
    1113          487 :   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        51815 : gimple_build_omp_continue (tree control_def, tree control_use)
    1141              : {
    1142        51815 :   gomp_continue *p
    1143        51815 :     = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0));
    1144        51815 :   gimple_omp_continue_set_control_def (p, control_def);
    1145        51815 :   gimple_omp_continue_set_control_use (p, control_use);
    1146        51815 :   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         1848 : gimple_build_omp_ordered (gimple_seq body, tree clauses)
    1157              : {
    1158         1848 :   gomp_ordered *p
    1159         1848 :     = as_a <gomp_ordered *> (gimple_alloc (GIMPLE_OMP_ORDERED, 0));
    1160         1848 :   gimple_omp_ordered_set_clauses (p, clauses);
    1161         1848 :   if (body)
    1162          501 :     gimple_omp_set_body (p, body);
    1163              : 
    1164         1848 :   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       101163 : gimple_build_omp_return (bool wait_p)
    1173              : {
    1174       101163 :   gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
    1175       101163 :   if (wait_p)
    1176        37676 :     gimple_omp_return_set_nowait (p);
    1177              : 
    1178       101163 :   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         1284 : gimple_build_omp_scan (gimple_seq body, tree clauses)
    1190              : {
    1191         1284 :   gomp_scan *p
    1192         1284 :     = as_a <gomp_scan *> (gimple_alloc (GIMPLE_OMP_SCAN, 0));
    1193         1284 :   gimple_omp_scan_set_clauses (p, clauses);
    1194         1284 :   if (body)
    1195         1070 :     gimple_omp_set_body (p, body);
    1196              : 
    1197         1284 :   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          626 : gimple_build_omp_sections (gimple_seq body, tree clauses)
    1209              : {
    1210          626 :   gomp_sections *p
    1211          626 :     = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0));
    1212          626 :   if (body)
    1213          626 :     gimple_omp_set_body (p, body);
    1214          626 :   gimple_omp_sections_set_clauses (p, clauses);
    1215              : 
    1216          626 :   return p;
    1217              : }
    1218              : 
    1219              : 
    1220              : /* Build a GIMPLE_OMP_SECTIONS_SWITCH.  */
    1221              : 
    1222              : gimple *
    1223          378 : gimple_build_omp_sections_switch (void)
    1224              : {
    1225          378 :   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         1275 : gimple_build_omp_single (gimple_seq body, tree clauses)
    1237              : {
    1238         1275 :   gomp_single *p
    1239         1275 :     = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0));
    1240         1275 :   if (body)
    1241         1166 :     gimple_omp_set_body (p, body);
    1242         1275 :   gimple_omp_single_set_clauses (p, clauses);
    1243              : 
    1244         1275 :   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          214 : gimple_build_omp_scope (gimple_seq body, tree clauses)
    1256              : {
    1257          214 :   gimple *p = gimple_alloc (GIMPLE_OMP_SCOPE, 0);
    1258          214 :   gimple_omp_scope_set_clauses (p, clauses);
    1259          214 :   if (body)
    1260          156 :     gimple_omp_set_body (p, body);
    1261              : 
    1262          214 :   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        42393 : gimple_build_omp_target (gimple_seq body, int kind, tree clauses,
    1304              :                          gimple_seq iterator_loops)
    1305              : {
    1306        42393 :   gomp_target *p
    1307        42393 :     = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0));
    1308        42393 :   if (body)
    1309        28926 :     gimple_omp_set_body (p, body);
    1310        42393 :   gimple_omp_target_set_clauses (p, clauses);
    1311        42393 :   gimple_omp_target_set_kind (p, kind);
    1312        42393 :   gimple_omp_target_set_iterator_loops (p, iterator_loops);
    1313              : 
    1314        42393 :   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         8793 : gimple_build_omp_teams (gimple_seq body, tree clauses)
    1325              : {
    1326         8793 :   gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0));
    1327         8793 :   if (body)
    1328         8793 :     gimple_omp_set_body (p, body);
    1329         8793 :   gimple_omp_teams_set_clauses (p, clauses);
    1330              : 
    1331         8793 :   return p;
    1332              : }
    1333              : 
    1334              : 
    1335              : /* Build a GIMPLE_OMP_ATOMIC_LOAD statement.  */
    1336              : 
    1337              : gomp_atomic_load *
    1338        10304 : gimple_build_omp_atomic_load (tree lhs, tree rhs, enum omp_memory_order mo)
    1339              : {
    1340        10304 :   gomp_atomic_load *p
    1341        10304 :     = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0));
    1342        10304 :   gimple_omp_atomic_load_set_lhs (p, lhs);
    1343        10304 :   gimple_omp_atomic_load_set_rhs (p, rhs);
    1344        10304 :   gimple_omp_atomic_set_memory_order (p, mo);
    1345        10304 :   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        10304 : gimple_build_omp_atomic_store (tree val, enum omp_memory_order mo)
    1354              : {
    1355        10304 :   gomp_atomic_store *p
    1356        10304 :     = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0));
    1357        10304 :   gimple_omp_atomic_store_set_val (p, val);
    1358        10304 :   gimple_omp_atomic_set_memory_order (p, mo);
    1359        10304 :   return p;
    1360              : }
    1361              : 
    1362              : /* Build a GIMPLE_ASSUME statement.  */
    1363              : 
    1364              : gimple *
    1365          124 : gimple_build_assume (tree guard, gimple_seq body)
    1366              : {
    1367          124 :   gimple_statement_assume *p
    1368          124 :     = as_a <gimple_statement_assume *> (gimple_alloc (GIMPLE_ASSUME, 0));
    1369          124 :   gimple_assume_set_guard (p, guard);
    1370          124 :   *gimple_assume_body_ptr (p) = body;
    1371          124 :   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     45540830 : gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs)
    1413              : {
    1414     45540830 :   gimple_stmt_iterator si;
    1415     45540830 :   if (gs == NULL)
    1416            0 :     return;
    1417              : 
    1418     45540830 :   si = gsi_last (*seq_p);
    1419     45540830 :   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    181435749 : gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs)
    1430              : {
    1431    181435749 :   gimple_stmt_iterator si;
    1432              : 
    1433    181435749 :   if (gs == NULL)
    1434            0 :     return;
    1435              : 
    1436    181435749 :   si = gsi_last (*seq_p);
    1437    181435749 :   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     15815077 : gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
    1445              : {
    1446     15815077 :   gimple_stmt_iterator si;
    1447     15815077 :   if (src == NULL)
    1448      4531689 :     return;
    1449              : 
    1450     11283388 :   si = gsi_last (*dst_p);
    1451     11283388 :   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       268368 : gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src)
    1460              : {
    1461       268368 :   gimple_stmt_iterator si;
    1462       268368 :   if (src == NULL)
    1463        91338 :     return;
    1464              : 
    1465       177030 :   si = gsi_last (*dst_p);
    1466       177030 :   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    266857285 : 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    266857285 :   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    674072500 : annotate_one_with_location (gimple *gs, location_t location)
    1487              : {
    1488    674072500 :   if (!gimple_has_location (gs)
    1489    336404090 :       && !gimple_do_not_emit_location_p (gs)
    1490    674072500 :       && should_carry_location_p (gs))
    1491     25478899 :     gimple_set_location (gs, location);
    1492    674072500 : }
    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     98083265 : annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
    1500              :                                   location_t location)
    1501              : {
    1502     98083265 :   if (gsi_end_p (gsi))
    1503     33616227 :     gsi = gsi_start (seq);
    1504              :   else
    1505     64467038 :     gsi_next (&gsi);
    1506              : 
    1507    771821405 :   for (; !gsi_end_p (gsi); gsi_next (&gsi))
    1508    673738140 :     annotate_one_with_location (gsi_stmt (gsi), location);
    1509     98083265 : }
    1510              : 
    1511              : /* Set the location for all the statements in a sequence STMT_P to LOCATION.  */
    1512              : 
    1513              : void
    1514       213357 : annotate_all_with_location (gimple_seq stmt_p, location_t location)
    1515              : {
    1516       213357 :   gimple_stmt_iterator i;
    1517              : 
    1518       213357 :   if (gimple_seq_empty_p (stmt_p))
    1519       213357 :     return;
    1520              : 
    1521       540267 :   for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
    1522              :     {
    1523       334360 :       gimple *gs = gsi_stmt (i);
    1524       334360 :       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        36669 : empty_stmt_p (gimple *stmt)
    1533              : {
    1534        36669 :   if (gimple_code (stmt) == GIMPLE_NOP)
    1535              :     return true;
    1536        36667 :   if (gbind *bind_stmt = dyn_cast <gbind *> (stmt))
    1537        21745 :     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        36742 : empty_body_p (gimple_seq body)
    1546              : {
    1547        36742 :   gimple_stmt_iterator i;
    1548              : 
    1549        36742 :   if (gimple_seq_empty_p (body))
    1550              :     return true;
    1551        36846 :   for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
    1552        36669 :     if (!empty_stmt_p (gsi_stmt (i))
    1553        36669 :         && !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      1750473 : gimple_seq_copy (gimple_seq src)
    1564              : {
    1565      1750473 :   gimple_stmt_iterator gsi;
    1566      1750473 :   gimple_seq new_seq = NULL;
    1567      1750473 :   gimple *stmt;
    1568              : 
    1569      3947351 :   for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
    1570              :     {
    1571      2196878 :       stmt = gimple_copy (gsi_stmt (gsi));
    1572      2196878 :       gimple_seq_add_stmt (&new_seq, stmt);
    1573              :     }
    1574              : 
    1575      1750473 :   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       981740 : gimple_call_same_target_p (const gimple *c1, const gimple *c2)
    1584              : {
    1585       981740 :   if (gimple_call_internal_p (c1))
    1586         4699 :     return (gimple_call_internal_p (c2)
    1587         4699 :             && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
    1588         9398 :             && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
    1589            0 :                 || c1 == c2));
    1590              :   else
    1591       977041 :     return (gimple_call_fn (c1) == gimple_call_fn (c2)
    1592       977041 :             || (gimple_call_fndecl (c1)
    1593       976403 :                 && 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   4145497368 : gimple_call_flags (const gimple *stmt)
    1601              : {
    1602   4145497368 :   int flags = 0;
    1603              : 
    1604   4145497368 :   if (gimple_call_internal_p (stmt))
    1605    108307792 :     flags = internal_fn_flags (gimple_call_internal_fn (stmt));
    1606              :   else
    1607              :     {
    1608   4037189576 :       tree decl = gimple_call_fndecl (stmt);
    1609   4037189576 :       if (decl)
    1610   3911745837 :         flags = flags_from_decl_or_type (decl);
    1611   4037189576 :       flags |= flags_from_decl_or_type (gimple_call_fntype (stmt));
    1612              :     }
    1613              : 
    1614   4145497368 :   if (stmt->subcode & GF_CALL_NOTHROW)
    1615    716238475 :     flags |= ECF_NOTHROW;
    1616   4145497368 :   if (stmt->subcode & GF_CALL_XTHROW)
    1617     11888364 :     flags |= ECF_XTHROW;
    1618              : 
    1619   4145497368 :   if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
    1620            0 :     flags |= ECF_BY_DESCRIPTOR;
    1621              : 
    1622   4145497368 :   return flags;
    1623              : }
    1624              : 
    1625              : /* Return the "fn spec" string for call STMT.  */
    1626              : 
    1627              : attr_fnspec
    1628    430473584 : gimple_call_fnspec (const gcall *stmt)
    1629              : {
    1630    430473584 :   tree type, attr;
    1631              : 
    1632    430473584 :   if (gimple_call_internal_p (stmt))
    1633              :     {
    1634      8854482 :       const_tree spec = internal_fn_fnspec (gimple_call_internal_fn (stmt));
    1635      8854482 :       if (spec)
    1636       325438 :         return spec;
    1637              :       else
    1638      8529044 :         return "";
    1639              :     }
    1640              : 
    1641    421619102 :   type = gimple_call_fntype (stmt);
    1642    421619102 :   if (type)
    1643              :     {
    1644    421619102 :       attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
    1645    421619102 :       if (attr)
    1646     59692820 :         return TREE_VALUE (TREE_VALUE (attr));
    1647              :     }
    1648    361926282 :   if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
    1649    111607558 :     return builtin_fnspec (gimple_call_fndecl (stmt));
    1650    250318724 :   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    250318724 :   if (fndecl
    1655    236351104 :       && DECL_IS_OPERATOR_DELETE_P (fndecl)
    1656      6744438 :       && DECL_IS_REPLACEABLE_OPERATOR (fndecl)
    1657    257058714 :       && gimple_call_from_new_or_delete (stmt))
    1658              :     {
    1659      6685149 :       if (flag_assume_sane_operators_new_delete)
    1660      6683883 :         return ".co ";
    1661              :       else
    1662         1266 :         return ". o ";
    1663              :     }
    1664              :   /* Similarly operator new can be treated as malloc.  */
    1665    243633575 :   if (fndecl
    1666    229665955 :       && DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
    1667    246427482 :       && gimple_call_from_new_or_delete (stmt))
    1668              :     {
    1669      2759638 :       if (flag_assume_sane_operators_new_delete)
    1670      2758643 :         return "mC";
    1671              :       else
    1672          995 :         return "m ";
    1673              :     }
    1674    240873937 :   return "";
    1675              : }
    1676              : 
    1677              : /* Detects argument flags for argument number ARG on call STMT.  */
    1678              : 
    1679              : int
    1680    117422155 : gimple_call_arg_flags (const gcall *stmt, unsigned arg)
    1681              : {
    1682    117422155 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1683    117422155 :   int flags = 0;
    1684              : 
    1685    117422155 :   if (fnspec.known_p ())
    1686     22953578 :     flags = fnspec.arg_eaf_flags (arg);
    1687    117422155 :   tree callee = gimple_call_fndecl (stmt);
    1688    117422155 :   if (callee)
    1689              :     {
    1690    110040119 :       cgraph_node *node = cgraph_node::get (callee);
    1691    110040119 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1692              :                                 : NULL;
    1693              : 
    1694    109840758 :       if (summary && summary->arg_flags.length () > arg)
    1695              :         {
    1696     20570454 :           int modref_flags = summary->arg_flags[arg];
    1697              : 
    1698              :           /* We have possibly optimized out load.  Be conservative here.  */
    1699     20570454 :           if (!node->binds_to_current_def_p ())
    1700      9545478 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1701     20570454 :           if (dbg_cnt (ipa_mod_ref_pta))
    1702     20570454 :             flags |= modref_flags;
    1703              :         }
    1704              :     }
    1705    117422155 :   return flags;
    1706              : }
    1707              : 
    1708              : /* Detects argument flags for return slot on call STMT.  */
    1709              : 
    1710              : int
    1711        90784 : gimple_call_retslot_flags (const gcall *stmt)
    1712              : {
    1713        90784 :   int flags = implicit_retslot_eaf_flags;
    1714              : 
    1715        90784 :   tree callee = gimple_call_fndecl (stmt);
    1716        90784 :   if (callee)
    1717              :     {
    1718        81020 :       cgraph_node *node = cgraph_node::get (callee);
    1719        81020 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1720              :                                 : NULL;
    1721              : 
    1722        81020 :       if (summary)
    1723              :         {
    1724        54654 :           int modref_flags = summary->retslot_flags;
    1725              : 
    1726              :           /* We have possibly optimized out load.  Be conservative here.  */
    1727        54654 :           if (!node->binds_to_current_def_p ())
    1728        46605 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1729        54654 :           if (dbg_cnt (ipa_mod_ref_pta))
    1730        54654 :             flags |= modref_flags;
    1731              :         }
    1732              :     }
    1733        90784 :   return flags;
    1734              : }
    1735              : 
    1736              : /* Detects argument flags for static chain on call STMT.  */
    1737              : 
    1738              : int
    1739       180123 : gimple_call_static_chain_flags (const gcall *stmt)
    1740              : {
    1741       180123 :   int flags = 0;
    1742              : 
    1743       180123 :   tree callee = gimple_call_fndecl (stmt);
    1744       180123 :   if (callee)
    1745              :     {
    1746        27632 :       cgraph_node *node = cgraph_node::get (callee);
    1747        27632 :       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        27632 :       gcc_checking_assert (node->binds_to_current_def_p ());
    1753        27632 :       if (summary)
    1754              :         {
    1755        25855 :           int modref_flags = summary->static_chain_flags;
    1756              : 
    1757        25855 :           if (dbg_cnt (ipa_mod_ref_pta))
    1758       180123 :             flags |= modref_flags;
    1759              :         }
    1760              :     }
    1761       180123 :   return flags;
    1762              : }
    1763              : 
    1764              : /* Detects return flags for the call STMT.  */
    1765              : 
    1766              : int
    1767     47798705 : gimple_call_return_flags (const gcall *stmt)
    1768              : {
    1769     47798705 :   if (gimple_call_flags (stmt) & ECF_MALLOC)
    1770              :     return ERF_NOALIAS;
    1771              : 
    1772     45870506 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1773              : 
    1774     45870506 :   unsigned int arg_no;
    1775     45870506 :   if (fnspec.returns_arg (&arg_no))
    1776      1057859 :     return ERF_RETURNS_ARG | arg_no;
    1777              : 
    1778     44812647 :   if (fnspec.returns_noalias_p ())
    1779              :     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     12993938 : gimple_call_nonnull_result_p (gcall *call)
    1788              : {
    1789     12993938 :   tree fndecl = gimple_call_fndecl (call);
    1790     12993938 :   if (!fndecl)
    1791              :     return false;
    1792     11899524 :   if (flag_delete_null_pointer_checks && !flag_check_new
    1793     11899469 :       && DECL_IS_OPERATOR_NEW_P (fndecl)
    1794     12438714 :       && !TREE_NOTHROW (fndecl))
    1795              :     return true;
    1796              : 
    1797              :   /* References are always non-NULL.  */
    1798     11375436 :   if (flag_delete_null_pointer_checks
    1799     11375436 :       && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
    1800              :     return true;
    1801              : 
    1802     11375436 :   if (flag_delete_null_pointer_checks
    1803     22744607 :       && lookup_attribute ("returns_nonnull",
    1804     11369171 :                            TYPE_ATTRIBUTES (gimple_call_fntype (call))))
    1805              :     return true;
    1806     11310337 :   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     12334399 : gimple_call_nonnull_arg (gcall *call)
    1814              : {
    1815     12334399 :   tree fndecl = gimple_call_fndecl (call);
    1816     12334399 :   if (!fndecl)
    1817              :     return NULL_TREE;
    1818              : 
    1819     11246250 :   unsigned rf = gimple_call_return_flags (call);
    1820     11246250 :   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              :             return arg;
    1829              :         }
    1830              :     }
    1831              :   return NULL_TREE;
    1832              : }
    1833              : 
    1834              : 
    1835              : /* Return true if GS is a copy assignment.  */
    1836              : 
    1837              : bool
    1838    196156091 : gimple_assign_copy_p (gimple *gs)
    1839              : {
    1840    196156091 :   return (gimple_assign_single_p (gs)
    1841    196156091 :           && 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     39641630 : gimple_assign_ssa_name_copy_p (gimple *gs)
    1849              : {
    1850     39641630 :   return (gimple_assign_single_p (gs)
    1851     22411880 :           && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
    1852     52728812 :           && 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        47429 : gimple_assign_unary_nop_p (gimple *gs)
    1872              : {
    1873        47429 :   return (is_gimple_assign (gs)
    1874        47429 :           && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
    1875        42117 :               || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
    1876         5312 :           && gimple_assign_rhs1 (gs) != error_mark_node
    1877        58053 :           && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
    1878         5312 :               == 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    568320419 : gimple_assign_load_p (const gimple *gs)
    1885              : {
    1886    568320419 :   tree rhs;
    1887    568320419 :   if (!gimple_assign_single_p (gs))
    1888              :     return false;
    1889    335227675 :   rhs = gimple_assign_rhs1 (gs);
    1890    335227675 :   if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
    1891              :     return true;
    1892    335227671 :   if (handled_component_p (rhs))
    1893     91863126 :     rhs = TREE_OPERAND (rhs, 0);
    1894    335227671 :   return (handled_component_p (rhs)
    1895    308237253 :           || DECL_P (rhs)
    1896    249477732 :           || TREE_CODE (rhs) == MEM_REF
    1897    182984749 :           || TREE_CODE (rhs) == TARGET_MEM_REF);
    1898              : }
    1899              : 
    1900              : 
    1901              : /* Set BB to be the basic block holding G.  */
    1902              : 
    1903              : void
    1904    693408002 : gimple_set_bb (gimple *stmt, basic_block bb)
    1905              : {
    1906    693408002 :   stmt->bb = bb;
    1907              : 
    1908    693408002 :   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     38169724 :   if (cfun->cfg)
    1914              :     {
    1915     38169610 :       tree t;
    1916     38169610 :       int uid;
    1917              : 
    1918     38169610 :       t = gimple_label_label (as_a <glabel *> (stmt));
    1919     38169610 :       uid = LABEL_DECL_UID (t);
    1920     38169610 :       if (uid == -1)
    1921              :         {
    1922     19453648 :           unsigned old_len =
    1923     19453648 :             vec_safe_length (label_to_block_map_for_fn (cfun));
    1924     19453648 :           LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
    1925     19453648 :           if (old_len <= (unsigned) uid)
    1926      9291986 :             vec_safe_grow_cleared (label_to_block_map_for_fn (cfun), uid + 1);
    1927              :         }
    1928              : 
    1929     38169610 :       (*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      4590922 : gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
    1953              : {
    1954      4590922 :   enum tree_code subcode;
    1955      4590922 :   tree op1, op2, op3;
    1956              : 
    1957      4590922 :   extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
    1958      4590922 :   gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
    1959      4590922 : }
    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      7136356 : gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
    1970              :                                 tree op1, tree op2, tree op3)
    1971              : {
    1972      7136356 :   unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
    1973      7136356 :   gimple *stmt = gsi_stmt (*gsi);
    1974      7136356 :   gimple *old_stmt = stmt;
    1975              : 
    1976              :   /* If the new CODE needs more operands, allocate a new statement.  */
    1977      7136356 :   if (gimple_num_ops (stmt) < new_rhs_ops + 1)
    1978              :     {
    1979       194170 :       tree lhs = gimple_assign_lhs (old_stmt);
    1980       194170 :       stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
    1981       194170 :       memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
    1982       194170 :       gimple_init_singleton (stmt);
    1983              : 
    1984              :       /* The LHS needs to be reset as this also changes the SSA name
    1985              :          on the LHS.  */
    1986       194170 :       gimple_assign_set_lhs (stmt, lhs);
    1987              :     }
    1988              : 
    1989      7136356 :   gimple_set_num_ops (stmt, new_rhs_ops + 1);
    1990      7136356 :   gimple_set_subcode (stmt, code);
    1991      7136356 :   gimple_assign_set_rhs1 (stmt, op1);
    1992      7136356 :   if (new_rhs_ops > 1)
    1993      1150036 :     gimple_assign_set_rhs2 (stmt, op2);
    1994      1150036 :   if (new_rhs_ops > 2)
    1995        35013 :     gimple_assign_set_rhs3 (stmt, op3);
    1996      7136356 :   if (stmt != old_stmt)
    1997       194170 :     gsi_replace (gsi, stmt, false);
    1998      7136356 : }
    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   6606654179 : gimple_get_lhs (const gimple *stmt)
    2008              : {
    2009   6606654179 :   enum gimple_code code = gimple_code (stmt);
    2010              : 
    2011   6606654179 :   if (code == GIMPLE_ASSIGN)
    2012   4246076626 :     return gimple_assign_lhs (stmt);
    2013   2360577553 :   else if (code == GIMPLE_CALL)
    2014    472626562 :     return gimple_call_lhs (stmt);
    2015   1887950991 :   else if (code == GIMPLE_PHI)
    2016    146142390 :     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      2214743 : gimple_set_lhs (gimple *stmt, tree lhs)
    2027              : {
    2028      2214743 :   enum gimple_code code = gimple_code (stmt);
    2029              : 
    2030      2214743 :   if (code == GIMPLE_ASSIGN)
    2031      1049720 :     gimple_assign_set_lhs (stmt, lhs);
    2032      1165023 :   else if (code == GIMPLE_CALL)
    2033      1165023 :     gimple_call_set_lhs (stmt, lhs);
    2034              :   else
    2035            0 :     gcc_unreachable ();
    2036      2214743 : }
    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     67777880 : gimple_copy (gimple *stmt)
    2046              : {
    2047     67777880 :   enum gimple_code code = gimple_code (stmt);
    2048     67777880 :   unsigned num_ops = gimple_num_ops (stmt);
    2049     67777880 :   gimple *copy = gimple_alloc (code, num_ops);
    2050     67777880 :   unsigned i;
    2051              : 
    2052              :   /* Shallow copy all the fields from STMT.  */
    2053     67777880 :   memcpy (copy, stmt, gimple_size (code));
    2054     67777880 :   gimple_init_singleton (copy);
    2055              : 
    2056              :   /* If STMT has sub-statements, deep-copy them as well.  */
    2057     67777880 :   if (gimple_has_substatements (stmt))
    2058              :     {
    2059        42297 :       gimple_seq new_seq;
    2060        42297 :       tree t;
    2061              : 
    2062        42297 :       switch (gimple_code (stmt))
    2063              :         {
    2064          349 :         case GIMPLE_BIND:
    2065          349 :           {
    2066          349 :             gbind *bind_stmt = as_a <gbind *> (stmt);
    2067          349 :             gbind *bind_copy = as_a <gbind *> (copy);
    2068          349 :             new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
    2069          349 :             gimple_bind_set_body (bind_copy, new_seq);
    2070          349 :             gimple_bind_set_vars (bind_copy,
    2071              :                                   unshare_expr (gimple_bind_vars (bind_stmt)));
    2072          349 :             gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
    2073              :           }
    2074          349 :           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        23915 :         case GIMPLE_TRY:
    2111        23915 :           {
    2112        23915 :             gtry *try_stmt = as_a <gtry *> (stmt);
    2113        23915 :             gtry *try_copy = as_a <gtry *> (copy);
    2114        23915 :             new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
    2115        23915 :             gimple_try_set_eval (try_copy, new_seq);
    2116        23915 :             new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
    2117        23915 :             gimple_try_set_cleanup (try_copy, new_seq);
    2118              :           }
    2119        23915 :           break;
    2120              : 
    2121          256 :         case GIMPLE_OMP_FOR:
    2122          256 :           new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
    2123          256 :           gimple_omp_for_set_pre_body (copy, new_seq);
    2124          256 :           t = unshare_expr (gimple_omp_for_clauses (stmt));
    2125          256 :           gimple_omp_for_set_clauses (copy, t);
    2126          256 :           {
    2127          256 :             gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
    2128          256 :             omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
    2129          256 :               ( gimple_omp_for_collapse (stmt));
    2130              :           }
    2131          524 :           for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
    2132              :             {
    2133          268 :               gimple_omp_for_set_cond (copy, i,
    2134              :                                        gimple_omp_for_cond (stmt, i));
    2135          268 :               gimple_omp_for_set_index (copy, i,
    2136              :                                         gimple_omp_for_index (stmt, i));
    2137          268 :               t = unshare_expr (gimple_omp_for_initial (stmt, i));
    2138          268 :               gimple_omp_for_set_initial (copy, i, t);
    2139          268 :               t = unshare_expr (gimple_omp_for_final (stmt, i));
    2140          268 :               gimple_omp_for_set_final (copy, i, t);
    2141          268 :               t = unshare_expr (gimple_omp_for_incr (stmt, i));
    2142          268 :               gimple_omp_for_set_incr (copy, i, t);
    2143              :             }
    2144          256 :           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          256 :         case GIMPLE_OMP_SECTION:
    2250          256 :         case GIMPLE_OMP_MASTER:
    2251          256 :         case GIMPLE_OMP_STRUCTURED_BLOCK:
    2252          256 :         copy_omp_body:
    2253          256 :           new_seq = gimple_seq_copy (gimple_omp_body (stmt));
    2254          256 :           gimple_omp_set_body (copy, new_seq);
    2255          256 :           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     67777880 :   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    208396733 :   for (i = 0; i < num_ops; i++)
    2310    140618853 :     gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
    2311              : 
    2312     67777880 :   if (gimple_has_mem_ops (stmt))
    2313              :     {
    2314     31408468 :       gimple_set_vdef (copy, gimple_vdef (stmt));
    2315     31408468 :       gimple_set_vuse (copy, gimple_vuse (stmt));
    2316              :     }
    2317              : 
    2318              :   /* Clear out SSA operand vectors on COPY.  */
    2319     67777880 :   if (gimple_has_ops (stmt))
    2320              :     {
    2321     67345977 :       gimple_set_use_ops (copy, NULL);
    2322              : 
    2323              :       /* SSA operands need to be updated.  */
    2324     67345977 :       gimple_set_modified (copy, true);
    2325              :     }
    2326              : 
    2327     67777880 :   if (gimple_debug_nonbind_marker_p (stmt))
    2328     14643798 :     cfun->debug_marker_count++;
    2329              : 
    2330     67777880 :   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       631375 : gimple_move_vops (gimple *new_stmt, gimple *old_stmt)
    2338              : {
    2339       631375 :   tree vdef = gimple_vdef (old_stmt);
    2340      1262750 :   gimple_set_vuse (new_stmt, gimple_vuse (old_stmt));
    2341       631375 :   gimple_set_vdef (new_stmt, vdef);
    2342       631375 :   if (vdef && TREE_CODE (vdef) == SSA_NAME)
    2343       259366 :     SSA_NAME_DEF_STMT (vdef) = new_stmt;
    2344       631375 : }
    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    844518494 : gimple_has_side_effects (const gimple *s)
    2354              : {
    2355    844518494 :   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   1285256768 :   if (gimple_has_volatile_ops (s))
    2362              :     return true;
    2363              : 
    2364    647414104 :   if (gimple_code (s) == GIMPLE_ASM
    2365    647414104 :       && gimple_asm_volatile_p (as_a <const gasm *> (s)))
    2366              :     return true;
    2367              : 
    2368    646832261 :   if (is_gimple_call (s))
    2369              :     {
    2370     92346849 :       int flags = gimple_call_flags (s);
    2371              : 
    2372              :       /* An infinite loop is considered a side effect.  */
    2373     92346849 :       if (!(flags & (ECF_CONST | ECF_PURE))
    2374     18142112 :           || (flags & ECF_LOOPING_CONST_OR_PURE))
    2375              :         return true;
    2376              : 
    2377              :       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 and
    2386              :    S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked.  */
    2387              : 
    2388              : bool
    2389     57045526 : gimple_could_trap_p_1 (const gimple *s, bool include_mem, bool include_stores)
    2390              : {
    2391     57045526 :   tree t, div = NULL_TREE;
    2392     57045526 :   enum tree_code op;
    2393              : 
    2394     57045526 :   if (include_mem)
    2395              :     {
    2396     32852757 :       unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
    2397              : 
    2398    114111486 :       for (i = start; i < gimple_num_ops (s); i++)
    2399     85515992 :         if (tree_could_trap_p (gimple_op (s, i)))
    2400              :           return true;
    2401              :     }
    2402              : 
    2403     52788263 :   switch (gimple_code (s))
    2404              :     {
    2405         8879 :     case GIMPLE_ASM:
    2406         8879 :       return gimple_asm_volatile_p (as_a <const gasm *> (s));
    2407              : 
    2408      1355336 :     case GIMPLE_CALL:
    2409      1355336 :       {
    2410      1355336 :         if (gimple_call_internal_p (s))
    2411              :           return false;
    2412      1198534 :         t = gimple_call_fndecl (s);
    2413              :         /* Assume that indirect and calls to weak functions may trap.  */
    2414      1198534 :         if (!t || !DECL_P (t) || DECL_WEAK (t))
    2415              :           return true;
    2416              : 
    2417              :         /* Any floating point builtin operation could trap.  */
    2418      1181022 :         if (gimple_call_builtin_p (s))
    2419              :           {
    2420       897372 :             if (fndecl_built_in_p (t, BUILT_IN_NORMAL))
    2421       807450 :               switch (DECL_FUNCTION_CODE (t))
    2422              :                 {
    2423              :                 CASE_FLT_FN (BUILT_IN_COPYSIGN):
    2424              :                 CASE_FLT_FN_FLOATN_NX (BUILT_IN_COPYSIGN):
    2425              :                   return false;
    2426              :                 default:
    2427              :                   break;
    2428              :                 }
    2429       847926 :             tree type = TREE_TYPE (gimple_call_fntype (s));
    2430       847926 :             bool fp_operation = FLOAT_TYPE_P (type);
    2431       850694 :             return fp_operation && flag_trapping_math;
    2432              :           }
    2433              :         return false;
    2434              :       }
    2435     40489076 :     case GIMPLE_ASSIGN:
    2436     40489076 :       op = gimple_assign_rhs_code (s);
    2437              : 
    2438              :       /* For COND_EXPR only the condition may trap.  */
    2439     40489076 :       if (op == COND_EXPR)
    2440        23115 :         return tree_could_trap_p (gimple_assign_rhs1 (s));
    2441              : 
    2442              :       /* For comparisons we need to check rhs operand types instead of lhs type
    2443              :          (which is BOOLEAN_TYPE).  */
    2444     40465961 :       if (TREE_CODE_CLASS (op) == tcc_comparison)
    2445      1522715 :         t = TREE_TYPE (gimple_assign_rhs1 (s));
    2446              :       else
    2447     38943246 :         t = TREE_TYPE (gimple_assign_lhs (s));
    2448              : 
    2449     40465961 :       if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
    2450     23006587 :         div = gimple_assign_rhs2 (s);
    2451              : 
    2452     42855765 :       return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
    2453     40465961 :                                       (INTEGRAL_TYPE_P (t)
    2454     40465961 :                                        && TYPE_OVERFLOW_TRAPS (t)),
    2455     40465961 :                                       div));
    2456              : 
    2457      7340194 :     case GIMPLE_COND:
    2458      7340194 :       t = TREE_TYPE (gimple_cond_lhs (s));
    2459      7340194 :       return operation_could_trap_p (gimple_cond_code (s),
    2460     14680388 :                                      FLOAT_TYPE_P (t), false, NULL_TREE);
    2461              : 
    2462              :     default:
    2463              :       break;
    2464              :     }
    2465              : 
    2466              :   return false;
    2467              : }
    2468              : 
    2469              : /* Return true if statement S can trap.  */
    2470              : 
    2471              : bool
    2472     29814388 : gimple_could_trap_p (const gimple *s)
    2473              : {
    2474     29814388 :   return gimple_could_trap_p_1 (s, true, true);
    2475              : }
    2476              : 
    2477              : /* Return true if RHS of a GIMPLE_ASSIGN S can trap.  */
    2478              : 
    2479              : bool
    2480      3038369 : gimple_assign_rhs_could_trap_p (gimple *s)
    2481              : {
    2482      3038369 :   gcc_assert (is_gimple_assign (s));
    2483      3038369 :   return gimple_could_trap_p_1 (s, true, false);
    2484              : }
    2485              : 
    2486              : 
    2487              : /* Print debugging information for gimple stmts generated.  */
    2488              : 
    2489              : void
    2490            0 : dump_gimple_statistics (void)
    2491              : {
    2492            0 :   int i;
    2493            0 :   uint64_t total_tuples = 0, total_bytes = 0;
    2494              : 
    2495            0 :   if (! GATHER_STATISTICS)
    2496              :     {
    2497            0 :       fprintf (stderr, "No GIMPLE statistics\n");
    2498            0 :       return;
    2499              :     }
    2500              : 
    2501              :   fprintf (stderr, "\nGIMPLE statements\n");
    2502              :   fprintf (stderr, "Kind                   Stmts      Bytes\n");
    2503              :   fprintf (stderr, "---------------------------------------\n");
    2504              :   for (i = 0; i < (int) gimple_alloc_kind_all; ++i)
    2505              :     {
    2506              :       fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n",
    2507              :                gimple_alloc_kind_names[i],
    2508              :                SIZE_AMOUNT (gimple_alloc_counts[i]),
    2509              :                SIZE_AMOUNT (gimple_alloc_sizes[i]));
    2510              :       total_tuples += gimple_alloc_counts[i];
    2511              :       total_bytes += gimple_alloc_sizes[i];
    2512              :     }
    2513              :   fprintf (stderr, "---------------------------------------\n");
    2514              :   fprintf (stderr, "%-20s %7" PRIu64 "%c %10" PRIu64 "%c\n", "Total",
    2515              :            SIZE_AMOUNT (total_tuples), SIZE_AMOUNT (total_bytes));
    2516              :   fprintf (stderr, "---------------------------------------\n");
    2517              : }
    2518              : 
    2519              : 
    2520              : /* Return the number of operands needed on the RHS of a GIMPLE
    2521              :    assignment for an expression with tree code CODE.  */
    2522              : 
    2523              : unsigned
    2524     99727271 : get_gimple_rhs_num_ops (enum tree_code code)
    2525              : {
    2526     99727271 :   switch (get_gimple_rhs_class (code))
    2527              :     {
    2528              :     case GIMPLE_UNARY_RHS:
    2529              :     case GIMPLE_SINGLE_RHS:
    2530              :       return 1;
    2531              :     case GIMPLE_BINARY_RHS:
    2532              :       return 2;
    2533              :     case GIMPLE_TERNARY_RHS:
    2534              :       return 3;
    2535            0 :     default:
    2536            0 :       gcc_unreachable ();
    2537              :     }
    2538              : }
    2539              : 
    2540              : #define DEFTREECODE(SYM, STRING, TYPE, NARGS)                               \
    2541              :   (unsigned char)                                                           \
    2542              :   ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS                                   \
    2543              :    : ((TYPE) == tcc_binary                                                  \
    2544              :       || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS                      \
    2545              :    : ((TYPE) == tcc_constant                                                \
    2546              :       || (TYPE) == tcc_declaration                                          \
    2547              :       || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS                       \
    2548              :    : ((SYM) == TRUTH_AND_EXPR                                               \
    2549              :       || (SYM) == TRUTH_OR_EXPR                                             \
    2550              :       || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS                       \
    2551              :    : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS                             \
    2552              :    : ((SYM) == COND_EXPR                                                    \
    2553              :       || (SYM) == WIDEN_MULT_PLUS_EXPR                                      \
    2554              :       || (SYM) == WIDEN_MULT_MINUS_EXPR                                     \
    2555              :       || (SYM) == DOT_PROD_EXPR                                             \
    2556              :       || (SYM) == SAD_EXPR                                                  \
    2557              :       || (SYM) == REALIGN_LOAD_EXPR                                         \
    2558              :       || (SYM) == VEC_COND_EXPR                                             \
    2559              :       || (SYM) == VEC_PERM_EXPR                                             \
    2560              :       || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS                     \
    2561              :    : ((SYM) == CONSTRUCTOR                                                  \
    2562              :       || (SYM) == OBJ_TYPE_REF                                              \
    2563              :       || (SYM) == ADDR_EXPR                                                 \
    2564              :       || (SYM) == WITH_SIZE_EXPR                                            \
    2565              :       || (SYM) == SSA_NAME                                                  \
    2566              :       || (SYM) == OMP_NEXT_VARIANT                                          \
    2567              :       || (SYM) == OMP_TARGET_DEVICE_MATCHES) ? GIMPLE_SINGLE_RHS            \
    2568              :    : GIMPLE_INVALID_RHS),
    2569              : #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS,
    2570              : 
    2571              : const unsigned char gimple_rhs_class_table[] = {
    2572              : #include "all-tree.def"
    2573              : };
    2574              : 
    2575              : #undef DEFTREECODE
    2576              : #undef END_OF_BASE_TREE_CODES
    2577              : 
    2578              : /* Build a GIMPLE_CALL identical to STMT but skipping the arguments in
    2579              :    the positions marked by the set ARGS_TO_SKIP.  */
    2580              : 
    2581              : gcall *
    2582            0 : gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip)
    2583              : {
    2584            0 :   int i;
    2585            0 :   int nargs = gimple_call_num_args (stmt);
    2586            0 :   auto_vec<tree> vargs (nargs);
    2587            0 :   gcall *new_stmt;
    2588              : 
    2589            0 :   for (i = 0; i < nargs; i++)
    2590            0 :     if (!bitmap_bit_p (args_to_skip, i))
    2591            0 :       vargs.quick_push (gimple_call_arg (stmt, i));
    2592              : 
    2593            0 :   if (gimple_call_internal_p (stmt))
    2594            0 :     new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt),
    2595              :                                                vargs);
    2596              :   else
    2597            0 :     new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs);
    2598              : 
    2599            0 :   if (gimple_call_lhs (stmt))
    2600            0 :     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
    2601              : 
    2602            0 :   gimple_set_vuse (new_stmt, gimple_vuse (stmt));
    2603            0 :   gimple_set_vdef (new_stmt, gimple_vdef (stmt));
    2604              : 
    2605            0 :   if (gimple_has_location (stmt))
    2606            0 :     gimple_set_location (new_stmt, gimple_location (stmt));
    2607            0 :   gimple_call_copy_flags (new_stmt, stmt);
    2608            0 :   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
    2609              : 
    2610            0 :   gimple_set_modified (new_stmt, true);
    2611              : 
    2612            0 :   return new_stmt;
    2613            0 : }
    2614              : 
    2615              : 
    2616              : 
    2617              : /* Return true if the field decls F1 and F2 are at the same offset.
    2618              : 
    2619              :    This is intended to be used on GIMPLE types only.  */
    2620              : 
    2621              : bool
    2622     65341577 : gimple_compare_field_offset (tree f1, tree f2)
    2623              : {
    2624     65341577 :   if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
    2625              :     {
    2626     65341514 :       tree offset1 = DECL_FIELD_OFFSET (f1);
    2627     65341514 :       tree offset2 = DECL_FIELD_OFFSET (f2);
    2628     65341514 :       return ((offset1 == offset2
    2629              :                /* Once gimplification is done, self-referential offsets are
    2630              :                   instantiated as operand #2 of the COMPONENT_REF built for
    2631              :                   each access and reset.  Therefore, they are not relevant
    2632              :                   anymore and fields are interchangeable provided that they
    2633              :                   represent the same access.  */
    2634            0 :                || (TREE_CODE (offset1) == PLACEHOLDER_EXPR
    2635            0 :                    && TREE_CODE (offset2) == PLACEHOLDER_EXPR
    2636            0 :                    && (DECL_SIZE (f1) == DECL_SIZE (f2)
    2637            0 :                        || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR
    2638            0 :                            && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR)
    2639            0 :                        || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0))
    2640            0 :                    && DECL_ALIGN (f1) == DECL_ALIGN (f2))
    2641            0 :                || operand_equal_p (offset1, offset2, 0))
    2642    130683028 :               && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
    2643     65341514 :                                      DECL_FIELD_BIT_OFFSET (f2)));
    2644              :     }
    2645              : 
    2646              :   /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN
    2647              :      should be, so handle differing ones specially by decomposing
    2648              :      the offset into a byte and bit offset manually.  */
    2649           63 :   if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1))
    2650           63 :       && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2)))
    2651              :     {
    2652           63 :       unsigned HOST_WIDE_INT byte_offset1, byte_offset2;
    2653           63 :       unsigned HOST_WIDE_INT bit_offset1, bit_offset2;
    2654           63 :       bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1));
    2655           63 :       byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1))
    2656           63 :                       + bit_offset1 / BITS_PER_UNIT);
    2657           63 :       bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2));
    2658           63 :       byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2))
    2659           63 :                       + bit_offset2 / BITS_PER_UNIT);
    2660           63 :       if (byte_offset1 != byte_offset2)
    2661              :         return false;
    2662           63 :       return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT;
    2663              :     }
    2664              : 
    2665              :   return false;
    2666              : }
    2667              : 
    2668              : 
    2669              : /* Return a type the same as TYPE except unsigned or
    2670              :    signed according to UNSIGNEDP.  */
    2671              : 
    2672              : static tree
    2673       573570 : gimple_signed_or_unsigned_type (bool unsignedp, tree type)
    2674              : {
    2675       573570 :   tree type1;
    2676       573570 :   int i;
    2677              : 
    2678       573570 :   type1 = TYPE_MAIN_VARIANT (type);
    2679       573570 :   if (type1 == signed_char_type_node
    2680       573570 :       || type1 == char_type_node
    2681       573570 :       || type1 == unsigned_char_type_node)
    2682            0 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2683       573570 :   if (type1 == integer_type_node || type1 == unsigned_type_node)
    2684       336327 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2685       237243 :   if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
    2686       216370 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2687        20873 :   if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
    2688           30 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
    2689        20843 :   if (type1 == long_long_integer_type_node
    2690        20754 :       || type1 == long_long_unsigned_type_node)
    2691           89 :     return unsignedp
    2692           89 :            ? long_long_unsigned_type_node
    2693            0 :            : long_long_integer_type_node;
    2694              : 
    2695        34617 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    2696        20754 :     if (int_n_enabled_p[i]
    2697        20754 :         && (type1 == int_n_trees[i].unsigned_type
    2698        14235 :             || type1 == int_n_trees[i].signed_type))
    2699         6891 :         return unsignedp
    2700         6891 :           ? int_n_trees[i].unsigned_type
    2701         6891 :           : int_n_trees[i].signed_type;
    2702              : 
    2703              : #if HOST_BITS_PER_WIDE_INT >= 64
    2704        13863 :   if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
    2705            0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
    2706              : #endif
    2707        13863 :   if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
    2708            0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
    2709        13863 :   if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
    2710            0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
    2711        13863 :   if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
    2712            0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
    2713        13863 :   if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node)
    2714            0 :     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
    2715              : 
    2716              : #define GIMPLE_FIXED_TYPES(NAME)            \
    2717              :   if (type1 == short_ ## NAME ## _type_node \
    2718              :       || type1 == unsigned_short_ ## NAME ## _type_node) \
    2719              :     return unsignedp ? unsigned_short_ ## NAME ## _type_node \
    2720              :                      : short_ ## NAME ## _type_node; \
    2721              :   if (type1 == NAME ## _type_node \
    2722              :       || type1 == unsigned_ ## NAME ## _type_node) \
    2723              :     return unsignedp ? unsigned_ ## NAME ## _type_node \
    2724              :                      : NAME ## _type_node; \
    2725              :   if (type1 == long_ ## NAME ## _type_node \
    2726              :       || type1 == unsigned_long_ ## NAME ## _type_node) \
    2727              :     return unsignedp ? unsigned_long_ ## NAME ## _type_node \
    2728              :                      : long_ ## NAME ## _type_node; \
    2729              :   if (type1 == long_long_ ## NAME ## _type_node \
    2730              :       || type1 == unsigned_long_long_ ## NAME ## _type_node) \
    2731              :     return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \
    2732              :                      : long_long_ ## NAME ## _type_node;
    2733              : 
    2734              : #define GIMPLE_FIXED_MODE_TYPES(NAME) \
    2735              :   if (type1 == NAME ## _type_node \
    2736              :       || type1 == u ## NAME ## _type_node) \
    2737              :     return unsignedp ? u ## NAME ## _type_node \
    2738              :                      : NAME ## _type_node;
    2739              : 
    2740              : #define GIMPLE_FIXED_TYPES_SAT(NAME) \
    2741              :   if (type1 == sat_ ## short_ ## NAME ## _type_node \
    2742              :       || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \
    2743              :     return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \
    2744              :                      : sat_ ## short_ ## NAME ## _type_node; \
    2745              :   if (type1 == sat_ ## NAME ## _type_node \
    2746              :       || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \
    2747              :     return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \
    2748              :                      : sat_ ## NAME ## _type_node; \
    2749              :   if (type1 == sat_ ## long_ ## NAME ## _type_node \
    2750              :       || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \
    2751              :     return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \
    2752              :                      : sat_ ## long_ ## NAME ## _type_node; \
    2753              :   if (type1 == sat_ ## long_long_ ## NAME ## _type_node \
    2754              :       || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \
    2755              :     return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \
    2756              :                      : sat_ ## long_long_ ## NAME ## _type_node;
    2757              : 
    2758              : #define GIMPLE_FIXED_MODE_TYPES_SAT(NAME)       \
    2759              :   if (type1 == sat_ ## NAME ## _type_node \
    2760              :       || type1 == sat_ ## u ## NAME ## _type_node) \
    2761              :     return unsignedp ? sat_ ## u ## NAME ## _type_node \
    2762              :                      : sat_ ## NAME ## _type_node;
    2763              : 
    2764        13863 :   GIMPLE_FIXED_TYPES (fract);
    2765        13863 :   GIMPLE_FIXED_TYPES_SAT (fract);
    2766        13863 :   GIMPLE_FIXED_TYPES (accum);
    2767        13863 :   GIMPLE_FIXED_TYPES_SAT (accum);
    2768              : 
    2769        13863 :   GIMPLE_FIXED_MODE_TYPES (qq);
    2770        13863 :   GIMPLE_FIXED_MODE_TYPES (hq);
    2771        13863 :   GIMPLE_FIXED_MODE_TYPES (sq);
    2772        13863 :   GIMPLE_FIXED_MODE_TYPES (dq);
    2773        13863 :   GIMPLE_FIXED_MODE_TYPES (tq);
    2774        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (qq);
    2775        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (hq);
    2776        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (sq);
    2777        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (dq);
    2778        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (tq);
    2779        13863 :   GIMPLE_FIXED_MODE_TYPES (ha);
    2780        13863 :   GIMPLE_FIXED_MODE_TYPES (sa);
    2781        13863 :   GIMPLE_FIXED_MODE_TYPES (da);
    2782        13863 :   GIMPLE_FIXED_MODE_TYPES (ta);
    2783        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (ha);
    2784        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (sa);
    2785        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (da);
    2786        13863 :   GIMPLE_FIXED_MODE_TYPES_SAT (ta);
    2787              : 
    2788              :   /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not
    2789              :      the precision; they have precision set to match their range, but
    2790              :      may use a wider mode to match an ABI.  If we change modes, we may
    2791              :      wind up with bad conversions.  For INTEGER_TYPEs in C, must check
    2792              :      the precision as well, so as to yield correct results for
    2793              :      bit-field types.  C++ does not have these separate bit-field
    2794              :      types, and producing a signed or unsigned variant of an
    2795              :      ENUMERAL_TYPE may cause other problems as well.  */
    2796        13863 :   if (!INTEGRAL_TYPE_P (type)
    2797        13863 :       || TYPE_UNSIGNED (type) == unsignedp)
    2798              :     return type;
    2799              : 
    2800              : #define TYPE_OK(node)                                                       \
    2801              :   (TYPE_MODE (type) == TYPE_MODE (node)                                     \
    2802              :    && TYPE_PRECISION (type) == TYPE_PRECISION (node))
    2803        13863 :   if (TYPE_OK (signed_char_type_node))
    2804          428 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2805        13435 :   if (TYPE_OK (integer_type_node))
    2806         3511 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2807         9924 :   if (TYPE_OK (short_integer_type_node))
    2808         4745 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2809         5179 :   if (TYPE_OK (long_integer_type_node))
    2810            0 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
    2811         5179 :   if (TYPE_OK (long_long_integer_type_node))
    2812            0 :     return (unsignedp
    2813            0 :             ? long_long_unsigned_type_node
    2814            0 :             : long_long_integer_type_node);
    2815              : 
    2816        10331 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    2817         5179 :     if (int_n_enabled_p[i]
    2818         5179 :         && TYPE_MODE (type) == int_n_data[i].m
    2819         5206 :         && TYPE_PRECISION (type) == int_n_data[i].bitsize)
    2820           27 :         return unsignedp
    2821           27 :           ? int_n_trees[i].unsigned_type
    2822           27 :           : int_n_trees[i].signed_type;
    2823              : 
    2824              : #if HOST_BITS_PER_WIDE_INT >= 64
    2825         5152 :   if (TYPE_OK (intTI_type_node))
    2826            0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
    2827              : #endif
    2828         5152 :   if (TYPE_OK (intDI_type_node))
    2829            0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
    2830         5152 :   if (TYPE_OK (intSI_type_node))
    2831            0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
    2832         5152 :   if (TYPE_OK (intHI_type_node))
    2833            0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
    2834         5152 :   if (TYPE_OK (intQI_type_node))
    2835            0 :     return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
    2836              : 
    2837              : #undef GIMPLE_FIXED_TYPES
    2838              : #undef GIMPLE_FIXED_MODE_TYPES
    2839              : #undef GIMPLE_FIXED_TYPES_SAT
    2840              : #undef GIMPLE_FIXED_MODE_TYPES_SAT
    2841              : #undef TYPE_OK
    2842              : 
    2843         5152 :   return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
    2844              : }
    2845              : 
    2846              : 
    2847              : /* Return an unsigned type the same as TYPE in other respects.  */
    2848              : 
    2849              : tree
    2850            0 : gimple_unsigned_type (tree type)
    2851              : {
    2852            0 :   return gimple_signed_or_unsigned_type (true, type);
    2853              : }
    2854              : 
    2855              : 
    2856              : /* Return a signed type the same as TYPE in other respects.  */
    2857              : 
    2858              : tree
    2859       573570 : gimple_signed_type (tree type)
    2860              : {
    2861       573570 :   return gimple_signed_or_unsigned_type (false, type);
    2862              : }
    2863              : 
    2864              : 
    2865              : /* Return the typed-based alias set for T, which may be an expression
    2866              :    or a type.  Return -1 if we don't do anything special.  */
    2867              : 
    2868              : alias_set_type
    2869      8411036 : gimple_get_alias_set (tree t)
    2870              : {
    2871              :   /* That's all the expressions we handle specially.  */
    2872      8411036 :   if (!TYPE_P (t))
    2873              :     return -1;
    2874              : 
    2875              :   /* For convenience, follow the C standard when dealing with
    2876              :      character types.  Any object may be accessed via an lvalue that
    2877              :      has character type.  */
    2878      2384855 :   if (t == char_type_node
    2879      1871422 :       || t == signed_char_type_node
    2880      1871422 :       || t == unsigned_char_type_node)
    2881              :     return 0;
    2882              : 
    2883              :   /* Allow aliasing between signed and unsigned variants of the same
    2884              :      type.  We treat the signed variant as canonical.  */
    2885      1871422 :   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
    2886              :     {
    2887       572668 :       tree t1 = gimple_signed_type (t);
    2888              : 
    2889              :       /* t1 == t can happen for boolean nodes which are always unsigned.  */
    2890       572668 :       if (t1 != t)
    2891       572668 :         return get_alias_set (t1);
    2892              :     }
    2893              : 
    2894              :   /* Allow aliasing between enumeral types and the underlying
    2895              :      integer type.  This is required for C since those are
    2896              :      compatible types.  */
    2897      1298754 :   else if (TREE_CODE (t) == ENUMERAL_TYPE)
    2898              :     {
    2899            0 :       tree t1 = lang_hooks.types.type_for_size (tree_to_uhwi (TYPE_SIZE (t)),
    2900              :                                                 false /* short-cut above */);
    2901            0 :       return get_alias_set (t1);
    2902              :     }
    2903              : 
    2904              :   return -1;
    2905              : }
    2906              : 
    2907              : 
    2908              : /* Helper for gimple_ior_addresses_taken_1.  */
    2909              : 
    2910              : static bool
    2911     52204103 : gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data)
    2912              : {
    2913     52204103 :   bitmap addresses_taken = (bitmap)data;
    2914     52204103 :   addr = get_base_address (addr);
    2915     52204103 :   if (addr
    2916     52204103 :       && DECL_P (addr))
    2917              :     {
    2918     33271935 :       bitmap_set_bit (addresses_taken, DECL_UID (addr));
    2919     33271935 :       return true;
    2920              :     }
    2921              :   return false;
    2922              : }
    2923              : 
    2924              : /* Set the bit for the uid of all decls that have their address taken
    2925              :    in STMT in the ADDRESSES_TAKEN bitmap.  Returns true if there
    2926              :    were any in this stmt.  */
    2927              : 
    2928              : bool
    2929    824908580 : gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt)
    2930              : {
    2931    824908580 :   return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
    2932    824908580 :                                         gimple_ior_addresses_taken_1);
    2933              : }
    2934              : 
    2935              : 
    2936              : /* Return true when STMTs arguments and return value match those of FNDECL,
    2937              :    a decl of a builtin function.  */
    2938              : 
    2939              : bool
    2940    281711565 : gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
    2941              : {
    2942    281711565 :   gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
    2943              : 
    2944    281711565 :   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
    2945    279472254 :     if (tree decl = builtin_decl_explicit (DECL_FUNCTION_CODE (fndecl)))
    2946    281711565 :       fndecl = decl;
    2947              : 
    2948    281711565 :   tree ret = gimple_call_lhs (stmt);
    2949    281711565 :   if (ret
    2950    457709568 :       && !useless_type_conversion_p (TREE_TYPE (ret),
    2951    175998003 :                                      TREE_TYPE (TREE_TYPE (fndecl))))
    2952              :     return false;
    2953              : 
    2954    281689643 :   tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
    2955    281689643 :   unsigned nargs = gimple_call_num_args (stmt);
    2956    862573166 :   for (unsigned i = 0; i < nargs; ++i)
    2957              :     {
    2958              :       /* Variadic args follow.  */
    2959    608528881 :       if (!targs)
    2960              :         return true;
    2961    585800858 :       tree arg = gimple_call_arg (stmt, i);
    2962    585800858 :       tree type = TREE_VALUE (targs);
    2963    585800858 :       if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
    2964              :         return false;
    2965    580883523 :       targs = TREE_CHAIN (targs);
    2966              :     }
    2967    507332938 :   if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
    2968              :     return false;
    2969              :   return true;
    2970              : }
    2971              : 
    2972              : /* Return true when STMT is operator a replaceable delete call.  */
    2973              : 
    2974              : bool
    2975      2562058 : gimple_call_operator_delete_p (const gcall *stmt)
    2976              : {
    2977      2562058 :   tree fndecl;
    2978              : 
    2979      2562058 :   if ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE)
    2980      2562058 :     return DECL_IS_OPERATOR_DELETE_P (fndecl);
    2981              :   return false;
    2982              : }
    2983              : 
    2984              : /* Return true when STMT is builtins call.  */
    2985              : 
    2986              : bool
    2987     68734622 : gimple_call_builtin_p (const gimple *stmt)
    2988              : {
    2989     68734622 :   tree fndecl;
    2990     68734622 :   if (is_gimple_call (stmt)
    2991     21260229 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    2992     88837338 :       && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
    2993      4769841 :     return gimple_builtin_call_types_compatible_p (stmt, fndecl);
    2994              :   return false;
    2995              : }
    2996              : 
    2997              : /* Return true when STMT is builtins call to CLASS.  */
    2998              : 
    2999              : bool
    3000    971598520 : gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
    3001              : {
    3002    971598520 :   tree fndecl;
    3003    971598520 :   if (is_gimple_call (stmt)
    3004    728347433 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    3005   1665509391 :       && DECL_BUILT_IN_CLASS (fndecl) == klass)
    3006    185704135 :     return gimple_builtin_call_types_compatible_p (stmt, fndecl);
    3007              :   return false;
    3008              : }
    3009              : 
    3010              : /* Return true when STMT is builtins call to CODE of CLASS.  */
    3011              : 
    3012              : bool
    3013   2946709038 : gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
    3014              : {
    3015   2946709038 :   tree fndecl;
    3016   2946709038 :   if (is_gimple_call (stmt)
    3017    862856517 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    3018   3767542523 :       && fndecl_built_in_p (fndecl, code))
    3019      2437032 :     return gimple_builtin_call_types_compatible_p (stmt, fndecl);
    3020              :   return false;
    3021              : }
    3022              : 
    3023              : /* If CALL is a call to a combined_fn (i.e. an internal function or
    3024              :    a normal built-in function), return its code, otherwise return
    3025              :    CFN_LAST.  */
    3026              : 
    3027              : combined_fn
    3028    187955076 : gimple_call_combined_fn (const gimple *stmt)
    3029              : {
    3030    187955076 :   if (const gcall *call = dyn_cast <const gcall *> (stmt))
    3031              :     {
    3032    186178803 :       if (gimple_call_internal_p (call))
    3033      8501082 :         return as_combined_fn (gimple_call_internal_fn (call));
    3034              : 
    3035    177677721 :       tree fndecl = gimple_call_fndecl (stmt);
    3036    177677721 :       if (fndecl
    3037    170959365 :           && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
    3038    250032639 :           && gimple_builtin_call_types_compatible_p (stmt, fndecl))
    3039     71797096 :         return as_combined_fn (DECL_FUNCTION_CODE (fndecl));
    3040              :     }
    3041              :   return CFN_LAST;
    3042              : }
    3043              : 
    3044              : /* Return true if STMT clobbers memory.  STMT is required to be a
    3045              :    GIMPLE_ASM.  */
    3046              : 
    3047              : bool
    3048     11610755 : gimple_asm_clobbers_memory_p (const gasm *stmt)
    3049              : {
    3050     11610755 :   unsigned i;
    3051              : 
    3052     16881211 :   for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
    3053              :     {
    3054      9596687 :       tree op = gimple_asm_clobber_op (stmt, i);
    3055      9596687 :       if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
    3056              :         return true;
    3057              :     }
    3058              : 
    3059              :   /* Non-empty basic ASM implicitly clobbers memory.  */
    3060      7284524 :   if (gimple_asm_basic_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
    3061        78567 :     return true;
    3062              : 
    3063              :   return false;
    3064              : }
    3065              : 
    3066              : /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE.  */
    3067              : 
    3068              : void
    3069         5309 : dump_decl_set (FILE *file, bitmap set)
    3070              : {
    3071         5309 :   if (set)
    3072              :     {
    3073         5309 :       bitmap_iterator bi;
    3074         5309 :       unsigned i;
    3075              : 
    3076         5309 :       fprintf (file, "{ ");
    3077              : 
    3078        22164 :       EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
    3079              :         {
    3080        16855 :           fprintf (file, "D.%u", i);
    3081        16855 :           fprintf (file, " ");
    3082              :         }
    3083              : 
    3084         5309 :       fprintf (file, "}");
    3085              :     }
    3086              :   else
    3087            0 :     fprintf (file, "NIL");
    3088         5309 : }
    3089              : 
    3090              : /* Return true when CALL is a call stmt that definitely doesn't
    3091              :    free any memory or makes it unavailable otherwise.  */
    3092              : bool
    3093      9783950 : nonfreeing_call_p (gimple *call)
    3094              : {
    3095      9783950 :   if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
    3096      9783950 :       && gimple_call_flags (call) & ECF_LEAF)
    3097      4309331 :     switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call)))
    3098              :       {
    3099              :         /* Just in case these become ECF_LEAF in the future.  */
    3100              :         case BUILT_IN_FREE:
    3101              :         case BUILT_IN_TM_FREE:
    3102              :         case BUILT_IN_REALLOC:
    3103              :         case BUILT_IN_STACK_RESTORE:
    3104              :         case BUILT_IN_GOMP_FREE:
    3105              :         case BUILT_IN_GOMP_REALLOC:
    3106              :           return false;
    3107              :         default:
    3108              :           return true;
    3109              :       }
    3110      5474619 :   else if (gimple_call_internal_p (call))
    3111       720214 :     switch (gimple_call_internal_fn (call))
    3112              :       {
    3113              :       case IFN_ABNORMAL_DISPATCHER:
    3114              :         return true;
    3115        34066 :       case IFN_ASAN_MARK:
    3116        34066 :         return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
    3117       680209 :       default:
    3118       680209 :         if (gimple_call_flags (call) & ECF_LEAF)
    3119              :           return true;
    3120              :         return false;
    3121              :       }
    3122              : 
    3123      4754405 :   tree fndecl = gimple_call_fndecl (call);
    3124      4754405 :   if (!fndecl)
    3125              :     return false;
    3126      4591484 :   struct cgraph_node *n = cgraph_node::get (fndecl);
    3127      4591484 :   if (!n)
    3128              :     return false;
    3129      4590105 :   enum availability availability;
    3130      4590105 :   n = n->function_symbol (&availability);
    3131      4590105 :   if (!n || availability <= AVAIL_INTERPOSABLE)
    3132              :     return false;
    3133      1154688 :   return n->nonfreeing_fn;
    3134              : }
    3135              : 
    3136              : /* Return true when CALL is a call stmt that definitely need not
    3137              :    be considered to be a memory barrier.  */
    3138              : bool
    3139      1626602 : nonbarrier_call_p (gimple *call)
    3140              : {
    3141      1626602 :   if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
    3142       630240 :     return true;
    3143              :   /* Should extend this to have a nonbarrier_fn flag, just as above in
    3144              :      the nonfreeing case.  */
    3145              :   return false;
    3146              : }
    3147              : 
    3148              : /* Callback for walk_stmt_load_store_ops.
    3149              : 
    3150              :    Return TRUE if OP will dereference the tree stored in DATA, FALSE
    3151              :    otherwise.
    3152              : 
    3153              :    This routine only makes a superficial check for a dereference.  Thus
    3154              :    it must only be used if it is safe to return a false negative.  */
    3155              : static bool
    3156     75029160 : check_loadstore (gimple *, tree op, tree, void *data)
    3157              : {
    3158     75029160 :   if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF)
    3159              :     {
    3160              :       /* Some address spaces may legitimately dereference zero.  */
    3161     38899210 :       addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
    3162     38899210 :       if (targetm.addr_space.zero_address_valid (as))
    3163              :         return false;
    3164              : 
    3165     38898097 :       return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
    3166              :     }
    3167              :   return false;
    3168              : }
    3169              : 
    3170              : 
    3171              : /* Return true if OP can be inferred to be non-NULL after STMT executes,
    3172              :    either by using a pointer dereference or attributes.  */
    3173              : bool
    3174            0 : infer_nonnull_range (gimple *stmt, tree op)
    3175              : {
    3176            0 :   return (infer_nonnull_range_by_dereference (stmt, op)
    3177            0 :           || infer_nonnull_range_by_attribute (stmt, op));
    3178              : }
    3179              : 
    3180              : /* Return true if OP can be inferred to be non-NULL after STMT
    3181              :    executes by using a pointer dereference.  */
    3182              : bool
    3183    325162600 : infer_nonnull_range_by_dereference (gimple *stmt, tree op)
    3184              : {
    3185              :   /* We can only assume that a pointer dereference will yield
    3186              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3187    325162600 :   if (!flag_delete_null_pointer_checks
    3188    324947097 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3189    324947097 :       || gimple_code (stmt) == GIMPLE_ASM
    3190    649652950 :       || gimple_clobber_p (stmt))
    3191              :     return false;
    3192              : 
    3193    317821036 :   if (walk_stmt_load_store_ops (stmt, (void *)op,
    3194              :                                 check_loadstore, check_loadstore))
    3195              :     return true;
    3196              : 
    3197              :   return false;
    3198              : }
    3199              : 
    3200              : /* Return true if OP can be inferred to be a non-NULL after STMT
    3201              :    executes by using attributes.  If OP2 and OP3 are non-NULL and
    3202              :    nonnull_if_nonzero is the only attribute implying OP being non-NULL
    3203              :    and the corresponding argument(s) aren't non-zero INTEGER_CST, set *OP2
    3204              :    and *OP3 to the corresponding arguments and return true (in that case
    3205              :    returning true doesn't mean OP can be unconditionally inferred to be
    3206              :    non-NULL, but conditionally).  */
    3207              : bool
    3208     73580053 : infer_nonnull_range_by_attribute (gimple *stmt, tree op, tree *op2, tree *op3)
    3209              : {
    3210     73580053 :   if (op2)
    3211              :     {
    3212         3938 :       *op2 = NULL_TREE;
    3213         3938 :       *op3 = NULL_TREE;
    3214              :     }
    3215              : 
    3216              :   /* We can only assume that a pointer dereference will yield
    3217              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3218     73580053 :   if (!flag_delete_null_pointer_checks
    3219     73551470 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3220    147131523 :       || gimple_code (stmt) == GIMPLE_ASM)
    3221              :     return false;
    3222              : 
    3223     73495472 :   if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
    3224              :     {
    3225      4419758 :       tree fntype = gimple_call_fntype (stmt);
    3226      4419758 :       tree attrs = TYPE_ATTRIBUTES (fntype);
    3227      4513990 :       for (; attrs; attrs = TREE_CHAIN (attrs))
    3228              :         {
    3229      1142957 :           attrs = lookup_attribute ("nonnull", attrs);
    3230              : 
    3231              :           /* If "nonnull" wasn't specified, we know nothing about
    3232              :              the argument, unless "nonnull_if_nonzero" attribute is
    3233              :              present.  */
    3234      1142957 :           if (attrs == NULL_TREE)
    3235              :             break;
    3236              : 
    3237              :           /* If "nonnull" applies to all the arguments, then ARG
    3238              :              is non-null if it's in the argument list.  */
    3239       252496 :           if (TREE_VALUE (attrs) == NULL_TREE)
    3240              :             {
    3241       460138 :               for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
    3242              :                 {
    3243       310651 :                   if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
    3244       303040 :                       && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
    3245              :                     return true;
    3246              :                 }
    3247              :               return false;
    3248              :             }
    3249              : 
    3250              :           /* Now see if op appears in the nonnull list.  */
    3251       237615 :           for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
    3252              :             {
    3253       143383 :               unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
    3254       143383 :               if (idx < gimple_call_num_args (stmt))
    3255              :                 {
    3256       143382 :                   tree arg = gimple_call_arg (stmt, idx);
    3257       143382 :                   if (operand_equal_p (op, arg, 0))
    3258              :                     return true;
    3259              :                 }
    3260              :             }
    3261              :         }
    3262              : 
    3263      4261494 :       for (attrs = TYPE_ATTRIBUTES (fntype);
    3264      4460423 :            (attrs = lookup_attribute ("nonnull_if_nonzero", attrs));
    3265       198929 :            attrs = TREE_CHAIN (attrs))
    3266              :         {
    3267       199553 :           tree args = TREE_VALUE (attrs);
    3268       199553 :           unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (args)) - 1;
    3269       199553 :           unsigned int idx2
    3270       199553 :             = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args))) - 1;
    3271       199553 :           unsigned int idx3 = idx2;
    3272       199553 :           if (tree chain2 = TREE_CHAIN (TREE_CHAIN (args)))
    3273         4308 :             idx3 = TREE_INT_CST_LOW (TREE_VALUE (chain2)) - 1;
    3274       199553 :           if (idx < gimple_call_num_args (stmt)
    3275       199541 :               && idx2 < gimple_call_num_args (stmt)
    3276       199530 :               && idx3 < gimple_call_num_args (stmt)
    3277       399083 :               && operand_equal_p (op, gimple_call_arg (stmt, idx), 0))
    3278              :             {
    3279          624 :               tree arg2 = gimple_call_arg (stmt, idx2);
    3280          624 :               tree arg3 = gimple_call_arg (stmt, idx3);
    3281         1248 :               if (!INTEGRAL_TYPE_P (TREE_TYPE (arg2))
    3282         1248 :                   || !INTEGRAL_TYPE_P (TREE_TYPE (arg3)))
    3283              :                 return false;
    3284          624 :               if (integer_nonzerop (arg2) && integer_nonzerop (arg3))
    3285              :                 return true;
    3286          402 :               if (integer_zerop (arg2) || integer_zerop (arg3))
    3287           90 :                 return false;
    3288          312 :               if (op2)
    3289              :                 {
    3290              :                   /* This case is meant for ubsan instrumentation.
    3291              :                      The caller can check at runtime if *OP2 and *OP3 are
    3292              :                      non-zero and OP is null.  */
    3293          132 :                   *op2 = arg2;
    3294          132 :                   *op3 = arg3;
    3295          132 :                   return true;
    3296              :                 }
    3297          180 :               return tree_expr_nonzero_p (arg2) && tree_expr_nonzero_p (arg3);
    3298              :             }
    3299              :         }
    3300              :     }
    3301              : 
    3302              :   /* If this function is marked as returning non-null, then we can
    3303              :      infer OP is non-null if it is used in the return statement.  */
    3304     73336584 :   if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
    3305       947165 :     if (gimple_return_retval (return_stmt)
    3306       546222 :         && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
    3307      1037895 :         && lookup_attribute ("returns_nonnull",
    3308        90730 :                              TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
    3309              :       return true;
    3310              : 
    3311              :   return false;
    3312              : }
    3313              : 
    3314              : /* Compare two case labels.  Because the front end should already have
    3315              :    made sure that case ranges do not overlap, it is enough to only compare
    3316              :    the CASE_LOW values of each case label.  */
    3317              : 
    3318              : static int
    3319     43765796 : compare_case_labels (const void *p1, const void *p2)
    3320              : {
    3321     43765796 :   const_tree const case1 = *(const_tree const*)p1;
    3322     43765796 :   const_tree const case2 = *(const_tree const*)p2;
    3323              : 
    3324              :   /* The 'default' case label always goes first.  */
    3325     43765796 :   if (!CASE_LOW (case1))
    3326              :     return -1;
    3327     43765796 :   else if (!CASE_LOW (case2))
    3328              :     return 1;
    3329              :   else
    3330     43765796 :     return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
    3331              : }
    3332              : 
    3333              : /* Sort the case labels in LABEL_VEC in place in ascending order.  */
    3334              : 
    3335              : void
    3336        69799 : sort_case_labels (vec<tree> &label_vec)
    3337              : {
    3338        69799 :   label_vec.qsort (compare_case_labels);
    3339        69799 : }
    3340              : 
    3341              : /* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
    3342              : 
    3343              :    LABELS is a vector that contains all case labels to look at.
    3344              : 
    3345              :    INDEX_TYPE is the type of the switch index expression.  Case labels
    3346              :    in LABELS are discarded if their values are not in the value range
    3347              :    covered by INDEX_TYPE.  The remaining case label values are folded
    3348              :    to INDEX_TYPE.
    3349              : 
    3350              :    If a default case exists in LABELS, it is removed from LABELS and
    3351              :    returned in DEFAULT_CASEP.  If no default case exists, but the
    3352              :    case labels already cover the whole range of INDEX_TYPE, a default
    3353              :    case is returned pointing to one of the existing case labels.
    3354              :    Otherwise DEFAULT_CASEP is set to NULL_TREE.
    3355              : 
    3356              :    DEFAULT_CASEP may be NULL, in which case the above comment doesn't
    3357              :    apply and no action is taken regardless of whether a default case is
    3358              :    found or not.  */
    3359              : 
    3360              : void
    3361        62373 : preprocess_case_label_vec_for_gimple (vec<tree> &labels,
    3362              :                                       tree index_type,
    3363              :                                       tree *default_casep)
    3364              : {
    3365        62373 :   tree min_value, max_value;
    3366        62373 :   tree default_case = NULL_TREE;
    3367        62373 :   size_t i, len;
    3368              : 
    3369        62373 :   i = 0;
    3370        62373 :   min_value = TYPE_MIN_VALUE (index_type);
    3371        62373 :   max_value = TYPE_MAX_VALUE (index_type);
    3372      1156888 :   while (i < labels.length ())
    3373              :     {
    3374      1094515 :       tree elt = labels[i];
    3375      1094515 :       tree low = CASE_LOW (elt);
    3376      1094515 :       tree high = CASE_HIGH (elt);
    3377      1094515 :       bool remove_element = false;
    3378              : 
    3379      1094515 :       if (low)
    3380              :         {
    3381      1058870 :           gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
    3382      1058870 :           gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
    3383              : 
    3384              :           /* This is a non-default case label, i.e. it has a value.
    3385              : 
    3386              :              See if the case label is reachable within the range of
    3387              :              the index type.  Remove out-of-range case values.  Turn
    3388              :              case ranges into a canonical form (high > low strictly)
    3389              :              and convert the case label values to the index type.
    3390              : 
    3391              :              NB: The type of gimple_switch_index() may be the promoted
    3392              :              type, but the case labels retain the original type.  */
    3393              : 
    3394        12767 :           if (high)
    3395              :             {
    3396              :               /* This is a case range.  Discard empty ranges.
    3397              :                  If the bounds or the range are equal, turn this
    3398              :                  into a simple (one-value) case.  */
    3399        12767 :               int cmp = tree_int_cst_compare (high, low);
    3400        12767 :               if (cmp < 0)
    3401              :                 remove_element = true;
    3402        12767 :               else if (cmp == 0)
    3403              :                 high = NULL_TREE;
    3404              :             }
    3405              : 
    3406      1047726 :           if (! high)
    3407              :             {
    3408              :               /* If the simple case value is unreachable, ignore it.  */
    3409      1057247 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3410      1057247 :                    && tree_int_cst_compare (low, min_value) < 0)
    3411      2114451 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3412      1057204 :                       && tree_int_cst_compare (low, max_value) > 0))
    3413              :                 remove_element = true;
    3414              :               else
    3415      1057086 :                 low = fold_convert (index_type, low);
    3416              :             }
    3417              :           else
    3418              :             {
    3419              :               /* If the entire case range is unreachable, ignore it.  */
    3420         1623 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3421         1623 :                    && tree_int_cst_compare (high, min_value) < 0)
    3422         3234 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3423         1611 :                       && tree_int_cst_compare (low, max_value) > 0))
    3424              :                 remove_element = true;
    3425              :               else
    3426              :                 {
    3427              :                   /* If the lower bound is less than the index type's
    3428              :                      minimum value, truncate the range bounds.  */
    3429         1611 :                   if (TREE_CODE (min_value) == INTEGER_CST
    3430         1611 :                       && tree_int_cst_compare (low, min_value) < 0)
    3431              :                     low = min_value;
    3432         1611 :                   low = fold_convert (index_type, low);
    3433              : 
    3434              :                   /* If the upper bound is greater than the index type's
    3435              :                      maximum value, truncate the range bounds.  */
    3436         1611 :                   if (TREE_CODE (max_value) == INTEGER_CST
    3437         1611 :                       && tree_int_cst_compare (high, max_value) > 0)
    3438              :                     high = max_value;
    3439         1611 :                   high = fold_convert (index_type, high);
    3440              : 
    3441              :                   /* We may have folded a case range to a one-value case.  */
    3442         1611 :                   if (tree_int_cst_equal (low, high))
    3443            0 :                     high = NULL_TREE;
    3444              :                 }
    3445              :             }
    3446              : 
    3447      1058870 :           CASE_LOW (elt) = low;
    3448      1058870 :           CASE_HIGH (elt) = high;
    3449              :         }
    3450              :       else
    3451              :         {
    3452        35645 :           gcc_assert (!default_case);
    3453        35645 :           default_case = elt;
    3454              :           /* The default case must be passed separately to the
    3455              :              gimple_build_switch routine.  But if DEFAULT_CASEP
    3456              :              is NULL, we do not remove the default case (it would
    3457              :              be completely lost).  */
    3458        35645 :           if (default_casep)
    3459              :             remove_element = true;
    3460              :         }
    3461              : 
    3462      1058870 :       if (remove_element)
    3463        35818 :         labels.ordered_remove (i);
    3464              :       else
    3465      1058697 :         i++;
    3466              :     }
    3467        62373 :   len = i;
    3468              : 
    3469        62373 :   if (!labels.is_empty ())
    3470        61519 :     sort_case_labels (labels);
    3471              : 
    3472        62373 :   if (default_casep && !default_case)
    3473              :     {
    3474              :       /* If the switch has no default label, add one, so that we jump
    3475              :          around the switch body.  If the labels already cover the whole
    3476              :          range of the switch index_type, add the default label pointing
    3477              :          to one of the existing labels.  */
    3478        14944 :       if (len
    3479        14465 :           && TYPE_MIN_VALUE (index_type)
    3480        14465 :           && TYPE_MAX_VALUE (index_type)
    3481        29409 :           && tree_int_cst_equal (CASE_LOW (labels[0]),
    3482        14465 :                                  TYPE_MIN_VALUE (index_type)))
    3483              :         {
    3484         4397 :           tree low, high = CASE_HIGH (labels[len - 1]);
    3485         4397 :           if (!high)
    3486         4354 :             high = CASE_LOW (labels[len - 1]);
    3487         4397 :           if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
    3488              :             {
    3489           61 :               tree widest_label = labels[0];
    3490          129 :               for (i = 1; i < len; i++)
    3491              :                 {
    3492           82 :                   high = CASE_LOW (labels[i]);
    3493           82 :                   low = CASE_HIGH (labels[i - 1]);
    3494           82 :                   if (!low)
    3495           52 :                     low = CASE_LOW (labels[i - 1]);
    3496              : 
    3497           82 :                   if (CASE_HIGH (labels[i]) != NULL_TREE
    3498          113 :                       && (CASE_HIGH (widest_label) == NULL_TREE
    3499           26 :                           || (wi::gtu_p
    3500           52 :                               (wi::to_wide (CASE_HIGH (labels[i]))
    3501           78 :                                - wi::to_wide (CASE_LOW (labels[i])),
    3502           26 :                                wi::to_wide (CASE_HIGH (widest_label))
    3503          160 :                                - wi::to_wide (CASE_LOW (widest_label))))))
    3504           17 :                     widest_label = labels[i];
    3505              : 
    3506           82 :                   if (wi::to_wide (low) + 1 != wi::to_wide (high))
    3507              :                     break;
    3508              :                 }
    3509           61 :               if (i == len)
    3510              :                 {
    3511              :                   /* Designate the label with the widest range to be the
    3512              :                      default label.  */
    3513           47 :                   tree label = CASE_LABEL (widest_label);
    3514           47 :                   default_case = build_case_label (NULL_TREE, NULL_TREE,
    3515              :                                                    label);
    3516              :                 }
    3517              :             }
    3518              :         }
    3519              :     }
    3520              : 
    3521        62373 :   if (default_casep)
    3522        50589 :     *default_casep = default_case;
    3523        62373 : }
    3524              : 
    3525              : /* Set the location of all statements in SEQ to LOC.  */
    3526              : 
    3527              : void
    3528      1009604 : gimple_seq_set_location (gimple_seq seq, location_t loc)
    3529              : {
    3530      2039828 :   for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
    3531      1030224 :     gimple_set_location (gsi_stmt (i), loc);
    3532      1009604 : }
    3533              : 
    3534              : /* Release SSA_NAMEs in SEQ as well as the GIMPLE statements.  */
    3535              : 
    3536              : void
    3537      5334406 : gimple_seq_discard (gimple_seq seq)
    3538              : {
    3539      5334406 :   gimple_stmt_iterator gsi;
    3540              : 
    3541      5881366 :   for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
    3542              :     {
    3543       368428 :       gimple *stmt = gsi_stmt (gsi);
    3544       368428 :       gsi_remove (&gsi, true);
    3545       368428 :       release_defs (stmt);
    3546       368428 :       ggc_free (stmt);
    3547              :     }
    3548      5334406 : }
    3549              : 
    3550              : /* See if STMT now calls function that takes no parameters and if so, drop
    3551              :    call arguments.  This is used when devirtualization machinery redirects
    3552              :    to __builtin_unreachable or __cxa_pure_virtual.  */
    3553              : 
    3554              : void
    3555      1048442 : maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
    3556              : {
    3557      1048442 :   tree decl = gimple_call_fndecl (stmt);
    3558      1048442 :   if (TYPE_ARG_TYPES (TREE_TYPE (decl))
    3559      1047586 :       && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
    3560      1246437 :       && gimple_call_num_args (stmt))
    3561              :     {
    3562       112731 :       gimple_set_num_ops (stmt, 3);
    3563       112731 :       update_stmt_fn (fn, stmt);
    3564              :     }
    3565      1048442 : }
    3566              : 
    3567              : /* Return false if STMT will likely expand to real function call.  */
    3568              : 
    3569              : bool
    3570      3261085 : gimple_inexpensive_call_p (gcall *stmt)
    3571              : {
    3572      3261085 :   if (gimple_call_internal_p (stmt))
    3573              :     return true;
    3574      3209632 :   tree decl = gimple_call_fndecl (stmt);
    3575      3209632 :   if (decl && is_inexpensive_builtin (decl))
    3576              :     return true;
    3577              :   return false;
    3578              : }
    3579              : 
    3580              : /* Return a non-artificial location for STMT.  If STMT does not have
    3581              :    location information, get the location from EXPR.  */
    3582              : 
    3583              : location_t
    3584       121663 : gimple_or_expr_nonartificial_location (gimple *stmt, tree expr)
    3585              : {
    3586       121663 :   location_t loc = gimple_nonartificial_location (stmt);
    3587       121663 :   if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr))
    3588           52 :     loc = tree_nonartificial_location (expr);
    3589       121663 :   return expansion_point_location_if_in_system_header (loc);
    3590              : }
    3591              : 
    3592              : 
    3593              : #if CHECKING_P
    3594              : 
    3595              : namespace selftest {
    3596              : 
    3597              : /* Selftests for core gimple structures.  */
    3598              : 
    3599              : /* Verify that STMT is pretty-printed as EXPECTED.
    3600              :    Helper function for selftests.  */
    3601              : 
    3602              : static void
    3603           20 : verify_gimple_pp (const char *expected, gimple *stmt)
    3604              : {
    3605           20 :   pretty_printer pp;
    3606           20 :   pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
    3607           20 :   ASSERT_STREQ (expected, pp_formatted_text (&pp));
    3608           20 : }
    3609              : 
    3610              : /* Build a GIMPLE_ASSIGN equivalent to
    3611              :      tmp = 5;
    3612              :    and verify various properties of it.  */
    3613              : 
    3614              : static void
    3615            4 : test_assign_single ()
    3616              : {
    3617            4 :   tree type = integer_type_node;
    3618            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3619              :                          get_identifier ("tmp"),
    3620              :                          type);
    3621            4 :   tree rhs = build_int_cst (type, 5);
    3622            4 :   gassign *stmt = gimple_build_assign (lhs, rhs);
    3623            4 :   verify_gimple_pp ("tmp = 5;", stmt);
    3624              : 
    3625            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3626            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3627            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3628            4 :   ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
    3629            4 :   ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
    3630            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3631            4 :   ASSERT_TRUE (gimple_assign_single_p (stmt));
    3632            8 :   ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
    3633            4 : }
    3634              : 
    3635              : /* Build a GIMPLE_ASSIGN equivalent to
    3636              :      tmp = a * b;
    3637              :    and verify various properties of it.  */
    3638              : 
    3639              : static void
    3640            4 : test_assign_binop ()
    3641              : {
    3642            4 :   tree type = integer_type_node;
    3643            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3644              :                          get_identifier ("tmp"),
    3645              :                          type);
    3646            4 :   tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3647              :                        get_identifier ("a"),
    3648              :                        type);
    3649            4 :   tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3650              :                        get_identifier ("b"),
    3651              :                        type);
    3652            4 :   gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
    3653            4 :   verify_gimple_pp ("tmp = a * b;", stmt);
    3654              : 
    3655            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3656            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3657            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3658            4 :   ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
    3659            8 :   ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
    3660            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3661            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3662            4 :   ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
    3663            4 : }
    3664              : 
    3665              : /* Build a GIMPLE_NOP and verify various properties of it.  */
    3666              : 
    3667              : static void
    3668            4 : test_nop_stmt ()
    3669              : {
    3670            4 :   gimple *stmt = gimple_build_nop ();
    3671            4 :   verify_gimple_pp ("GIMPLE_NOP", stmt);
    3672            4 :   ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
    3673            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3674            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3675            4 : }
    3676              : 
    3677              : /* Build a GIMPLE_RETURN equivalent to
    3678              :      return 7;
    3679              :    and verify various properties of it.  */
    3680              : 
    3681              : static void
    3682            4 : test_return_stmt ()
    3683              : {
    3684            4 :   tree type = integer_type_node;
    3685            4 :   tree val = build_int_cst (type, 7);
    3686            4 :   greturn *stmt = gimple_build_return (val);
    3687            4 :   verify_gimple_pp ("return 7;", stmt);
    3688              : 
    3689            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3690            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3691            4 :   ASSERT_EQ (val, gimple_return_retval (stmt));
    3692            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3693            4 : }
    3694              : 
    3695              : /* Build a GIMPLE_RETURN equivalent to
    3696              :      return;
    3697              :    and verify various properties of it.  */
    3698              : 
    3699              : static void
    3700            4 : test_return_without_value ()
    3701              : {
    3702            4 :   greturn *stmt = gimple_build_return (NULL);
    3703            4 :   verify_gimple_pp ("return;", stmt);
    3704              : 
    3705            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3706            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3707            4 :   ASSERT_EQ (NULL, gimple_return_retval (stmt));
    3708            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3709            4 : }
    3710              : 
    3711              : /* Run all of the selftests within this file.  */
    3712              : 
    3713              : void
    3714            4 : gimple_cc_tests ()
    3715              : {
    3716            4 :   test_assign_single ();
    3717            4 :   test_assign_binop ();
    3718            4 :   test_nop_stmt ();
    3719            4 :   test_return_stmt ();
    3720            4 :   test_return_without_value ();
    3721            4 : }
    3722              : 
    3723              : } // namespace selftest
    3724              : 
    3725              : 
    3726              : #endif /* CHECKING_P */
        

Generated by: LCOV version 2.4-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.