LCOV - code coverage report
Current view: top level - gcc - gimple.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 87.2 % 1574 1372
Test Date: 2026-08-22 16:33:35 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    337469841 : gimple_set_code (gimple *g, enum gimple_code code)
     134              : {
     135    337469841 :   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    413154221 : gimple_size (enum gimple_code code, unsigned num_ops)
     143              : {
     144    413154221 :   size_t size = gsstruct_code_size[gss_for_code (code)];
     145    413154221 :   if (num_ops > 0)
     146    283060987 :     size += (sizeof (tree) * (num_ops - 1));
     147    413154221 :   return size;
     148              : }
     149              : 
     150              : /* Initialize GIMPLE statement G with CODE and NUM_OPS.  */
     151              : 
     152              : void
     153    337469841 : gimple_init (gimple *g, enum gimple_code code, unsigned num_ops)
     154              : {
     155    337469841 :   gimple_set_code (g, code);
     156    337469841 :   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    337469841 :   g->modified = 1;
     161    337469841 :   gimple_init_singleton (g);
     162    337469841 : }
     163              : 
     164              : /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
     165              :    operands.  */
     166              : 
     167              : gimple *
     168    334998977 : gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
     169              : {
     170    334998977 :   size_t size;
     171    334998977 :   gimple *stmt;
     172              : 
     173    334998977 :   size = gimple_size (code, num_ops);
     174    334998977 :   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    334998977 :   stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT);
     182    334998977 :   gimple_init (stmt, code, num_ops);
     183    334998977 :   return stmt;
     184              : }
     185              : 
     186              : /* Set SUBCODE to be the code of the expression computed by statement G.  */
     187              : 
     188              : static inline void
     189    239166295 : 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    239166295 :   gcc_assert (subcode < (1 << 16));
     194    239166295 :   g->subcode = subcode;
     195    239166295 : }
     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    228345310 : 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    228345310 :   gimple_set_subcode (s, subcode);
     212              : 
     213    228345310 :   return s;
     214              : }
     215              : 
     216              : 
     217              : /* Build a GIMPLE_RETURN statement returning RETVAL.  */
     218              : 
     219              : greturn *
     220      3674935 : gimple_build_return (tree retval)
     221              : {
     222      3674935 :   greturn *s
     223      3674935 :     = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK,
     224              :                                                2));
     225      3674935 :   if (retval)
     226      2221258 :     gimple_return_set_retval (s, retval);
     227      3674935 :   return s;
     228              : }
     229              : 
     230              : /* Reset alias information on call S.  */
     231              : 
     232              : void
     233     18767374 : gimple_call_reset_alias_info (gcall *s)
     234              : {
     235     18767374 :   if (gimple_call_flags (s) & ECF_CONST)
     236      2402749 :     memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
     237              :   else
     238     16364625 :     pt_solution_reset (gimple_call_use_set (s));
     239     18767374 :   if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
     240      3650268 :     memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
     241              :   else
     242     15117106 :     pt_solution_reset (gimple_call_clobber_set (s));
     243     18767374 : }
     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     12287961 : gimple_build_call_1 (tree fn, unsigned nargs)
     252              : {
     253     12287961 :   gcall *s
     254     24575922 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     255              :                                              nargs + 3));
     256     12287961 :   if (TREE_CODE (fn) == FUNCTION_DECL)
     257     12068375 :     fn = build_fold_addr_expr (fn);
     258     12287961 :   gimple_set_op (s, 1, fn);
     259     12287961 :   gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn)));
     260     12287961 :   gimple_call_reset_alias_info (s);
     261     12287961 :   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       779669 : gimple_build_call_vec (tree fn, const vec<tree> &args)
     270              : {
     271       779669 :   unsigned i;
     272       779669 :   unsigned nargs = args.length ();
     273       779669 :   gcall *call = gimple_build_call_1 (fn, nargs);
     274              : 
     275      3429831 :   for (i = 0; i < nargs; i++)
     276      1870493 :     gimple_call_set_arg (call, i, args[i]);
     277              : 
     278       779669 :   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       631522 : gimple_build_call (tree fn, unsigned nargs, ...)
     287              : {
     288       631522 :   va_list ap;
     289       631522 :   gcall *call;
     290       631522 :   unsigned i;
     291              : 
     292       631522 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     293              : 
     294       631522 :   call = gimple_build_call_1 (fn, nargs);
     295              : 
     296       631522 :   va_start (ap, nargs);
     297      1309553 :   for (i = 0; i < nargs; i++)
     298       678031 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     299       631522 :   va_end (ap);
     300              : 
     301       631522 :   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         2455 : gimple_build_call_valist (tree fn, unsigned nargs, va_list ap)
     310              : {
     311         2455 :   gcall *call;
     312         2455 :   unsigned i;
     313              : 
     314         2455 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     315              : 
     316         2455 :   call = gimple_build_call_1 (fn, nargs);
     317              : 
     318        11958 :   for (i = 0; i < nargs; i++)
     319         7048 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     320              : 
     321         2455 :   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       870142 : gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs)
     331              : {
     332       870142 :   gcall *s
     333      1740284 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     334              :                                              nargs + 3));
     335       870142 :   s->subcode |= GF_CALL_INTERNAL;
     336       870142 :   gimple_call_set_internal_fn (s, fn);
     337       870142 :   gimple_call_reset_alias_info (s);
     338       870142 :   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       483796 : gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...)
     347              : {
     348       483796 :   va_list ap;
     349       483796 :   gcall *call;
     350       483796 :   unsigned i;
     351              : 
     352       483796 :   call = gimple_build_call_internal_1 (fn, nargs);
     353       483796 :   va_start (ap, nargs);
     354      1943797 :   for (i = 0; i < nargs; i++)
     355      1460001 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     356       483796 :   va_end (ap);
     357              : 
     358       483796 :   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       386331 : gimple_build_call_internal_vec (enum internal_fn fn, const vec<tree> &args)
     367              : {
     368       386331 :   unsigned i, nargs;
     369       386331 :   gcall *call;
     370              : 
     371       386331 :   nargs = args.length ();
     372       386331 :   call = gimple_build_call_internal_1 (fn, nargs);
     373      1921003 :   for (i = 0; i < nargs; i++)
     374      1148341 :     gimple_call_set_arg (call, i, args[i]);
     375              : 
     376       386331 :   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     10874330 : gimple_build_call_from_tree (tree t, tree fnptrtype)
     386              : {
     387     10874330 :   unsigned i, nargs;
     388     10874330 :   gcall *call;
     389              : 
     390     10874330 :   gcc_assert (TREE_CODE (t) == CALL_EXPR);
     391              : 
     392     10874330 :   nargs = call_expr_nargs (t);
     393              : 
     394     10874330 :   tree fndecl = NULL_TREE;
     395     10874330 :   if (CALL_EXPR_FN (t) == NULL_TREE)
     396           15 :     call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs);
     397              :   else
     398              :     {
     399     10874315 :       fndecl = get_callee_fndecl (t);
     400     11037641 :       call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
     401              :     }
     402              : 
     403     30356119 :   for (i = 0; i < nargs; i++)
     404     19481789 :     gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
     405              : 
     406     10874330 :   gimple_set_block (call, TREE_BLOCK (t));
     407     10874330 :   gimple_set_location (call, EXPR_LOCATION (t));
     408              : 
     409              :   /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL.  */
     410     10874330 :   gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
     411     10874330 :   gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
     412     10874330 :   gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t));
     413     10874330 :   gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
     414     10874330 :   if (fndecl
     415     10710989 :       && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
     416     13176070 :       && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl)))
     417        83298 :     gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t));
     418     10832681 :   else if (fndecl
     419     21502021 :            && (DECL_IS_OPERATOR_NEW_P (fndecl)
     420     10613014 :                || DECL_IS_OPERATOR_DELETE_P (fndecl)))
     421       268518 :     gimple_call_set_from_new_or_delete (call, CALL_FROM_NEW_OR_DELETE_P (t));
     422              :   else
     423     21396844 :     gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
     424     10874330 :   gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
     425     10874330 :   gimple_call_set_nothrow (call, TREE_NOTHROW (t));
     426     10874330 :   if (fndecl)
     427     10710989 :     gimple_call_set_expected_throw (call,
     428     10710989 :                                     flags_from_decl_or_type (fndecl)
     429     10710989 :                                     & ECF_XTHROW);
     430     10874330 :   gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t));
     431     10874330 :   copy_warning (call, t);
     432              : 
     433     10874330 :   if (fnptrtype)
     434              :     {
     435     10874189 :       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     10874189 :       if (!fndecl)
     441              :         {
     442       163200 :           gcc_assert (POINTER_TYPE_P (fnptrtype));
     443       163200 :           tree fntype = TREE_TYPE (fnptrtype);
     444              : 
     445       163200 :           if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype)))
     446           21 :             gimple_call_set_nocf_check (call, true);
     447              :         }
     448              :     }
     449              : 
     450     10874330 :   return call;
     451              : }
     452              : 
     453              : /* Build a gcall to __builtin_unreachable as rewritten by
     454              :    -fsanitize=unreachable.  */
     455              : 
     456              : gcall *
     457       183868 : gimple_build_builtin_unreachable (location_t loc)
     458              : {
     459       183868 :   tree data = NULL_TREE;
     460       183868 :   tree fn = sanitize_unreachable_fn (&data, loc);
     461       183868 :   gcall *g = gimple_build_call (fn, data != NULL_TREE, data);
     462       183868 :   gimple_call_set_ctrl_altering (g, true);
     463       183868 :   gimple_set_location (g, loc);
     464       183868 :   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     89091491 : gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL)
     474              : {
     475     89091491 :   enum tree_code subcode;
     476     89091491 :   tree op1, op2, op3;
     477              : 
     478     89091491 :   extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3);
     479     89091491 :   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     95564124 : gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1,
     488              :                        tree op2, tree op3 MEM_STAT_DECL)
     489              : {
     490     95564124 :   unsigned num_ops;
     491     95564124 :   gassign *p;
     492              : 
     493              :   /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
     494              :      code).  */
     495     95564124 :   num_ops = get_gimple_rhs_num_ops (subcode) + 1;
     496              : 
     497    191128248 :   p = as_a <gassign *> (
     498              :         gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
     499              :                                     PASS_MEM_STAT));
     500     95564124 :   gimple_assign_set_lhs (p, lhs);
     501              :   /* For COND_EXPR, op1 should not be a comparison. */
     502     95564124 :   if (op1 && subcode == COND_EXPR)
     503       282669 :     gcc_assert (!COMPARISON_CLASS_P  (op1));
     504     95564124 :   gimple_assign_set_rhs1 (p, op1);
     505     95564124 :   if (op2)
     506              :     {
     507     15078176 :       gcc_assert (num_ops > 2);
     508     15078176 :       gimple_assign_set_rhs2 (p, op2);
     509              :     }
     510              : 
     511     95564124 :   if (op3)
     512              :     {
     513       398958 :       gcc_assert (num_ops > 3);
     514       398958 :       gimple_assign_set_rhs3 (p, op3);
     515              :     }
     516              : 
     517     95564124 :   return p;
     518              : }
     519              : 
     520              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
     521              :    OP1, OP2 and OP3.  */
     522              : 
     523              : gassign *
     524     90498166 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     525              :                      tree op2, tree op3 MEM_STAT_DECL)
     526              : {
     527     90498166 :   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      3546488 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     535              :                      tree op2 MEM_STAT_DECL)
     536              : {
     537      3546488 :   return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE
     538      3546488 :                                 PASS_MEM_STAT);
     539              : }
     540              : 
     541              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1.  */
     542              : 
     543              : gassign *
     544      1519470 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL)
     545              : {
     546      1519470 :   return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE
     547      1519470 :                                 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     10876917 : gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
     559              :                    tree t_label, tree f_label)
     560              : {
     561     10876917 :   gcond *p;
     562              : 
     563     10876917 :   gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
     564     21753834 :   p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4));
     565     10876917 :   gimple_cond_set_lhs (p, lhs);
     566     10876917 :   gimple_cond_set_rhs (p, rhs);
     567     10876917 :   gimple_cond_set_true_label (p, t_label);
     568     10876917 :   gimple_cond_set_false_label (p, f_label);
     569     10876917 :   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       102500 : gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
     577              : {
     578       102500 :   enum tree_code code;
     579       102500 :   tree lhs, rhs;
     580              : 
     581       102500 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     582       102500 :   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       437394 : gimple_cond_set_condition_from_tree (gcond *stmt, tree cond)
     590              : {
     591       437394 :   enum tree_code code;
     592       437394 :   tree lhs, rhs;
     593              : 
     594       437394 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     595       437394 :   gimple_cond_set_condition (stmt, code, lhs, rhs);
     596       437394 : }
     597              : 
     598              : /* Build a GIMPLE_LABEL statement for LABEL.  */
     599              : 
     600              : glabel *
     601     19573389 : gimple_build_label (tree label)
     602              : {
     603     19573389 :   glabel *p
     604     19573389 :     = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1));
     605     19573389 :   gimple_label_set_label (p, label);
     606     19573389 :   return p;
     607              : }
     608              : 
     609              : /* Build a GIMPLE_GOTO statement to label DEST.  */
     610              : 
     611              : ggoto *
     612      7170484 : gimple_build_goto (tree dest)
     613              : {
     614      7170484 :   ggoto *p
     615      7170484 :     = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1));
     616      7170484 :   gimple_goto_set_dest (p, dest);
     617      7170484 :   return p;
     618              : }
     619              : 
     620              : 
     621              : /* Build a GIMPLE_NOP statement.  */
     622              : 
     623              : gimple *
     624     15795583 : gimple_build_nop (void)
     625              : {
     626     15795583 :   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      7553305 : gimple_build_bind (tree vars, gimple_seq body, tree block)
     636              : {
     637      7553305 :   gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0));
     638      7553305 :   gimple_bind_set_vars (p, vars);
     639      7553305 :   if (body)
     640      1364593 :     gimple_bind_set_body (p, body);
     641      7553305 :   if (block)
     642      6042199 :     gimple_bind_set_block (p, block);
     643      7553305 :   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        87678 : gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
     656              :                     unsigned nclobbers, unsigned nlabels)
     657              : {
     658        87678 :   gasm *p;
     659        87678 :   int size = strlen (string);
     660              : 
     661        87678 :   p = as_a <gasm *> (
     662        87678 :         gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
     663              :                                ninputs + noutputs + nclobbers + nlabels));
     664              : 
     665        87678 :   p->ni = ninputs;
     666        87678 :   p->no = noutputs;
     667        87678 :   p->nc = nclobbers;
     668        87678 :   p->nl = nlabels;
     669        87678 :   p->string = ggc_alloc_string (string, size);
     670              : 
     671        87678 :   if (GATHER_STATISTICS)
     672              :     gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
     673              : 
     674        87678 :   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        87678 : 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        87678 :   gasm *p;
     694        87678 :   unsigned i;
     695              : 
     696       171784 :   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       303103 :   for (i = 0; i < vec_safe_length (inputs); i++)
     703        47129 :     gimple_asm_set_input_op (p, i, (*inputs)[i]);
     704              : 
     705       249750 :   for (i = 0; i < vec_safe_length (outputs); i++)
     706        65772 :     gimple_asm_set_output_op (p, i, (*outputs)[i]);
     707              : 
     708       301034 :   for (i = 0; i < vec_safe_length (clobbers); i++)
     709        80193 :     gimple_asm_set_clobber_op (p, i, (*clobbers)[i]);
     710              : 
     711        88625 :   for (i = 0; i < vec_safe_length (labels); i++)
     712          947 :     gimple_asm_set_label_op (p, i, (*labels)[i]);
     713              : 
     714        87678 :   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        41021 : gimple_build_catch (tree types, gimple_seq handler)
     724              : {
     725        41021 :   gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0));
     726        41021 :   gimple_catch_set_types (p, types);
     727        41021 :   if (handler)
     728        41009 :     gimple_catch_set_handler (p, handler);
     729              : 
     730        41021 :   return p;
     731              : }
     732              : 
     733              : /* Build a GIMPLE_EH_FILTER statement.
     734              : 
     735              :    TYPES are the filter's types.
     736              :    FAILURE is the filter's failure action.  */
     737              : 
     738              : geh_filter *
     739         5891 : gimple_build_eh_filter (tree types, gimple_seq failure)
     740              : {
     741         5891 :   geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0));
     742         5891 :   gimple_eh_filter_set_types (p, types);
     743         5891 :   if (failure)
     744         5891 :     gimple_eh_filter_set_failure (p, failure);
     745              : 
     746         5891 :   return p;
     747              : }
     748              : 
     749              : /* Build a GIMPLE_EH_MUST_NOT_THROW statement.  */
     750              : 
     751              : geh_mnt *
     752      1352772 : gimple_build_eh_must_not_throw (tree decl)
     753              : {
     754      1352772 :   geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0));
     755              : 
     756      1352772 :   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
     757      1352772 :   gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
     758      1352772 :   gimple_eh_must_not_throw_set_fndecl (p, decl);
     759              : 
     760      1352772 :   return p;
     761              : }
     762              : 
     763              : /* Build a GIMPLE_EH_ELSE statement.  */
     764              : 
     765              : geh_else *
     766          519 : gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body)
     767              : {
     768          519 :   geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0));
     769          519 :   gimple_eh_else_set_n_body (p, n_body);
     770          519 :   gimple_eh_else_set_e_body (p, e_body);
     771          519 :   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      3287344 : gimple_build_try (gimple_seq eval, gimple_seq cleanup,
     783              :                   enum gimple_try_flags kind)
     784              : {
     785      3287344 :   gtry *p;
     786              : 
     787      3287344 :   gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
     788      3287344 :   p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0));
     789      3287344 :   gimple_set_subcode (p, kind);
     790      3287344 :   if (eval)
     791      3193725 :     gimple_try_set_eval (p, eval);
     792      3287344 :   if (cleanup)
     793      3287344 :     gimple_try_set_cleanup (p, cleanup);
     794              : 
     795      3287344 :   return p;
     796              : }
     797              : 
     798              : /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
     799              : 
     800              :    CLEANUP is the cleanup expression.  */
     801              : 
     802              : gimple *
     803       654256 : gimple_build_wce (gimple_seq cleanup)
     804              : {
     805       654256 :   gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
     806       654256 :   if (cleanup)
     807       654256 :     gimple_wce_set_cleanup (p, cleanup);
     808              : 
     809       654256 :   return p;
     810              : }
     811              : 
     812              : 
     813              : /* Build a GIMPLE_RESX statement.  */
     814              : 
     815              : gresx *
     816       950769 : gimple_build_resx (int region)
     817              : {
     818       950769 :   gresx *p
     819       950769 :     = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0));
     820       950769 :   p->region = region;
     821       950769 :   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        67448 : gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
     832              : {
     833              :   /* nlabels + 1 default label + 1 index.  */
     834        67448 :   gcc_checking_assert (default_label);
     835       134896 :   gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH,
     836              :                                                         ERROR_MARK,
     837              :                                                         1 + 1 + nlabels));
     838        67448 :   gimple_switch_set_index (p, index);
     839        67448 :   gimple_switch_set_default_label (p, default_label);
     840        67448 :   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        67448 : gimple_build_switch (tree index, tree default_label, const vec<tree> &args)
     851              : {
     852        67448 :   unsigned i, nlabels = args.length ();
     853              : 
     854        67448 :   gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label);
     855              : 
     856              :   /* Copy the labels from the vector to the switch statement.  */
     857      1230876 :   for (i = 0; i < nlabels; i++)
     858      1095980 :     gimple_switch_set_label (p, i + 1, args[i]);
     859              : 
     860        67448 :   return p;
     861              : }
     862              : 
     863              : /* Build a GIMPLE_EH_DISPATCH statement.  */
     864              : 
     865              : geh_dispatch *
     866        42777 : gimple_build_eh_dispatch (int region)
     867              : {
     868        42777 :   geh_dispatch *p
     869        42777 :     = as_a <geh_dispatch *> (
     870              :         gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0));
     871        42777 :   p->region = region;
     872        42777 :   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     69807619 : gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL)
     881              : {
     882     69807619 :   gdebug *p
     883     69807619 :     = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG,
     884              :                                                    (unsigned)GIMPLE_DEBUG_BIND, 2
     885              :                                                    PASS_MEM_STAT));
     886     69807619 :   gimple_debug_bind_set_var (p, var);
     887     69807619 :   gimple_debug_bind_set_value (p, value);
     888     69807619 :   if (stmt)
     889     68800519 :     gimple_set_location (p, gimple_location (stmt));
     890              : 
     891     69807619 :   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       737433 : gimple_build_debug_source_bind (tree var, tree value,
     901              :                                      gimple *stmt MEM_STAT_DECL)
     902              : {
     903       737433 :   gdebug *p
     904       737433 :     = as_a <gdebug *> (
     905              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     906              :                                     (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2
     907              :                                     PASS_MEM_STAT));
     908              : 
     909       737433 :   gimple_debug_source_bind_set_var (p, var);
     910       737433 :   gimple_debug_source_bind_set_value (p, value);
     911       737433 :   if (stmt)
     912       585810 :     gimple_set_location (p, gimple_location (stmt));
     913              : 
     914       737433 :   return p;
     915              : }
     916              : 
     917              : 
     918              : /* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at
     919              :    LOCATION.  */
     920              : 
     921              : gdebug *
     922      2505429 : gimple_build_debug_begin_stmt (tree block, location_t location
     923              :                                     MEM_STAT_DECL)
     924              : {
     925      2505429 :   gdebug *p
     926      2505429 :     = as_a <gdebug *> (
     927              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     928              :                                     (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0
     929              :                                     PASS_MEM_STAT));
     930              : 
     931      2505429 :   gimple_set_location (p, location);
     932      2505429 :   gimple_set_block (p, block);
     933      2505429 :   cfun->debug_marker_count++;
     934              : 
     935      2505429 :   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      4128205 : gimple_build_debug_inline_entry (tree block, location_t location
     944              :                                       MEM_STAT_DECL)
     945              : {
     946      4128205 :   gdebug *p
     947      4128205 :     = as_a <gdebug *> (
     948              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     949              :                                     (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0
     950              :                                     PASS_MEM_STAT));
     951              : 
     952      4128205 :   gimple_set_location (p, location);
     953      4128205 :   gimple_set_block (p, block);
     954      4128205 :   cfun->debug_marker_count++;
     955              : 
     956      4128205 :   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        53540 : gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse,
     989              :                       gimple_seq pre_body)
     990              : {
     991        53540 :   gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0));
     992        53540 :   if (body)
     993        49686 :     gimple_omp_set_body (p, body);
     994        53540 :   gimple_omp_for_set_clauses (p, clauses);
     995        53540 :   gimple_omp_for_set_kind (p, kind);
     996        53540 :   p->collapse = collapse;
     997        53540 :   p->iter =  ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse);
     998              : 
     999        53540 :   if (pre_body)
    1000         3573 :     gimple_omp_for_set_pre_body (p, pre_body);
    1001              : 
    1002        53540 :   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        18577 : gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
    1015              :                            tree data_arg)
    1016              : {
    1017        18577 :   gomp_parallel *p
    1018        18577 :     = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0));
    1019        18577 :   if (body)
    1020        18382 :     gimple_omp_set_body (p, body);
    1021        18577 :   gimple_omp_parallel_set_clauses (p, clauses);
    1022        18577 :   gimple_omp_parallel_set_child_fn (p, child_fn);
    1023        18577 :   gimple_omp_parallel_set_data_arg (p, data_arg);
    1024              : 
    1025        18577 :   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         5690 : 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         5690 :   gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0));
    1044         5690 :   if (body)
    1045         5597 :     gimple_omp_set_body (p, body);
    1046         5690 :   gimple_omp_task_set_clauses (p, clauses);
    1047         5690 :   gimple_omp_task_set_child_fn (p, child_fn);
    1048         5690 :   gimple_omp_task_set_data_arg (p, data_arg);
    1049         5690 :   gimple_omp_task_set_copy_fn (p, copy_fn);
    1050         5690 :   gimple_omp_task_set_arg_size (p, arg_size);
    1051         5690 :   gimple_omp_task_set_arg_align (p, arg_align);
    1052              : 
    1053         5690 :   return p;
    1054              : }
    1055              : 
    1056              : 
    1057              : /* Build a GIMPLE_OMP_SECTION statement for a sections statement.
    1058              : 
    1059              :    BODY is the sequence of statements in the section.  */
    1060              : 
    1061              : gimple *
    1062         1279 : gimple_build_omp_section (gimple_seq body)
    1063              : {
    1064         1279 :   gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0);
    1065         1279 :   if (body)
    1066         1087 :     gimple_omp_set_body (p, body);
    1067              : 
    1068         1279 :   return p;
    1069              : }
    1070              : 
    1071              : 
    1072              : /* Build a GIMPLE_OMP_STRUCTURED_BLOCK statement.
    1073              : 
    1074              :    BODY is the structured block sequence.  */
    1075              : 
    1076              : gimple *
    1077          791 : gimple_build_omp_structured_block (gimple_seq body)
    1078              : {
    1079          791 :   gimple *p = gimple_alloc (GIMPLE_OMP_STRUCTURED_BLOCK, 0);
    1080          791 :   if (body)
    1081          791 :     gimple_omp_set_body (p, body);
    1082              : 
    1083          791 :   return p;
    1084              : }
    1085              : 
    1086              : 
    1087              : /* Build a GIMPLE_OMP_MASTER statement.
    1088              : 
    1089              :    BODY is the sequence of statements to be executed by just the master.  */
    1090              : 
    1091              : gimple *
    1092          874 : gimple_build_omp_master (gimple_seq body)
    1093              : {
    1094          874 :   gimple *p = gimple_alloc (GIMPLE_OMP_MASTER, 0);
    1095          874 :   if (body)
    1096          793 :     gimple_omp_set_body (p, body);
    1097              : 
    1098          874 :   return p;
    1099              : }
    1100              : 
    1101              : /* Build a GIMPLE_OMP_MASKED statement.
    1102              : 
    1103              :    BODY is the sequence of statements to be executed by the selected thread(s).  */
    1104              : 
    1105              : gimple *
    1106          497 : gimple_build_omp_masked (gimple_seq body, tree clauses)
    1107              : {
    1108          497 :   gimple *p = gimple_alloc (GIMPLE_OMP_MASKED, 0);
    1109          497 :   gimple_omp_masked_set_clauses (p, clauses);
    1110          497 :   if (body)
    1111          417 :     gimple_omp_set_body (p, body);
    1112              : 
    1113          497 :   return p;
    1114              : }
    1115              : 
    1116              : /* Build a GIMPLE_OMP_TASKGROUP statement.
    1117              : 
    1118              :    BODY is the sequence of statements to be executed by the taskgroup
    1119              :    construct.
    1120              :    CLAUSES are any of the construct's clauses.  */
    1121              : 
    1122              : gimple *
    1123          611 : gimple_build_omp_taskgroup (gimple_seq body, tree clauses)
    1124              : {
    1125          611 :   gimple *p = gimple_alloc (GIMPLE_OMP_TASKGROUP, 0);
    1126          611 :   gimple_omp_taskgroup_set_clauses (p, clauses);
    1127          611 :   if (body)
    1128          611 :     gimple_omp_set_body (p, body);
    1129              : 
    1130          611 :   return p;
    1131              : }
    1132              : 
    1133              : 
    1134              : /* Build a GIMPLE_OMP_CONTINUE statement.
    1135              : 
    1136              :    CONTROL_DEF is the definition of the control variable.
    1137              :    CONTROL_USE is the use of the control variable.  */
    1138              : 
    1139              : gomp_continue *
    1140        52059 : gimple_build_omp_continue (tree control_def, tree control_use)
    1141              : {
    1142        52059 :   gomp_continue *p
    1143        52059 :     = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0));
    1144        52059 :   gimple_omp_continue_set_control_def (p, control_def);
    1145        52059 :   gimple_omp_continue_set_control_use (p, control_use);
    1146        52059 :   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       102163 : gimple_build_omp_return (bool wait_p)
    1173              : {
    1174       102163 :   gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
    1175       102163 :   if (wait_p)
    1176        37840 :     gimple_omp_return_set_nowait (p);
    1177              : 
    1178       102163 :   return p;
    1179              : }
    1180              : 
    1181              : 
    1182              : /* Build a GIMPLE_OMP_SCAN statement.
    1183              : 
    1184              :    BODY is the sequence of statements to be executed by the scan
    1185              :    construct.
    1186              :    CLAUSES are any of the construct's clauses.  */
    1187              : 
    1188              : gomp_scan *
    1189         1324 : gimple_build_omp_scan (gimple_seq body, tree clauses)
    1190              : {
    1191         1324 :   gomp_scan *p
    1192         1324 :     = as_a <gomp_scan *> (gimple_alloc (GIMPLE_OMP_SCAN, 0));
    1193         1324 :   gimple_omp_scan_set_clauses (p, clauses);
    1194         1324 :   if (body)
    1195         1094 :     gimple_omp_set_body (p, body);
    1196              : 
    1197         1324 :   return p;
    1198              : }
    1199              : 
    1200              : 
    1201              : /* Build a GIMPLE_OMP_SECTIONS statement.
    1202              : 
    1203              :    BODY is a sequence of section statements.
    1204              :    CLAUSES are any of the OMP sections contsruct's clauses: private,
    1205              :    firstprivate, lastprivate, reduction, and nowait.  */
    1206              : 
    1207              : gomp_sections *
    1208          634 : gimple_build_omp_sections (gimple_seq body, tree clauses)
    1209              : {
    1210          634 :   gomp_sections *p
    1211          634 :     = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0));
    1212          634 :   if (body)
    1213          634 :     gimple_omp_set_body (p, body);
    1214          634 :   gimple_omp_sections_set_clauses (p, clauses);
    1215              : 
    1216          634 :   return p;
    1217              : }
    1218              : 
    1219              : 
    1220              : /* Build a GIMPLE_OMP_SECTIONS_SWITCH.  */
    1221              : 
    1222              : gimple *
    1223          386 : gimple_build_omp_sections_switch (void)
    1224              : {
    1225          386 :   return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0);
    1226              : }
    1227              : 
    1228              : 
    1229              : /* Build a GIMPLE_OMP_SINGLE statement.
    1230              : 
    1231              :    BODY is the sequence of statements that will be executed once.
    1232              :    CLAUSES are any of the OMP single construct's clauses: private, firstprivate,
    1233              :    copyprivate, nowait.  */
    1234              : 
    1235              : gomp_single *
    1236         1283 : gimple_build_omp_single (gimple_seq body, tree clauses)
    1237              : {
    1238         1283 :   gomp_single *p
    1239         1283 :     = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0));
    1240         1283 :   if (body)
    1241         1170 :     gimple_omp_set_body (p, body);
    1242         1283 :   gimple_omp_single_set_clauses (p, clauses);
    1243              : 
    1244         1283 :   return p;
    1245              : }
    1246              : 
    1247              : 
    1248              : /* Build a GIMPLE_OMP_SCOPE statement.
    1249              : 
    1250              :    BODY is the sequence of statements that will be executed once.
    1251              :    CLAUSES are any of the OMP scope construct's clauses: private, reduction,
    1252              :    nowait.  */
    1253              : 
    1254              : gimple *
    1255          242 : gimple_build_omp_scope (gimple_seq body, tree clauses)
    1256              : {
    1257          242 :   gimple *p = gimple_alloc (GIMPLE_OMP_SCOPE, 0);
    1258          242 :   gimple_omp_scope_set_clauses (p, clauses);
    1259          242 :   if (body)
    1260          168 :     gimple_omp_set_body (p, body);
    1261              : 
    1262          242 :   return p;
    1263              : }
    1264              : 
    1265              : /* Build a GIMPLE_OMP_DISPATCH statement.
    1266              : 
    1267              :    BODY is the target function call to be dispatched.
    1268              :    CLAUSES are any of the OMP dispatch construct's clauses.  */
    1269              : 
    1270              : gimple *
    1271          852 : gimple_build_omp_dispatch (gimple_seq body, tree clauses)
    1272              : {
    1273          852 :   gimple *p = gimple_alloc (GIMPLE_OMP_DISPATCH, 0);
    1274          852 :   gimple_omp_dispatch_set_clauses (p, clauses);
    1275          852 :   if (body)
    1276          852 :     gimple_omp_set_body (p, body);
    1277              : 
    1278          852 :   return p;
    1279              : }
    1280              : 
    1281              : /* Build a GIMPLE_OMP_INTEROP statement.
    1282              : 
    1283              :    CLAUSES are any of the OMP interop construct's clauses.  */
    1284              : 
    1285              : gimple *
    1286          612 : gimple_build_omp_interop (tree clauses)
    1287              : {
    1288          612 :   gimple *p = gimple_alloc (GIMPLE_OMP_INTEROP, 0);
    1289          612 :   gimple_omp_interop_set_clauses (p, clauses);
    1290              : 
    1291          612 :   return p;
    1292              : }
    1293              : 
    1294              : /* Build a GIMPLE_OMP_TARGET statement.
    1295              : 
    1296              :    BODY is the sequence of statements that will be executed.
    1297              :    KIND is the kind of the region.
    1298              :    CLAUSES are any of the construct's clauses.
    1299              :    ITERATOR_LOOPS is an optional sequence containing constructed loops
    1300              :    for OpenMP iterators.  */
    1301              : 
    1302              : gomp_target *
    1303        43095 : gimple_build_omp_target (gimple_seq body, int kind, tree clauses,
    1304              :                          gimple_seq iterator_loops)
    1305              : {
    1306        43095 :   gomp_target *p
    1307        43095 :     = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0));
    1308        43095 :   if (body)
    1309        29323 :     gimple_omp_set_body (p, body);
    1310        43095 :   gimple_omp_target_set_clauses (p, clauses);
    1311        43095 :   gimple_omp_target_set_kind (p, kind);
    1312        43095 :   gimple_omp_target_set_iterator_loops (p, iterator_loops);
    1313              : 
    1314        43095 :   return p;
    1315              : }
    1316              : 
    1317              : 
    1318              : /* Build a GIMPLE_OMP_TEAMS statement.
    1319              : 
    1320              :    BODY is the sequence of statements that will be executed.
    1321              :    CLAUSES are any of the OMP teams construct's clauses.  */
    1322              : 
    1323              : gomp_teams *
    1324         8892 : gimple_build_omp_teams (gimple_seq body, tree clauses)
    1325              : {
    1326         8892 :   gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0));
    1327         8892 :   if (body)
    1328         8892 :     gimple_omp_set_body (p, body);
    1329         8892 :   gimple_omp_teams_set_clauses (p, clauses);
    1330              : 
    1331         8892 :   return p;
    1332              : }
    1333              : 
    1334              : 
    1335              : /* Build a GIMPLE_OMP_ATOMIC_LOAD statement.  */
    1336              : 
    1337              : gomp_atomic_load *
    1338        10317 : gimple_build_omp_atomic_load (tree lhs, tree rhs, enum omp_memory_order mo)
    1339              : {
    1340        10317 :   gomp_atomic_load *p
    1341        10317 :     = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0));
    1342        10317 :   gimple_omp_atomic_load_set_lhs (p, lhs);
    1343        10317 :   gimple_omp_atomic_load_set_rhs (p, rhs);
    1344        10317 :   gimple_omp_atomic_set_memory_order (p, mo);
    1345        10317 :   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        10317 : gimple_build_omp_atomic_store (tree val, enum omp_memory_order mo)
    1354              : {
    1355        10317 :   gomp_atomic_store *p
    1356        10317 :     = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0));
    1357        10317 :   gimple_omp_atomic_store_set_val (p, val);
    1358        10317 :   gimple_omp_atomic_set_memory_order (p, mo);
    1359        10317 :   return p;
    1360              : }
    1361              : 
    1362              : /* Build a GIMPLE_ASSUME statement.  */
    1363              : 
    1364              : gimple *
    1365          126 : gimple_build_assume (tree guard, gimple_seq body)
    1366              : {
    1367          126 :   gimple_statement_assume *p
    1368          126 :     = as_a <gimple_statement_assume *> (gimple_alloc (GIMPLE_ASSUME, 0));
    1369          126 :   gimple_assume_set_guard (p, guard);
    1370          126 :   *gimple_assume_body_ptr (p) = body;
    1371          126 :   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     47617876 : gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs)
    1413              : {
    1414     47617876 :   gimple_stmt_iterator si;
    1415     47617876 :   if (gs == NULL)
    1416            0 :     return;
    1417              : 
    1418     47617876 :   si = gsi_last (*seq_p);
    1419     47617876 :   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    196969710 : gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs)
    1430              : {
    1431    196969710 :   gimple_stmt_iterator si;
    1432              : 
    1433    196969710 :   if (gs == NULL)
    1434            0 :     return;
    1435              : 
    1436    196969710 :   si = gsi_last (*seq_p);
    1437    196969710 :   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     17172440 : gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
    1445              : {
    1446     17172440 :   gimple_stmt_iterator si;
    1447     17172440 :   if (src == NULL)
    1448      5224484 :     return;
    1449              : 
    1450     11947956 :   si = gsi_last (*dst_p);
    1451     11947956 :   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       282059 : gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src)
    1460              : {
    1461       282059 :   gimple_stmt_iterator si;
    1462       282059 :   if (src == NULL)
    1463        96387 :     return;
    1464              : 
    1465       185672 :   si = gsi_last (*dst_p);
    1466       185672 :   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    268158479 : 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    268158479 :   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    680089960 : annotate_one_with_location (gimple *gs, location_t location)
    1487              : {
    1488    680089960 :   if (!gimple_has_location (gs)
    1489    337790190 :       && !gimple_do_not_emit_location_p (gs)
    1490    680089960 :       && should_carry_location_p (gs))
    1491     26255702 :     gimple_set_location (gs, location);
    1492    680089960 : }
    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    100648924 : annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
    1500              :                                   location_t location)
    1501              : {
    1502    100648924 :   if (gsi_end_p (gsi))
    1503    100648924 :     gsi = gsi_start (seq);
    1504              :   else
    1505     65810490 :     gsi_next (&gsi);
    1506              : 
    1507    780385523 :   for (; !gsi_end_p (gsi); gsi_next (&gsi))
    1508    679736599 :     annotate_one_with_location (gsi_stmt (gsi), location);
    1509    100648924 : }
    1510              : 
    1511              : /* Set the location for all the statements in a sequence STMT_P to LOCATION.  */
    1512              : 
    1513              : void
    1514       228449 : annotate_all_with_location (gimple_seq stmt_p, location_t location)
    1515              : {
    1516       228449 :   gimple_stmt_iterator i;
    1517              : 
    1518       228449 :   if (gimple_seq_empty_p (stmt_p))
    1519       228449 :     return;
    1520              : 
    1521       574067 :   for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
    1522              :     {
    1523       353361 :       gimple *gs = gsi_stmt (i);
    1524       353361 :       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        36750 : empty_stmt_p (gimple *stmt)
    1533              : {
    1534        36750 :   if (gimple_code (stmt) == GIMPLE_NOP)
    1535              :     return true;
    1536        36748 :   if (gbind *bind_stmt = dyn_cast <gbind *> (stmt))
    1537        21803 :     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        36827 : empty_body_p (gimple_seq body)
    1546              : {
    1547        36827 :   gimple_stmt_iterator i;
    1548              : 
    1549        36827 :   if (gimple_seq_empty_p (body))
    1550              :     return true;
    1551        36933 :   for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
    1552        36750 :     if (!empty_stmt_p (gsi_stmt (i))
    1553        36750 :         && !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      1883216 : gimple_seq_copy (gimple_seq src)
    1564              : {
    1565      1883216 :   gimple_stmt_iterator gsi;
    1566      1883216 :   gimple_seq new_seq = NULL;
    1567      1883216 :   gimple *stmt;
    1568              : 
    1569      4230648 :   for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
    1570              :     {
    1571      2347432 :       stmt = gimple_copy (gsi_stmt (gsi));
    1572      2347432 :       gimple_seq_add_stmt (&new_seq, stmt);
    1573              :     }
    1574              : 
    1575      1883216 :   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      1024784 : gimple_call_same_target_p (const gimple *c1, const gimple *c2)
    1584              : {
    1585      1024784 :   if (gimple_call_internal_p (c1))
    1586         8529 :     return (gimple_call_internal_p (c2)
    1587         8529 :             && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
    1588        17058 :             && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
    1589            0 :                 || c1 == c2));
    1590              :   else
    1591      1016255 :     return (gimple_call_fn (c1) == gimple_call_fn (c2)
    1592      1016255 :             || (gimple_call_fndecl (c1)
    1593      1015618 :                 && 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   4323248746 : gimple_call_flags (const gimple *stmt)
    1601              : {
    1602   4323248746 :   int flags = 0;
    1603              : 
    1604   4323248746 :   if (gimple_call_internal_p (stmt))
    1605    123696490 :     flags = internal_fn_flags (gimple_call_internal_fn (stmt));
    1606              :   else
    1607              :     {
    1608   4199552256 :       tree decl = gimple_call_fndecl (stmt);
    1609   4199552256 :       if (decl)
    1610   4074811386 :         flags = flags_from_decl_or_type (decl);
    1611   4199552256 :       flags |= flags_from_decl_or_type (gimple_call_fntype (stmt));
    1612              :     }
    1613              : 
    1614   4323248746 :   if (stmt->subcode & GF_CALL_NOTHROW)
    1615    765636282 :     flags |= ECF_NOTHROW;
    1616   4323248746 :   if (stmt->subcode & GF_CALL_XTHROW)
    1617     14930176 :     flags |= ECF_XTHROW;
    1618              : 
    1619   4323248746 :   if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
    1620            0 :     flags |= ECF_BY_DESCRIPTOR;
    1621              : 
    1622   4323248746 :   return flags;
    1623              : }
    1624              : 
    1625              : /* Return the "fn spec" string for call STMT.  */
    1626              : 
    1627              : attr_fnspec
    1628    447410207 : gimple_call_fnspec (const gcall *stmt)
    1629              : {
    1630    447410207 :   tree type, attr;
    1631              : 
    1632    447410207 :   if (gimple_call_internal_p (stmt))
    1633              :     {
    1634      9694071 :       const_tree spec = internal_fn_fnspec (gimple_call_internal_fn (stmt));
    1635      9694071 :       if (spec)
    1636       394714 :         return spec;
    1637              :       else
    1638      9299357 :         return "";
    1639              :     }
    1640              : 
    1641    437716136 :   type = gimple_call_fntype (stmt);
    1642    437716136 :   if (type)
    1643              :     {
    1644    437716136 :       attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
    1645    437716136 :       if (attr)
    1646     61400915 :         return TREE_VALUE (TREE_VALUE (attr));
    1647              :     }
    1648    376315221 :   if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
    1649    112146640 :     return builtin_fnspec (gimple_call_fndecl (stmt));
    1650    264168581 :   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    264168581 :   if (fndecl
    1655    250091159 :       && DECL_IS_OPERATOR_DELETE_P (fndecl)
    1656      7792385 :       && DECL_IS_REPLACEABLE_OPERATOR (fndecl)
    1657    271955187 :       && gimple_call_from_new_or_delete (stmt))
    1658              :     {
    1659      7731054 :       if (flag_assume_sane_operators_new_delete)
    1660      7729559 :         return ".co ";
    1661              :       else
    1662         1495 :         return ". o ";
    1663              :     }
    1664              :   /* Similarly operator new can be treated as malloc.  */
    1665    256437527 :   if (fndecl
    1666    242360105 :       && DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
    1667    259592606 :       && gimple_call_from_new_or_delete (stmt))
    1668              :     {
    1669      3120207 :       if (flag_assume_sane_operators_new_delete)
    1670      3119215 :         return "mC";
    1671              :       else
    1672          992 :         return "m ";
    1673              :     }
    1674    253317320 :   return "";
    1675              : }
    1676              : 
    1677              : /* Detects argument flags for argument number ARG on call STMT.  */
    1678              : 
    1679              : int
    1680    124028163 : gimple_call_arg_flags (const gcall *stmt, unsigned arg)
    1681              : {
    1682    124028163 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1683    124028163 :   int flags = 0;
    1684              : 
    1685    124028163 :   if (fnspec.known_p ())
    1686     24333630 :     flags = fnspec.arg_eaf_flags (arg);
    1687    124028163 :   tree callee = gimple_call_fndecl (stmt);
    1688    124028163 :   if (callee)
    1689              :     {
    1690    115969247 :       cgraph_node *node = cgraph_node::get (callee);
    1691    115969247 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1692              :                                 : NULL;
    1693              : 
    1694    115754343 :       if (summary && summary->arg_flags.length () > arg)
    1695              :         {
    1696     23522283 :           int modref_flags = summary->arg_flags[arg];
    1697              : 
    1698              :           /* We have possibly optimized out load.  Be conservative here.  */
    1699     23522283 :           if (!node->binds_to_current_def_p ())
    1700     11624819 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1701     23522283 :           if (dbg_cnt (ipa_mod_ref_pta))
    1702     23522283 :             flags |= modref_flags;
    1703              :         }
    1704              :     }
    1705    124028163 :   return flags;
    1706              : }
    1707              : 
    1708              : /* Detects argument flags for return slot on call STMT.  */
    1709              : 
    1710              : int
    1711        97706 : gimple_call_retslot_flags (const gcall *stmt)
    1712              : {
    1713        97706 :   int flags = implicit_retslot_eaf_flags;
    1714              : 
    1715        97706 :   tree callee = gimple_call_fndecl (stmt);
    1716        97706 :   if (callee)
    1717              :     {
    1718        88980 :       cgraph_node *node = cgraph_node::get (callee);
    1719        88980 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1720              :                                 : NULL;
    1721              : 
    1722        88980 :       if (summary)
    1723              :         {
    1724        62154 :           int modref_flags = summary->retslot_flags;
    1725              : 
    1726              :           /* We have possibly optimized out load.  Be conservative here.  */
    1727        62154 :           if (!node->binds_to_current_def_p ())
    1728        52250 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1729        62154 :           if (dbg_cnt (ipa_mod_ref_pta))
    1730        62154 :             flags |= modref_flags;
    1731              :         }
    1732              :     }
    1733        97706 :   return flags;
    1734              : }
    1735              : 
    1736              : /* Detects argument flags for static chain on call STMT.  */
    1737              : 
    1738              : int
    1739       180418 : gimple_call_static_chain_flags (const gcall *stmt)
    1740              : {
    1741       180418 :   int flags = 0;
    1742              : 
    1743       180418 :   tree callee = gimple_call_fndecl (stmt);
    1744       180418 :   if (callee)
    1745              :     {
    1746        27955 :       cgraph_node *node = cgraph_node::get (callee);
    1747        27955 :       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        27955 :       gcc_checking_assert (node->binds_to_current_def_p ());
    1753        27955 :       if (summary)
    1754              :         {
    1755        26021 :           int modref_flags = summary->static_chain_flags;
    1756              : 
    1757        26021 :           if (dbg_cnt (ipa_mod_ref_pta))
    1758       180418 :             flags |= modref_flags;
    1759              :         }
    1760              :     }
    1761       180418 :   return flags;
    1762              : }
    1763              : 
    1764              : /* Detects return flags for the call STMT.  */
    1765              : 
    1766              : int
    1767     49197550 : gimple_call_return_flags (const gcall *stmt)
    1768              : {
    1769     49197550 :   if (gimple_call_flags (stmt) & ECF_MALLOC)
    1770              :     return ERF_NOALIAS;
    1771              : 
    1772     47167471 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1773              : 
    1774     47167471 :   unsigned int arg_no;
    1775     47167471 :   if (fnspec.returns_arg (&arg_no))
    1776      1122083 :     return ERF_RETURNS_ARG | arg_no;
    1777              : 
    1778     46045388 :   if (fnspec.returns_noalias_p ())
    1779         6076 :     return ERF_NOALIAS;
    1780              :   return 0;
    1781              : }
    1782              : 
    1783              : 
    1784              : /* Return true if call STMT is known to return a non-zero result.  */
    1785              : 
    1786              : bool
    1787     13417065 : gimple_call_nonnull_result_p (gcall *call)
    1788              : {
    1789     13417065 :   tree fndecl = gimple_call_fndecl (call);
    1790     13417065 :   if (!fndecl)
    1791              :     return false;
    1792     12237096 :   if (flag_delete_null_pointer_checks && !flag_check_new
    1793     12237041 :       && DECL_IS_OPERATOR_NEW_P (fndecl)
    1794     12795442 :       && !TREE_NOTHROW (fndecl))
    1795              :     return true;
    1796              : 
    1797              :   /* References are always non-NULL.  */
    1798     11694528 :   if (flag_delete_null_pointer_checks
    1799     11694528 :       && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
    1800              :     return true;
    1801              : 
    1802     11694528 :   if (flag_delete_null_pointer_checks
    1803     23382569 :       && lookup_attribute ("returns_nonnull",
    1804     11688041 :                            TYPE_ATTRIBUTES (gimple_call_fntype (call))))
    1805              :     return true;
    1806     11630505 :   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     12740383 : gimple_call_nonnull_arg (gcall *call)
    1814              : {
    1815     12740383 :   tree fndecl = gimple_call_fndecl (call);
    1816     12740383 :   if (!fndecl)
    1817              :     return NULL_TREE;
    1818              : 
    1819     11566901 :   unsigned rf = gimple_call_return_flags (call);
    1820     11566901 :   if (rf & ERF_RETURNS_ARG)
    1821              :     {
    1822            0 :       unsigned argnum = rf & ERF_RETURN_ARG_MASK;
    1823            0 :       if (argnum < gimple_call_num_args (call))
    1824              :         {
    1825            0 :           tree arg = gimple_call_arg (call, argnum);
    1826            0 :           if (SSA_VAR_P (arg)
    1827            0 :               && infer_nonnull_range_by_attribute (call, arg))
    1828            0 :             return arg;
    1829              :         }
    1830              :     }
    1831              :   return NULL_TREE;
    1832              : }
    1833              : 
    1834              : 
    1835              : /* Return true if GS is a copy assignment.  */
    1836              : 
    1837              : bool
    1838    203090010 : gimple_assign_copy_p (gimple *gs)
    1839              : {
    1840    203090010 :   return (gimple_assign_single_p (gs)
    1841    203090010 :           && 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     40907530 : gimple_assign_ssa_name_copy_p (gimple *gs)
    1849              : {
    1850     40907530 :   return (gimple_assign_single_p (gs)
    1851     23172530 :           && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
    1852     54399697 :           && 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        46812 : gimple_assign_unary_nop_p (gimple *gs)
    1872              : {
    1873        46812 :   return (is_gimple_assign (gs)
    1874        46812 :           && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
    1875        41560 :               || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
    1876         5252 :           && gimple_assign_rhs1 (gs) != error_mark_node
    1877        57316 :           && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
    1878         5252 :               == 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    603761038 : gimple_assign_load_p (const gimple *gs)
    1885              : {
    1886    603761038 :   tree rhs;
    1887    603761038 :   if (!gimple_assign_single_p (gs))
    1888              :     return false;
    1889    354191504 :   rhs = gimple_assign_rhs1 (gs);
    1890    354191504 :   if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
    1891              :     return true;
    1892    354191500 :   if (handled_component_p (rhs))
    1893     97424086 :     rhs = TREE_OPERAND (rhs, 0);
    1894    354191500 :   return (handled_component_p (rhs)
    1895    325694202 :           || DECL_P (rhs)
    1896    264972196 :           || TREE_CODE (rhs) == MEM_REF
    1897    195075808 :           || TREE_CODE (rhs) == TARGET_MEM_REF);
    1898              : }
    1899              : 
    1900              : 
    1901              : /* Set BB to be the basic block holding G.  */
    1902              : 
    1903              : void
    1904    756307394 : gimple_set_bb (gimple *stmt, basic_block bb)
    1905              : {
    1906    756307394 :   stmt->bb = bb;
    1907              : 
    1908    756307394 :   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     39025935 :   if (cfun->cfg)
    1914              :     {
    1915     39025821 :       tree t;
    1916     39025821 :       int uid;
    1917              : 
    1918     39025821 :       t = gimple_label_label (as_a <glabel *> (stmt));
    1919     39025821 :       uid = LABEL_DECL_UID (t);
    1920     39025821 :       if (uid == -1)
    1921              :         {
    1922     19901727 :           unsigned old_len =
    1923     19901727 :             vec_safe_length (label_to_block_map_for_fn (cfun));
    1924     19901727 :           LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
    1925     19901727 :           if (old_len <= (unsigned) uid)
    1926      9424927 :             vec_safe_grow_cleared (label_to_block_map_for_fn (cfun), uid + 1);
    1927              :         }
    1928              : 
    1929     39025821 :       (*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      4840444 : gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
    1953              : {
    1954      4840444 :   enum tree_code subcode;
    1955      4840444 :   tree op1, op2, op3;
    1956              : 
    1957      4840444 :   extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
    1958      4840444 :   gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
    1959      4840444 : }
    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      7533641 : gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
    1970              :                                 tree op1, tree op2, tree op3)
    1971              : {
    1972      7533641 :   unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
    1973      7533641 :   gimple *stmt = gsi_stmt (*gsi);
    1974      7533641 :   gimple *old_stmt = stmt;
    1975              : 
    1976              :   /* If the new CODE needs more operands, allocate a new statement.  */
    1977      7533641 :   if (gimple_num_ops (stmt) < new_rhs_ops + 1)
    1978              :     {
    1979       205930 :       tree lhs = gimple_assign_lhs (old_stmt);
    1980       205930 :       stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
    1981       205930 :       memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
    1982       205930 :       gimple_init_singleton (stmt);
    1983              : 
    1984              :       /* The LHS needs to be reset as this also changes the SSA name
    1985              :          on the LHS.  */
    1986       205930 :       gimple_assign_set_lhs (stmt, lhs);
    1987              :     }
    1988              : 
    1989      7533641 :   gimple_set_num_ops (stmt, new_rhs_ops + 1);
    1990      7533641 :   gimple_set_subcode (stmt, code);
    1991      7533641 :   gimple_assign_set_rhs1 (stmt, op1);
    1992      7533641 :   if (new_rhs_ops > 1)
    1993      1186844 :     gimple_assign_set_rhs2 (stmt, op2);
    1994      1186844 :   if (new_rhs_ops > 2)
    1995        36082 :     gimple_assign_set_rhs3 (stmt, op3);
    1996      7533641 :   if (stmt != old_stmt)
    1997       205930 :     gsi_replace (gsi, stmt, false);
    1998      7533641 : }
    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   7260144993 : gimple_get_lhs (const gimple *stmt)
    2008              : {
    2009   7260144993 :   enum gimple_code code = gimple_code (stmt);
    2010              : 
    2011   7260144993 :   if (code == GIMPLE_ASSIGN)
    2012   4556180035 :     return gimple_assign_lhs (stmt);
    2013   2703964958 :   else if (code == GIMPLE_CALL)
    2014    515908989 :     return gimple_call_lhs (stmt);
    2015   2188055969 :   else if (code == GIMPLE_PHI)
    2016    130934975 :     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      2254891 : gimple_set_lhs (gimple *stmt, tree lhs)
    2027              : {
    2028      2254891 :   enum gimple_code code = gimple_code (stmt);
    2029              : 
    2030      2254891 :   if (code == GIMPLE_ASSIGN)
    2031      1068046 :     gimple_assign_set_lhs (stmt, lhs);
    2032      1186845 :   else if (code == GIMPLE_CALL)
    2033      1186845 :     gimple_call_set_lhs (stmt, lhs);
    2034              :   else
    2035            0 :     gcc_unreachable ();
    2036      2254891 : }
    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     75478450 : gimple_copy (gimple *stmt)
    2046              : {
    2047     75478450 :   enum gimple_code code = gimple_code (stmt);
    2048     75478450 :   unsigned num_ops = gimple_num_ops (stmt);
    2049     75478450 :   gimple *copy = gimple_alloc (code, num_ops);
    2050     75478450 :   unsigned i;
    2051              : 
    2052              :   /* Shallow copy all the fields from STMT.  */
    2053     75478450 :   memcpy (copy, stmt, gimple_size (code));
    2054     75478450 :   gimple_init_singleton (copy);
    2055              : 
    2056              :   /* If STMT has sub-statements, deep-copy them as well.  */
    2057     75478450 :   if (gimple_has_substatements (stmt))
    2058              :     {
    2059        42597 :       gimple_seq new_seq;
    2060        42597 :       tree t;
    2061              : 
    2062        42597 :       switch (gimple_code (stmt))
    2063              :         {
    2064          357 :         case GIMPLE_BIND:
    2065          357 :           {
    2066          357 :             gbind *bind_stmt = as_a <gbind *> (stmt);
    2067          357 :             gbind *bind_copy = as_a <gbind *> (copy);
    2068          357 :             new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
    2069          357 :             gimple_bind_set_body (bind_copy, new_seq);
    2070          357 :             gimple_bind_set_vars (bind_copy,
    2071              :                                   unshare_expr (gimple_bind_vars (bind_stmt)));
    2072          357 :             gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
    2073              :           }
    2074          357 :           break;
    2075              : 
    2076        17498 :         case GIMPLE_CATCH:
    2077        17498 :           {
    2078        17498 :             gcatch *catch_stmt = as_a <gcatch *> (stmt);
    2079        17498 :             gcatch *catch_copy = as_a <gcatch *> (copy);
    2080        17498 :             new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt));
    2081        17498 :             gimple_catch_set_handler (catch_copy, new_seq);
    2082        17498 :             t = unshare_expr (gimple_catch_types (catch_stmt));
    2083        17498 :             gimple_catch_set_types (catch_copy, t);
    2084              :           }
    2085        17498 :           break;
    2086              : 
    2087            0 :         case GIMPLE_EH_FILTER:
    2088            0 :           {
    2089            0 :             geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt);
    2090            0 :             geh_filter *eh_filter_copy = as_a <geh_filter *> (copy);
    2091            0 :             new_seq
    2092            0 :               = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt));
    2093            0 :             gimple_eh_filter_set_failure (eh_filter_copy, new_seq);
    2094            0 :             t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt));
    2095            0 :             gimple_eh_filter_set_types (eh_filter_copy, t);
    2096              :           }
    2097            0 :           break;
    2098              : 
    2099          273 :         case GIMPLE_EH_ELSE:
    2100          273 :           {
    2101          273 :             geh_else *eh_else_stmt = as_a <geh_else *> (stmt);
    2102          273 :             geh_else *eh_else_copy = as_a <geh_else *> (copy);
    2103          273 :             new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt));
    2104          273 :             gimple_eh_else_set_n_body (eh_else_copy, new_seq);
    2105          273 :             new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt));
    2106          273 :             gimple_eh_else_set_e_body (eh_else_copy, new_seq);
    2107              :           }
    2108          273 :           break;
    2109              : 
    2110        24187 :         case GIMPLE_TRY:
    2111        24187 :           {
    2112        24187 :             gtry *try_stmt = as_a <gtry *> (stmt);
    2113        24187 :             gtry *try_copy = as_a <gtry *> (copy);
    2114        24187 :             new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
    2115        24187 :             gimple_try_set_eval (try_copy, new_seq);
    2116        24187 :             new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
    2117        24187 :             gimple_try_set_cleanup (try_copy, new_seq);
    2118              :           }
    2119        24187 :           break;
    2120              : 
    2121          276 :         case GIMPLE_OMP_FOR:
    2122          276 :           new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
    2123          276 :           gimple_omp_for_set_pre_body (copy, new_seq);
    2124          276 :           t = unshare_expr (gimple_omp_for_clauses (stmt));
    2125          276 :           gimple_omp_for_set_clauses (copy, t);
    2126          276 :           {
    2127          276 :             gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
    2128          276 :             omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
    2129          276 :               ( gimple_omp_for_collapse (stmt));
    2130              :           }
    2131          564 :           for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
    2132              :             {
    2133          288 :               gimple_omp_for_set_cond (copy, i,
    2134              :                                        gimple_omp_for_cond (stmt, i));
    2135          288 :               gimple_omp_for_set_index (copy, i,
    2136              :                                         gimple_omp_for_index (stmt, i));
    2137          288 :               t = unshare_expr (gimple_omp_for_initial (stmt, i));
    2138          288 :               gimple_omp_for_set_initial (copy, i, t);
    2139          288 :               t = unshare_expr (gimple_omp_for_final (stmt, i));
    2140          288 :               gimple_omp_for_set_final (copy, i, t);
    2141          288 :               t = unshare_expr (gimple_omp_for_incr (stmt, i));
    2142          288 :               gimple_omp_for_set_incr (copy, i, t);
    2143              :             }
    2144          276 :           goto copy_omp_body;
    2145              : 
    2146            0 :         case GIMPLE_OMP_PARALLEL:
    2147            0 :           {
    2148            0 :             gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt);
    2149            0 :             gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy);
    2150            0 :             t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt));
    2151            0 :             gimple_omp_parallel_set_clauses (omp_par_copy, t);
    2152            0 :             t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt));
    2153            0 :             gimple_omp_parallel_set_child_fn (omp_par_copy, t);
    2154            0 :             t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt));
    2155            0 :             gimple_omp_parallel_set_data_arg (omp_par_copy, t);
    2156              :           }
    2157            0 :           goto copy_omp_body;
    2158              : 
    2159            0 :         case GIMPLE_OMP_TASK:
    2160            0 :           t = unshare_expr (gimple_omp_task_clauses (stmt));
    2161            0 :           gimple_omp_task_set_clauses (copy, t);
    2162            0 :           t = unshare_expr (gimple_omp_task_child_fn (stmt));
    2163            0 :           gimple_omp_task_set_child_fn (copy, t);
    2164            0 :           t = unshare_expr (gimple_omp_task_data_arg (stmt));
    2165            0 :           gimple_omp_task_set_data_arg (copy, t);
    2166            0 :           t = unshare_expr (gimple_omp_task_copy_fn (stmt));
    2167            0 :           gimple_omp_task_set_copy_fn (copy, t);
    2168            0 :           t = unshare_expr (gimple_omp_task_arg_size (stmt));
    2169            0 :           gimple_omp_task_set_arg_size (copy, t);
    2170            0 :           t = unshare_expr (gimple_omp_task_arg_align (stmt));
    2171            0 :           gimple_omp_task_set_arg_align (copy, t);
    2172            0 :           goto copy_omp_body;
    2173              : 
    2174            0 :         case GIMPLE_OMP_CRITICAL:
    2175            0 :           t = unshare_expr (gimple_omp_critical_name
    2176            0 :                                 (as_a <gomp_critical *> (stmt)));
    2177            0 :           gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t);
    2178            0 :           t = unshare_expr (gimple_omp_critical_clauses
    2179            0 :                                 (as_a <gomp_critical *> (stmt)));
    2180            0 :           gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t);
    2181            0 :           goto copy_omp_body;
    2182              : 
    2183            0 :         case GIMPLE_OMP_ORDERED:
    2184            0 :           t = unshare_expr (gimple_omp_ordered_clauses
    2185            0 :                                 (as_a <gomp_ordered *> (stmt)));
    2186            0 :           gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t);
    2187            0 :           goto copy_omp_body;
    2188              : 
    2189            0 :         case GIMPLE_OMP_SCAN:
    2190            0 :           t = gimple_omp_scan_clauses (as_a <gomp_scan *> (stmt));
    2191            0 :           t = unshare_expr (t);
    2192            0 :           gimple_omp_scan_set_clauses (as_a <gomp_scan *> (copy), t);
    2193            0 :           goto copy_omp_body;
    2194              : 
    2195            0 :         case GIMPLE_OMP_TASKGROUP:
    2196            0 :           t = unshare_expr (gimple_omp_taskgroup_clauses (stmt));
    2197            0 :           gimple_omp_taskgroup_set_clauses (copy, t);
    2198            0 :           goto copy_omp_body;
    2199              : 
    2200            0 :         case GIMPLE_OMP_SECTIONS:
    2201            0 :           t = unshare_expr (gimple_omp_sections_clauses (stmt));
    2202            0 :           gimple_omp_sections_set_clauses (copy, t);
    2203            0 :           t = unshare_expr (gimple_omp_sections_control (stmt));
    2204            0 :           gimple_omp_sections_set_control (copy, t);
    2205            0 :           goto copy_omp_body;
    2206              : 
    2207            0 :         case GIMPLE_OMP_SINGLE:
    2208            0 :           {
    2209            0 :             gomp_single *omp_single_copy = as_a <gomp_single *> (copy);
    2210            0 :             t = unshare_expr (gimple_omp_single_clauses (stmt));
    2211            0 :             gimple_omp_single_set_clauses (omp_single_copy, t);
    2212              :           }
    2213            0 :           goto copy_omp_body;
    2214              : 
    2215            0 :         case GIMPLE_OMP_SCOPE:
    2216            0 :           t = unshare_expr (gimple_omp_scope_clauses (stmt));
    2217            0 :           gimple_omp_scope_set_clauses (copy, t);
    2218            0 :           goto copy_omp_body;
    2219              : 
    2220            0 :         case GIMPLE_OMP_DISPATCH:
    2221            0 :           t = unshare_expr (gimple_omp_dispatch_clauses (stmt));
    2222            0 :           gimple_omp_dispatch_set_clauses (copy, t);
    2223            0 :           goto copy_omp_body;
    2224              : 
    2225            0 :         case GIMPLE_OMP_INTEROP:
    2226            0 :           t = unshare_expr (gimple_omp_interop_clauses (stmt));
    2227            0 :           gimple_omp_interop_set_clauses (copy, t);
    2228            0 :           break;
    2229              : 
    2230            0 :         case GIMPLE_OMP_TARGET:
    2231            0 :           {
    2232            0 :             gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt);
    2233            0 :             gomp_target *omp_target_copy = as_a <gomp_target *> (copy);
    2234            0 :             t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt));
    2235            0 :             gimple_omp_target_set_clauses (omp_target_copy, t);
    2236            0 :             t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt));
    2237            0 :             gimple_omp_target_set_data_arg (omp_target_copy, t);
    2238              :           }
    2239            0 :           goto copy_omp_body;
    2240              : 
    2241            0 :         case GIMPLE_OMP_TEAMS:
    2242            0 :           {
    2243            0 :             gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy);
    2244            0 :             t = unshare_expr (gimple_omp_teams_clauses (stmt));
    2245            0 :             gimple_omp_teams_set_clauses (omp_teams_copy, t);
    2246              :           }
    2247              :           /* FALLTHRU  */
    2248              : 
    2249          276 :         case GIMPLE_OMP_SECTION:
    2250          276 :         case GIMPLE_OMP_MASTER:
    2251          276 :         case GIMPLE_OMP_STRUCTURED_BLOCK:
    2252          276 :         copy_omp_body:
    2253          276 :           new_seq = gimple_seq_copy (gimple_omp_body (stmt));
    2254          276 :           gimple_omp_set_body (copy, new_seq);
    2255          276 :           break;
    2256              : 
    2257            0 :         case GIMPLE_OMP_MASKED:
    2258            0 :           t = unshare_expr (gimple_omp_masked_clauses (stmt));
    2259            0 :           gimple_omp_masked_set_clauses (copy, t);
    2260            0 :           goto copy_omp_body;
    2261              : 
    2262            0 :         case GIMPLE_ASSUME:
    2263            0 :           new_seq = gimple_seq_copy (gimple_assume_body (stmt));
    2264            0 :           *gimple_assume_body_ptr (copy) = new_seq;
    2265            0 :           gimple_assume_set_guard (copy,
    2266              :                                    unshare_expr (gimple_assume_guard (stmt)));
    2267            0 :           break;
    2268              : 
    2269            6 :         case GIMPLE_TRANSACTION:
    2270            6 :           new_seq = gimple_seq_copy (gimple_transaction_body (
    2271            6 :                                        as_a <gtransaction *> (stmt)));
    2272            6 :           gimple_transaction_set_body (as_a <gtransaction *> (copy),
    2273              :                                        new_seq);
    2274            6 :           break;
    2275              : 
    2276            0 :         case GIMPLE_WITH_CLEANUP_EXPR:
    2277            0 :           new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt));
    2278            0 :           gimple_wce_set_cleanup (copy, new_seq);
    2279            0 :           break;
    2280              : 
    2281            0 :         default:
    2282            0 :           gcc_unreachable ();
    2283              :         }
    2284              :     }
    2285              : 
    2286     75478450 :   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    230162612 :   for (i = 0; i < num_ops; i++)
    2310    154684162 :     gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
    2311              : 
    2312     75478450 :   if (gimple_has_mem_ops (stmt))
    2313              :     {
    2314     34327249 :       gimple_set_vdef (copy, gimple_vdef (stmt));
    2315     34327249 :       gimple_set_vuse (copy, gimple_vuse (stmt));
    2316              :     }
    2317              : 
    2318              :   /* Clear out SSA operand vectors on COPY.  */
    2319     75478450 :   if (gimple_has_ops (stmt))
    2320              :     {
    2321     75032890 :       gimple_set_use_ops (copy, NULL);
    2322              : 
    2323              :       /* SSA operands need to be updated.  */
    2324     75032890 :       gimple_set_modified (copy, true);
    2325              :     }
    2326              : 
    2327     75478450 :   if (gimple_debug_nonbind_marker_p (stmt))
    2328     16721738 :     cfun->debug_marker_count++;
    2329              : 
    2330     75478450 :   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       748840 : gimple_move_vops (gimple *new_stmt, gimple *old_stmt)
    2338              : {
    2339       748840 :   tree vdef = gimple_vdef (old_stmt);
    2340      1497680 :   gimple_set_vuse (new_stmt, gimple_vuse (old_stmt));
    2341       748840 :   gimple_set_vdef (new_stmt, vdef);
    2342       748840 :   if (vdef && TREE_CODE (vdef) == SSA_NAME)
    2343       260912 :     SSA_NAME_DEF_STMT (vdef) = new_stmt;
    2344       748840 : }
    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    887055406 : gimple_has_side_effects (const gimple *s)
    2354              : {
    2355    887055406 :   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   1333028346 :   if (gimple_has_volatile_ops (s))
    2362              :     return true;
    2363              : 
    2364    670068466 :   if (gimple_code (s) == GIMPLE_ASM
    2365    670068466 :       && gimple_asm_volatile_p (as_a <const gasm *> (s)))
    2366              :     return true;
    2367              : 
    2368    669532546 :   if (is_gimple_call (s))
    2369              :     {
    2370     95765632 :       int flags = gimple_call_flags (s);
    2371              : 
    2372              :       /* An infinite loop is considered a side effect.  */
    2373     95765632 :       if (!(flags & (ECF_CONST | ECF_PURE))
    2374     19053426 :           || (flags & ECF_LOOPING_CONST_OR_PURE))
    2375              :         return true;
    2376              : 
    2377     16922132 :       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     64587405 : gimple_could_trap_p_1 (const gimple *s, bool include_mem, bool include_stores)
    2390              : {
    2391     64587405 :   tree t, div = NULL_TREE;
    2392     64587405 :   enum tree_code op;
    2393              : 
    2394     64587405 :   if (include_mem)
    2395              :     {
    2396     39783514 :       unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
    2397              : 
    2398    132442870 :       for (i = start; i < gimple_num_ops (s); i++)
    2399     98085222 :         if (tree_could_trap_p (gimple_op (s, i)))
    2400              :           return true;
    2401              :     }
    2402              : 
    2403     59161539 :   switch (gimple_code (s))
    2404              :     {
    2405        10394 :     case GIMPLE_ASM:
    2406        10394 :       return gimple_asm_volatile_p (as_a <const gasm *> (s));
    2407              : 
    2408      1560488 :     case GIMPLE_CALL:
    2409      1560488 :       {
    2410      1560488 :         if (gimple_call_internal_p (s))
    2411              :           return false;
    2412      1353271 :         t = gimple_call_fndecl (s);
    2413              :         /* Assume that indirect and calls to weak functions may trap.  */
    2414      1353271 :         if (!t || !DECL_P (t) || DECL_WEAK (t))
    2415              :           return true;
    2416              : 
    2417              :         /* Any floating point builtin operation could trap.  */
    2418      1328551 :         if (gimple_call_builtin_p (s))
    2419              :           {
    2420       980338 :             if (fndecl_built_in_p (t, BUILT_IN_NORMAL))
    2421       875836 :               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       930294 :             tree type = TREE_TYPE (gimple_call_fntype (s));
    2430       930294 :             bool fp_operation = FLOAT_TYPE_P (type);
    2431        50166 :             return fp_operation && flag_trapping_math;
    2432              :           }
    2433              :         return false;
    2434              :       }
    2435     46759216 :     case GIMPLE_ASSIGN:
    2436     46759216 :       op = gimple_assign_rhs_code (s);
    2437              : 
    2438              :       /* COND_EXPR does not trap.  */
    2439     46759216 :       if (op == COND_EXPR)
    2440              :         return false;
    2441              : 
    2442              :       /* For comparisons we need to check rhs operand types instead of lhs type
    2443              :          (which is BOOLEAN_TYPE).  */
    2444     46677918 :       if (TREE_CODE_CLASS (op) == tcc_comparison)
    2445      2397306 :         t = TREE_TYPE (gimple_assign_rhs1 (s));
    2446              :       else
    2447     44280612 :         t = TREE_TYPE (gimple_assign_lhs (s));
    2448              : 
    2449     46677918 :       if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
    2450     25812585 :         div = gimple_assign_rhs2 (s);
    2451              : 
    2452     49557317 :       return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
    2453     46677918 :                                       (INTEGRAL_TYPE_P (t)
    2454     33900710 :                                        && TYPE_OVERFLOW_TRAPS (t)),
    2455     46677918 :                                       div));
    2456              : 
    2457      6373980 :     case GIMPLE_COND:
    2458      6373980 :       t = TREE_TYPE (gimple_cond_lhs (s));
    2459      6373980 :       return operation_could_trap_p (gimple_cond_code (s),
    2460     12747960 :                                      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     35586771 : gimple_could_trap_p (const gimple *s)
    2473              : {
    2474     35586771 :   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      3224569 : gimple_assign_rhs_could_trap_p (gimple *s)
    2481              : {
    2482      3224569 :   gcc_assert (is_gimple_assign (s));
    2483      3224569 :   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    103403264 : get_gimple_rhs_num_ops (enum tree_code code)
    2525              : {
    2526    103403264 :   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     62632821 : gimple_compare_field_offset (tree f1, tree f2)
    2623              : {
    2624     62632821 :   if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
    2625              :     {
    2626     62632758 :       tree offset1 = DECL_FIELD_OFFSET (f1);
    2627     62632758 :       tree offset2 = DECL_FIELD_OFFSET (f2);
    2628     62632758 :       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    125265516 :               && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
    2643     62632758 :                                      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       598759 : gimple_signed_or_unsigned_type (bool unsignedp, tree type)
    2674              : {
    2675       598759 :   tree type1;
    2676       598759 :   int i;
    2677              : 
    2678       598759 :   type1 = TYPE_MAIN_VARIANT (type);
    2679       598759 :   if (type1 == signed_char_type_node
    2680       598759 :       || type1 == char_type_node
    2681       598759 :       || type1 == unsigned_char_type_node)
    2682            0 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2683       598759 :   if (type1 == integer_type_node || type1 == unsigned_type_node)
    2684       345555 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2685       253204 :   if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
    2686       231711 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2687        21493 :   if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
    2688           30 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
    2689        21463 :   if (type1 == long_long_integer_type_node
    2690        21374 :       || 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        35317 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    2696        21374 :     if (int_n_enabled_p[i]
    2697        21374 :         && (type1 == int_n_trees[i].unsigned_type
    2698        14315 :             || type1 == int_n_trees[i].signed_type))
    2699         7431 :         return unsignedp
    2700         7431 :           ? int_n_trees[i].unsigned_type
    2701         7431 :           : int_n_trees[i].signed_type;
    2702              : 
    2703              : #if HOST_BITS_PER_WIDE_INT >= 64
    2704        13943 :   if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
    2705            0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
    2706              : #endif
    2707        13943 :   if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
    2708            0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
    2709        13943 :   if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
    2710            0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
    2711        13943 :   if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
    2712            0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
    2713        13943 :   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        13943 :   GIMPLE_FIXED_TYPES (fract);
    2765        13943 :   GIMPLE_FIXED_TYPES_SAT (fract);
    2766        13943 :   GIMPLE_FIXED_TYPES (accum);
    2767        13943 :   GIMPLE_FIXED_TYPES_SAT (accum);
    2768              : 
    2769        13943 :   GIMPLE_FIXED_MODE_TYPES (qq);
    2770        13943 :   GIMPLE_FIXED_MODE_TYPES (hq);
    2771        13943 :   GIMPLE_FIXED_MODE_TYPES (sq);
    2772        13943 :   GIMPLE_FIXED_MODE_TYPES (dq);
    2773        13943 :   GIMPLE_FIXED_MODE_TYPES (tq);
    2774        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (qq);
    2775        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (hq);
    2776        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (sq);
    2777        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (dq);
    2778        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (tq);
    2779        13943 :   GIMPLE_FIXED_MODE_TYPES (ha);
    2780        13943 :   GIMPLE_FIXED_MODE_TYPES (sa);
    2781        13943 :   GIMPLE_FIXED_MODE_TYPES (da);
    2782        13943 :   GIMPLE_FIXED_MODE_TYPES (ta);
    2783        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (ha);
    2784        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (sa);
    2785        13943 :   GIMPLE_FIXED_MODE_TYPES_SAT (da);
    2786        13943 :   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        13943 :   if (!INTEGRAL_TYPE_P (type)
    2797        13943 :       || 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        13943 :   if (TYPE_OK (signed_char_type_node))
    2804          461 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2805        13482 :   if (TYPE_OK (integer_type_node))
    2806         3513 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2807         9969 :   if (TYPE_OK (short_integer_type_node))
    2808         4752 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2809         5217 :   if (TYPE_OK (long_integer_type_node))
    2810            6 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
    2811         5211 :   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        10395 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    2817         5211 :     if (int_n_enabled_p[i]
    2818         5211 :         && TYPE_MODE (type) == int_n_data[i].m
    2819         5238 :         && 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         5184 :   if (TYPE_OK (intTI_type_node))
    2826            0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
    2827              : #endif
    2828         5184 :   if (TYPE_OK (intDI_type_node))
    2829            0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
    2830         5184 :   if (TYPE_OK (intSI_type_node))
    2831            0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
    2832         5184 :   if (TYPE_OK (intHI_type_node))
    2833            0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
    2834         5184 :   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         5184 :   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       598759 : gimple_signed_type (tree type)
    2860              : {
    2861       598759 :   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      8613774 : gimple_get_alias_set (tree t)
    2870              : {
    2871              :   /* That's all the expressions we handle specially.  */
    2872      8613774 :   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      2446617 :   if (t == char_type_node
    2879      1910699 :       || t == signed_char_type_node
    2880      1910699 :       || 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      1910699 :   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
    2886              :     {
    2887       597851 :       tree t1 = gimple_signed_type (t);
    2888              : 
    2889              :       /* t1 == t can happen for boolean nodes which are always unsigned.  */
    2890       597851 :       if (t1 != t)
    2891       597851 :         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      1312848 :   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     54932287 : gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data)
    2912              : {
    2913     54932287 :   bitmap addresses_taken = (bitmap)data;
    2914     54932287 :   addr = get_base_address (addr);
    2915     54932287 :   if (addr
    2916     54932287 :       && DECL_P (addr))
    2917              :     {
    2918     34847942 :       bitmap_set_bit (addresses_taken, DECL_UID (addr));
    2919     34847942 :       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    892352927 : gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt)
    2930              : {
    2931    892352927 :   return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
    2932    892352927 :                                         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    288992641 : gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
    2941              : {
    2942    288992641 :   gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
    2943              : 
    2944    288992641 :   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
    2945    286618440 :     if (tree decl = builtin_decl_explicit (DECL_FUNCTION_CODE (fndecl)))
    2946    288992641 :       fndecl = decl;
    2947              : 
    2948    288992641 :   tree ret = gimple_call_lhs (stmt);
    2949    288992641 :   if (ret
    2950    465566870 :       && !useless_type_conversion_p (TREE_TYPE (ret),
    2951    176574229 :                                      TREE_TYPE (TREE_TYPE (fndecl))))
    2952              :     return false;
    2953              : 
    2954    288970658 :   tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
    2955    288970658 :   unsigned nargs = gimple_call_num_args (stmt);
    2956   1185632413 :   for (unsigned i = 0; i < nargs; ++i)
    2957              :     {
    2958              :       /* Variadic args follow.  */
    2959    640857354 :       if (!targs)
    2960              :         return true;
    2961    612711507 :       tree arg = gimple_call_arg (stmt, i);
    2962    612711507 :       tree type = TREE_VALUE (targs);
    2963    612711507 :       if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
    2964              :         return false;
    2965    607691097 :       targs = TREE_CHAIN (targs);
    2966              :     }
    2967    510788241 :   if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
    2968         7153 :     return false;
    2969              :   return true;
    2970              : }
    2971              : 
    2972              : /* Return true when STMT is operator a replaceable delete call.  */
    2973              : 
    2974              : bool
    2975      2689536 : gimple_call_operator_delete_p (const gcall *stmt)
    2976              : {
    2977      2689536 :   tree fndecl;
    2978              : 
    2979      2689536 :   if ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE)
    2980      2689536 :     return DECL_IS_OPERATOR_DELETE_P (fndecl);
    2981              :   return false;
    2982              : }
    2983              : 
    2984              : /* Return true when STMT is builtins call.  */
    2985              : 
    2986              : bool
    2987     70765625 : gimple_call_builtin_p (const gimple *stmt)
    2988              : {
    2989     70765625 :   tree fndecl;
    2990     70765625 :   if (is_gimple_call (stmt)
    2991     22239886 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    2992     91744459 :       && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
    2993      4945078 :     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   1040193780 : gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
    3001              : {
    3002   1040193780 :   tree fndecl;
    3003   1040193780 :   if (is_gimple_call (stmt)
    3004    790129719 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    3005   1792746028 :       && DECL_BUILT_IN_CLASS (fndecl) == klass)
    3006    194888006 :     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   3129775866 : gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
    3014              : {
    3015   3129775866 :   tree fndecl;
    3016   3129775866 :   if (is_gimple_call (stmt)
    3017    895731181 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    3018   3982219628 :       && fndecl_built_in_p (fndecl, code))
    3019      2650275 :     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    184215142 : gimple_call_combined_fn (const gimple *stmt)
    3029              : {
    3030    184215142 :   if (const gcall *call = dyn_cast <const gcall *> (stmt))
    3031              :     {
    3032    184004601 :       if (gimple_call_internal_p (call))
    3033      8769475 :         return as_combined_fn (gimple_call_internal_fn (call));
    3034              : 
    3035    175235126 :       tree fndecl = gimple_call_fndecl (stmt);
    3036    175235126 :       if (fndecl
    3037    169047649 :           && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
    3038    244300360 :           && gimple_builtin_call_types_compatible_p (stmt, fndecl))
    3039     68506193 :         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     10743968 : gimple_asm_clobbers_memory_p (const gasm *stmt)
    3049              : {
    3050     10743968 :   unsigned i;
    3051              : 
    3052     14807602 :   for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
    3053              :     {
    3054      8404051 :       tree op = gimple_asm_clobber_op (stmt, i);
    3055      8404051 :       if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
    3056              :         return true;
    3057              :     }
    3058              : 
    3059              :   /* Non-empty basic ASM implicitly clobbers memory.  */
    3060      6403551 :   if (gimple_asm_basic_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
    3061        77437 :     return true;
    3062              : 
    3063              :   return false;
    3064              : }
    3065              : 
    3066              : /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE.  */
    3067              : 
    3068              : void
    3069         5338 : dump_decl_set (FILE *file, bitmap set)
    3070              : {
    3071         5338 :   if (set)
    3072              :     {
    3073         5338 :       bitmap_iterator bi;
    3074         5338 :       unsigned i;
    3075              : 
    3076         5338 :       fprintf (file, "{ ");
    3077              : 
    3078        22230 :       EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
    3079              :         {
    3080        16892 :           fprintf (file, "D.%u", i);
    3081        16892 :           fprintf (file, " ");
    3082              :         }
    3083              : 
    3084         5338 :       fprintf (file, "}");
    3085              :     }
    3086              :   else
    3087            0 :     fprintf (file, "NIL");
    3088         5338 : }
    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     10109727 : nonfreeing_call_p (gimple *call)
    3094              : {
    3095     10109727 :   if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
    3096     10109727 :       && gimple_call_flags (call) & ECF_LEAF)
    3097      4419688 :     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      4218973 :         default:
    3108      4218973 :           return true;
    3109              :       }
    3110      5690039 :   else if (gimple_call_internal_p (call))
    3111       772019 :     switch (gimple_call_internal_fn (call))
    3112              :       {
    3113              :       case IFN_ABNORMAL_DISPATCHER:
    3114              :         return true;
    3115        35671 :       case IFN_ASAN_MARK:
    3116        35671 :         return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
    3117       730342 :       default:
    3118       730342 :         if (gimple_call_flags (call) & ECF_LEAF)
    3119              :           return true;
    3120       148466 :         return false;
    3121              :       }
    3122              : 
    3123      4918020 :   tree fndecl = gimple_call_fndecl (call);
    3124      4918020 :   if (!fndecl)
    3125              :     return false;
    3126      4756516 :   struct cgraph_node *n = cgraph_node::get (fndecl);
    3127      4756516 :   if (!n)
    3128              :     return false;
    3129      4755137 :   enum availability availability;
    3130      4755137 :   n = n->function_symbol (&availability);
    3131      4755137 :   if (!n || availability <= AVAIL_INTERPOSABLE)
    3132              :     return false;
    3133      1151402 :   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      1664538 : nonbarrier_call_p (gimple *call)
    3140              : {
    3141      1664538 :   if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
    3142       650626 :     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     77681290 : check_loadstore (gimple *stmt, tree op, tree, void *data)
    3157              : {
    3158    155362580 :   if (TREE_CODE (op) == MEM_REF
    3159     77681290 :       || (TREE_CODE (op) == TARGET_MEM_REF
    3160      1376241 :           && !TMR_INDEX2 (op)
    3161      1359771 :           && (!TMR_INDEX (op)
    3162       659390 :               || (TMR_STEP (op)
    3163       592620 :                   && expr_not_equal_to (TMR_STEP (op),
    3164     78273910 :                                         wi::one (TYPE_PRECISION (TREE_TYPE
    3165              :                                                         (TMR_STEP (op)))),
    3166              :                                         stmt)))))
    3167              :     {
    3168              :       /* Some address spaces may legitimately dereference zero.  */
    3169     40209080 :       addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
    3170     40209080 :       if (targetm.addr_space.zero_address_valid (as))
    3171              :         return false;
    3172              : 
    3173     40207976 :       return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
    3174              :     }
    3175              :   return false;
    3176              : }
    3177              : 
    3178              : 
    3179              : /* Return true if OP can be inferred to be non-NULL after STMT executes,
    3180              :    either by using a pointer dereference or attributes.  */
    3181              : bool
    3182            0 : infer_nonnull_range (gimple *stmt, tree op)
    3183              : {
    3184            0 :   return (infer_nonnull_range_by_dereference (stmt, op)
    3185            0 :           || infer_nonnull_range_by_attribute (stmt, op));
    3186              : }
    3187              : 
    3188              : /* Return true if OP can be inferred to be non-NULL after STMT
    3189              :    executes by using a pointer dereference.  */
    3190              : bool
    3191    347448475 : infer_nonnull_range_by_dereference (gimple *stmt, tree op)
    3192              : {
    3193              :   /* We can only assume that a pointer dereference will yield
    3194              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3195    347448475 :   if (!flag_delete_null_pointer_checks
    3196    347234865 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3197    347234865 :       || gimple_code (stmt) == GIMPLE_ASM
    3198    694255936 :       || gimple_clobber_p (stmt))
    3199              :     return false;
    3200              : 
    3201    339523773 :   if (walk_stmt_load_store_ops (stmt, (void *)op,
    3202              :                                 check_loadstore, check_loadstore))
    3203              :     return true;
    3204              : 
    3205              :   return false;
    3206              : }
    3207              : 
    3208              : /* Return true if OP can be inferred to be a non-NULL after STMT
    3209              :    executes by using attributes.  If OP2 and OP3 are non-NULL and
    3210              :    nonnull_if_nonzero is the only attribute implying OP being non-NULL
    3211              :    and the corresponding argument(s) aren't non-zero INTEGER_CST, set *OP2
    3212              :    and *OP3 to the corresponding arguments and return true (in that case
    3213              :    returning true doesn't mean OP can be unconditionally inferred to be
    3214              :    non-NULL, but conditionally).  */
    3215              : bool
    3216     79190397 : infer_nonnull_range_by_attribute (gimple *stmt, tree op, tree *op2, tree *op3)
    3217              : {
    3218     79190397 :   if (op2)
    3219              :     {
    3220         3934 :       *op2 = NULL_TREE;
    3221         3934 :       *op3 = NULL_TREE;
    3222              :     }
    3223              : 
    3224              :   /* We can only assume that a pointer dereference will yield
    3225              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3226     79190397 :   if (!flag_delete_null_pointer_checks
    3227     79161720 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3228    158352117 :       || gimple_code (stmt) == GIMPLE_ASM)
    3229              :     return false;
    3230              : 
    3231     79111116 :   if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
    3232              :     {
    3233      4507296 :       tree fntype = gimple_call_fntype (stmt);
    3234      4507296 :       tree attrs = TYPE_ATTRIBUTES (fntype);
    3235      4604820 :       for (; attrs; attrs = TREE_CHAIN (attrs))
    3236              :         {
    3237      1176096 :           attrs = lookup_attribute ("nonnull", attrs);
    3238              : 
    3239              :           /* If "nonnull" wasn't specified, we know nothing about
    3240              :              the argument, unless "nonnull_if_nonzero" attribute is
    3241              :              present.  */
    3242      1176096 :           if (attrs == NULL_TREE)
    3243              :             break;
    3244              : 
    3245              :           /* If "nonnull" applies to all the arguments, then ARG
    3246              :              is non-null if it's in the argument list.  */
    3247       256880 :           if (TREE_VALUE (attrs) == NULL_TREE)
    3248              :             {
    3249       462623 :               for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
    3250              :                 {
    3251       312155 :                   if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
    3252       304479 :                       && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
    3253              :                     return true;
    3254              :                 }
    3255              :               return false;
    3256              :             }
    3257              : 
    3258              :           /* Now see if op appears in the nonnull list.  */
    3259       245839 :           for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
    3260              :             {
    3261       148315 :               unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
    3262       148315 :               if (idx < gimple_call_num_args (stmt))
    3263              :                 {
    3264       148314 :                   tree arg = gimple_call_arg (stmt, idx);
    3265       148314 :                   if (operand_equal_p (op, arg, 0))
    3266              :                     return true;
    3267              :                 }
    3268              :             }
    3269              :         }
    3270              : 
    3271      4347940 :       for (attrs = TYPE_ATTRIBUTES (fntype);
    3272      4552686 :            (attrs = lookup_attribute ("nonnull_if_nonzero", attrs));
    3273       204746 :            attrs = TREE_CHAIN (attrs))
    3274              :         {
    3275       205550 :           tree args = TREE_VALUE (attrs);
    3276       205550 :           unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (args)) - 1;
    3277       205550 :           unsigned int idx2
    3278       205550 :             = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args))) - 1;
    3279       205550 :           unsigned int idx3 = idx2;
    3280       205550 :           if (tree chain2 = TREE_CHAIN (TREE_CHAIN (args)))
    3281         4328 :             idx3 = TREE_INT_CST_LOW (TREE_VALUE (chain2)) - 1;
    3282       205550 :           if (idx < gimple_call_num_args (stmt)
    3283       205538 :               && idx2 < gimple_call_num_args (stmt)
    3284       205527 :               && idx3 < gimple_call_num_args (stmt)
    3285       411077 :               && operand_equal_p (op, gimple_call_arg (stmt, idx), 0))
    3286              :             {
    3287          804 :               tree arg2 = gimple_call_arg (stmt, idx2);
    3288          804 :               tree arg3 = gimple_call_arg (stmt, idx3);
    3289         1608 :               if (!INTEGRAL_TYPE_P (TREE_TYPE (arg2))
    3290         1608 :                   || !INTEGRAL_TYPE_P (TREE_TYPE (arg3)))
    3291              :                 return false;
    3292          804 :               if (integer_nonzerop (arg2) && integer_nonzerop (arg3))
    3293              :                 return true;
    3294          582 :               if (integer_zerop (arg2) || integer_zerop (arg3))
    3295              :                 return false;
    3296          492 :               if (op2)
    3297              :                 {
    3298              :                   /* This case is meant for ubsan instrumentation.
    3299              :                      The caller can check at runtime if *OP2 and *OP3 are
    3300              :                      non-zero and OP is null.  */
    3301          132 :                   *op2 = arg2;
    3302          132 :                   *op3 = arg3;
    3303          132 :                   return true;
    3304              :                 }
    3305          360 :               return tree_expr_nonzero_p (arg2) && tree_expr_nonzero_p (arg3);
    3306              :             }
    3307              :         }
    3308              :     }
    3309              : 
    3310              :   /* If this function is marked as returning non-null, then we can
    3311              :      infer OP is non-null if it is used in the return statement.  */
    3312     78950956 :   if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
    3313       964528 :     if (gimple_return_retval (return_stmt)
    3314       555196 :         && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
    3315      1057327 :         && lookup_attribute ("returns_nonnull",
    3316        92799 :                              TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
    3317              :       return true;
    3318              : 
    3319              :   return false;
    3320              : }
    3321              : 
    3322              : /* Compare two case labels.  Because the front end should already have
    3323              :    made sure that case ranges do not overlap, it is enough to only compare
    3324              :    the CASE_LOW values of each case label.  */
    3325              : 
    3326              : static int
    3327     43754010 : compare_case_labels (const void *p1, const void *p2)
    3328              : {
    3329     43754010 :   const_tree const case1 = *(const_tree const*)p1;
    3330     43754010 :   const_tree const case2 = *(const_tree const*)p2;
    3331              : 
    3332              :   /* The 'default' case label always goes first.  */
    3333     43754010 :   if (!CASE_LOW (case1))
    3334              :     return -1;
    3335     43754010 :   else if (!CASE_LOW (case2))
    3336              :     return 1;
    3337              :   else
    3338     43754010 :     return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
    3339              : }
    3340              : 
    3341              : /* Sort the case labels in LABEL_VEC in place in ascending order.  */
    3342              : 
    3343              : void
    3344        70110 : sort_case_labels (vec<tree> &label_vec)
    3345              : {
    3346        70110 :   label_vec.qsort (compare_case_labels);
    3347        70110 : }
    3348              : 
    3349              : /* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
    3350              : 
    3351              :    LABELS is a vector that contains all case labels to look at.
    3352              : 
    3353              :    INDEX_TYPE is the type of the switch index expression.  Case labels
    3354              :    in LABELS are discarded if their values are not in the value range
    3355              :    covered by INDEX_TYPE.  The remaining case label values are folded
    3356              :    to INDEX_TYPE.
    3357              : 
    3358              :    If a default case exists in LABELS, it is removed from LABELS and
    3359              :    returned in DEFAULT_CASEP.  If no default case exists, but the
    3360              :    case labels already cover the whole range of INDEX_TYPE, a default
    3361              :    case is returned pointing to one of the existing case labels.
    3362              :    Otherwise DEFAULT_CASEP is set to NULL_TREE.
    3363              : 
    3364              :    DEFAULT_CASEP may be NULL, in which case the above comment doesn't
    3365              :    apply and no action is taken regardless of whether a default case is
    3366              :    found or not.  */
    3367              : 
    3368              : void
    3369        61957 : preprocess_case_label_vec_for_gimple (vec<tree> &labels,
    3370              :                                       tree index_type,
    3371              :                                       tree *default_casep)
    3372              : {
    3373        61957 :   tree min_value, max_value;
    3374        61957 :   tree default_case = NULL_TREE;
    3375        61957 :   size_t i, len;
    3376              : 
    3377        61957 :   i = 0;
    3378        61957 :   min_value = TYPE_MIN_VALUE (index_type);
    3379        61957 :   max_value = TYPE_MAX_VALUE (index_type);
    3380      1152751 :   while (i < labels.length ())
    3381              :     {
    3382      1090794 :       tree elt = labels[i];
    3383      1090794 :       tree low = CASE_LOW (elt);
    3384      1090794 :       tree high = CASE_HIGH (elt);
    3385      1090794 :       bool remove_element = false;
    3386              : 
    3387      1090794 :       if (low)
    3388              :         {
    3389      1055514 :           gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
    3390      1055514 :           gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
    3391              : 
    3392              :           /* This is a non-default case label, i.e. it has a value.
    3393              : 
    3394              :              See if the case label is reachable within the range of
    3395              :              the index type.  Remove out-of-range case values.  Turn
    3396              :              case ranges into a canonical form (high > low strictly)
    3397              :              and convert the case label values to the index type.
    3398              : 
    3399              :              NB: The type of gimple_switch_index() may be the promoted
    3400              :              type, but the case labels retain the original type.  */
    3401              : 
    3402        12789 :           if (high)
    3403              :             {
    3404              :               /* This is a case range.  Discard empty ranges.
    3405              :                  If the bounds or the range are equal, turn this
    3406              :                  into a simple (one-value) case.  */
    3407        12789 :               int cmp = tree_int_cst_compare (high, low);
    3408        12789 :               if (cmp < 0)
    3409              :                 remove_element = true;
    3410        12789 :               else if (cmp == 0)
    3411              :                 high = NULL_TREE;
    3412              :             }
    3413              : 
    3414      1044365 :           if (! high)
    3415              :             {
    3416              :               /* If the simple case value is unreachable, ignore it.  */
    3417      1053874 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3418      1053874 :                    && tree_int_cst_compare (low, min_value) < 0)
    3419      2107705 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3420      1053831 :                       && tree_int_cst_compare (low, max_value) > 0))
    3421              :                 remove_element = true;
    3422              :               else
    3423      1053713 :                 low = fold_convert (index_type, low);
    3424              :             }
    3425              :           else
    3426              :             {
    3427              :               /* If the entire case range is unreachable, ignore it.  */
    3428         1640 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3429         1640 :                    && tree_int_cst_compare (high, min_value) < 0)
    3430         3268 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3431         1628 :                       && tree_int_cst_compare (low, max_value) > 0))
    3432              :                 remove_element = true;
    3433              :               else
    3434              :                 {
    3435              :                   /* If the lower bound is less than the index type's
    3436              :                      minimum value, truncate the range bounds.  */
    3437         1628 :                   if (TREE_CODE (min_value) == INTEGER_CST
    3438         1628 :                       && tree_int_cst_compare (low, min_value) < 0)
    3439              :                     low = min_value;
    3440         1628 :                   low = fold_convert (index_type, low);
    3441              : 
    3442              :                   /* If the upper bound is greater than the index type's
    3443              :                      maximum value, truncate the range bounds.  */
    3444         1628 :                   if (TREE_CODE (max_value) == INTEGER_CST
    3445         1628 :                       && tree_int_cst_compare (high, max_value) > 0)
    3446              :                     high = max_value;
    3447         1628 :                   high = fold_convert (index_type, high);
    3448              : 
    3449              :                   /* We may have folded a case range to a one-value case.  */
    3450         1628 :                   if (tree_int_cst_equal (low, high))
    3451            0 :                     high = NULL_TREE;
    3452              :                 }
    3453              :             }
    3454              : 
    3455      1055514 :           CASE_LOW (elt) = low;
    3456      1055514 :           CASE_HIGH (elt) = high;
    3457              :         }
    3458              :       else
    3459              :         {
    3460        35280 :           gcc_assert (!default_case);
    3461        35280 :           default_case = elt;
    3462              :           /* The default case must be passed separately to the
    3463              :              gimple_build_switch routine.  But if DEFAULT_CASEP
    3464              :              is NULL, we do not remove the default case (it would
    3465              :              be completely lost).  */
    3466        35280 :           if (default_casep)
    3467              :             remove_element = true;
    3468              :         }
    3469              : 
    3470      1055514 :       if (remove_element)
    3471        35453 :         labels.ordered_remove (i);
    3472              :       else
    3473      1055341 :         i++;
    3474              :     }
    3475        61957 :   len = i;
    3476              : 
    3477        61957 :   if (!labels.is_empty ())
    3478        61077 :     sort_case_labels (labels);
    3479              : 
    3480        61957 :   if (default_casep && !default_case)
    3481              :     {
    3482              :       /* If the switch has no default label, add one, so that we jump
    3483              :          around the switch body.  If the labels already cover the whole
    3484              :          range of the switch index_type, add the default label pointing
    3485              :          to one of the existing labels.  */
    3486        14964 :       if (len
    3487        14483 :           && TYPE_MIN_VALUE (index_type)
    3488        14483 :           && TYPE_MAX_VALUE (index_type)
    3489        29447 :           && tree_int_cst_equal (CASE_LOW (labels[0]),
    3490        14483 :                                  TYPE_MIN_VALUE (index_type)))
    3491              :         {
    3492         4354 :           tree low, high = CASE_HIGH (labels[len - 1]);
    3493         4354 :           if (!high)
    3494         4311 :             high = CASE_LOW (labels[len - 1]);
    3495         4354 :           if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
    3496              :             {
    3497           62 :               tree widest_label = labels[0];
    3498          131 :               for (i = 1; i < len; i++)
    3499              :                 {
    3500           83 :                   high = CASE_LOW (labels[i]);
    3501           83 :                   low = CASE_HIGH (labels[i - 1]);
    3502           83 :                   if (!low)
    3503           53 :                     low = CASE_LOW (labels[i - 1]);
    3504              : 
    3505           83 :                   if (CASE_HIGH (labels[i]) != NULL_TREE
    3506          114 :                       && (CASE_HIGH (widest_label) == NULL_TREE
    3507           26 :                           || (wi::gtu_p
    3508           52 :                               (wi::to_wide (CASE_HIGH (labels[i]))
    3509           78 :                                - wi::to_wide (CASE_LOW (labels[i])),
    3510           26 :                                wi::to_wide (CASE_HIGH (widest_label))
    3511          161 :                                - wi::to_wide (CASE_LOW (widest_label))))))
    3512           17 :                     widest_label = labels[i];
    3513              : 
    3514           83 :                   if (wi::to_wide (low) + 1 != wi::to_wide (high))
    3515              :                     break;
    3516              :                 }
    3517           62 :               if (i == len)
    3518              :                 {
    3519              :                   /* Designate the label with the widest range to be the
    3520              :                      default label.  */
    3521           48 :                   tree label = CASE_LABEL (widest_label);
    3522           48 :                   default_case = build_case_label (NULL_TREE, NULL_TREE,
    3523              :                                                    label);
    3524              :                 }
    3525              :             }
    3526              :         }
    3527              :     }
    3528              : 
    3529        61957 :   if (default_casep)
    3530        50244 :     *default_casep = default_case;
    3531        61957 : }
    3532              : 
    3533              : /* Set the location of all statements in SEQ to LOC.  */
    3534              : 
    3535              : void
    3536      1026643 : gimple_seq_set_location (gimple_seq seq, location_t loc)
    3537              : {
    3538      2083439 :   for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
    3539      1056796 :     gimple_set_location (gsi_stmt (i), loc);
    3540      1026643 : }
    3541              : 
    3542              : /* Release SSA_NAMEs in SEQ as well as the GIMPLE statements.  */
    3543              : 
    3544              : void
    3545    807726030 : gimple_seq_discard (gimple_seq seq)
    3546              : {
    3547    807726030 :   gimple_stmt_iterator gsi;
    3548              : 
    3549    808310521 :   for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
    3550              :     {
    3551       395029 :       gimple *stmt = gsi_stmt (gsi);
    3552       395029 :       gsi_remove (&gsi, true);
    3553       395029 :       release_defs (stmt);
    3554       395029 :       ggc_free (stmt);
    3555              :     }
    3556    807726030 : }
    3557              : 
    3558              : /* See if STMT now calls function that takes no parameters and if so, drop
    3559              :    call arguments.  This is used when devirtualization machinery redirects
    3560              :    to __builtin_unreachable or __cxa_pure_virtual.  */
    3561              : 
    3562              : void
    3563      1177712 : maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
    3564              : {
    3565      1177712 :   tree decl = gimple_call_fndecl (stmt);
    3566      1177712 :   if (TYPE_ARG_TYPES (TREE_TYPE (decl))
    3567      1176874 :       && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
    3568      1415559 :       && gimple_call_num_args (stmt))
    3569              :     {
    3570       120937 :       gimple_set_num_ops (stmt, 3);
    3571       120937 :       update_stmt_fn (fn, stmt);
    3572              :     }
    3573      1177712 : }
    3574              : 
    3575              : /* Return false if STMT will likely expand to real function call.  */
    3576              : 
    3577              : bool
    3578      3390310 : gimple_inexpensive_call_p (gcall *stmt)
    3579              : {
    3580      3390310 :   if (gimple_call_internal_p (stmt))
    3581              :     return true;
    3582      3333111 :   tree decl = gimple_call_fndecl (stmt);
    3583      3333111 :   if (decl && is_inexpensive_builtin (decl))
    3584              :     return true;
    3585              :   return false;
    3586              : }
    3587              : 
    3588              : /* Return a non-artificial location for STMT.  If STMT does not have
    3589              :    location information, get the location from EXPR.  */
    3590              : 
    3591              : location_t
    3592       122820 : gimple_or_expr_nonartificial_location (gimple *stmt, tree expr)
    3593              : {
    3594       122820 :   location_t loc = gimple_nonartificial_location (stmt);
    3595       122820 :   if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr))
    3596           46 :     loc = tree_nonartificial_location (expr);
    3597       122820 :   return expansion_point_location_if_in_system_header (loc);
    3598              : }
    3599              : 
    3600              : 
    3601              : #if CHECKING_P
    3602              : 
    3603              : namespace selftest {
    3604              : 
    3605              : /* Selftests for core gimple structures.  */
    3606              : 
    3607              : /* Verify that STMT is pretty-printed as EXPECTED.
    3608              :    Helper function for selftests.  */
    3609              : 
    3610              : static void
    3611           20 : verify_gimple_pp (const char *expected, gimple *stmt)
    3612              : {
    3613           20 :   pretty_printer pp;
    3614           20 :   pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
    3615           20 :   ASSERT_STREQ (expected, pp_formatted_text (&pp));
    3616           20 : }
    3617              : 
    3618              : /* Build a GIMPLE_ASSIGN equivalent to
    3619              :      tmp = 5;
    3620              :    and verify various properties of it.  */
    3621              : 
    3622              : static void
    3623            4 : test_assign_single ()
    3624              : {
    3625            4 :   tree type = integer_type_node;
    3626            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3627              :                          get_identifier ("tmp"),
    3628              :                          type);
    3629            4 :   tree rhs = build_int_cst (type, 5);
    3630            4 :   gassign *stmt = gimple_build_assign (lhs, rhs);
    3631            4 :   verify_gimple_pp ("tmp = 5;", stmt);
    3632              : 
    3633            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3634            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3635            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3636            4 :   ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
    3637            4 :   ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
    3638            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3639            4 :   ASSERT_TRUE (gimple_assign_single_p (stmt));
    3640            8 :   ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
    3641            4 : }
    3642              : 
    3643              : /* Build a GIMPLE_ASSIGN equivalent to
    3644              :      tmp = a * b;
    3645              :    and verify various properties of it.  */
    3646              : 
    3647              : static void
    3648            4 : test_assign_binop ()
    3649              : {
    3650            4 :   tree type = integer_type_node;
    3651            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3652              :                          get_identifier ("tmp"),
    3653              :                          type);
    3654            4 :   tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3655              :                        get_identifier ("a"),
    3656              :                        type);
    3657            4 :   tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3658              :                        get_identifier ("b"),
    3659              :                        type);
    3660            4 :   gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
    3661            4 :   verify_gimple_pp ("tmp = a * b;", stmt);
    3662              : 
    3663            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3664            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3665            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3666            4 :   ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
    3667            8 :   ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
    3668            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3669            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3670            4 :   ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
    3671            4 : }
    3672              : 
    3673              : /* Build a GIMPLE_NOP and verify various properties of it.  */
    3674              : 
    3675              : static void
    3676            4 : test_nop_stmt ()
    3677              : {
    3678            4 :   gimple *stmt = gimple_build_nop ();
    3679            4 :   verify_gimple_pp ("GIMPLE_NOP", stmt);
    3680            4 :   ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
    3681            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3682            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3683            4 : }
    3684              : 
    3685              : /* Build a GIMPLE_RETURN equivalent to
    3686              :      return 7;
    3687              :    and verify various properties of it.  */
    3688              : 
    3689              : static void
    3690            4 : test_return_stmt ()
    3691              : {
    3692            4 :   tree type = integer_type_node;
    3693            4 :   tree val = build_int_cst (type, 7);
    3694            4 :   greturn *stmt = gimple_build_return (val);
    3695            4 :   verify_gimple_pp ("return 7;", stmt);
    3696              : 
    3697            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3698            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3699            4 :   ASSERT_EQ (val, gimple_return_retval (stmt));
    3700            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3701            4 : }
    3702              : 
    3703              : /* Build a GIMPLE_RETURN equivalent to
    3704              :      return;
    3705              :    and verify various properties of it.  */
    3706              : 
    3707              : static void
    3708            4 : test_return_without_value ()
    3709              : {
    3710            4 :   greturn *stmt = gimple_build_return (NULL);
    3711            4 :   verify_gimple_pp ("return;", stmt);
    3712              : 
    3713            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3714            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3715            4 :   ASSERT_EQ (NULL, gimple_return_retval (stmt));
    3716            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3717            4 : }
    3718              : 
    3719              : /* Run all of the selftests within this file.  */
    3720              : 
    3721              : void
    3722            4 : gimple_cc_tests ()
    3723              : {
    3724            4 :   test_assign_single ();
    3725            4 :   test_assign_binop ();
    3726            4 :   test_nop_stmt ();
    3727            4 :   test_return_stmt ();
    3728            4 :   test_return_without_value ();
    3729            4 : }
    3730              : 
    3731              : } // namespace selftest
    3732              : 
    3733              : 
    3734              : #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.