LCOV - code coverage report
Current view: top level - gcc - gimple.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 87.1 % 1563 1361
Test Date: 2026-07-11 15:47:05 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    331867076 : gimple_set_code (gimple *g, enum gimple_code code)
     134              : {
     135    331867076 :   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    404970738 : gimple_size (enum gimple_code code, unsigned num_ops)
     143              : {
     144    404970738 :   size_t size = gsstruct_code_size[gss_for_code (code)];
     145    404970738 :   if (num_ops > 0)
     146    278003329 :     size += (sizeof (tree) * (num_ops - 1));
     147    404970738 :   return size;
     148              : }
     149              : 
     150              : /* Initialize GIMPLE statement G with CODE and NUM_OPS.  */
     151              : 
     152              : void
     153    331867076 : gimple_init (gimple *g, enum gimple_code code, unsigned num_ops)
     154              : {
     155    331867076 :   gimple_set_code (g, code);
     156    331867076 :   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    331867076 :   g->modified = 1;
     161    331867076 :   gimple_init_singleton (g);
     162    331867076 : }
     163              : 
     164              : /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS
     165              :    operands.  */
     166              : 
     167              : gimple *
     168    329466540 : gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL)
     169              : {
     170    329466540 :   size_t size;
     171    329466540 :   gimple *stmt;
     172              : 
     173    329466540 :   size = gimple_size (code, num_ops);
     174    329466540 :   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    329466540 :   stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT);
     182    329466540 :   gimple_init (stmt, code, num_ops);
     183    329466540 :   return stmt;
     184              : }
     185              : 
     186              : /* Set SUBCODE to be the code of the expression computed by statement G.  */
     187              : 
     188              : static inline void
     189    236303668 : 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    236303668 :   gcc_assert (subcode < (1 << 16));
     194    236303668 :   g->subcode = subcode;
     195    236303668 : }
     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    225600660 : 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    225600660 :   gimple_set_subcode (s, subcode);
     212              : 
     213    225600660 :   return s;
     214              : }
     215              : 
     216              : 
     217              : /* Build a GIMPLE_RETURN statement returning RETVAL.  */
     218              : 
     219              : greturn *
     220      3655963 : gimple_build_return (tree retval)
     221              : {
     222      3655963 :   greturn *s
     223      3655963 :     = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK,
     224              :                                                2));
     225      3655963 :   if (retval)
     226      2210294 :     gimple_return_set_retval (s, retval);
     227      3655963 :   return s;
     228              : }
     229              : 
     230              : /* Reset alias information on call S.  */
     231              : 
     232              : void
     233     18639392 : gimple_call_reset_alias_info (gcall *s)
     234              : {
     235     18639392 :   if (gimple_call_flags (s) & ECF_CONST)
     236      2382757 :     memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution));
     237              :   else
     238     16256635 :     pt_solution_reset (gimple_call_use_set (s));
     239     18639392 :   if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS))
     240      3626494 :     memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution));
     241              :   else
     242     15012898 :     pt_solution_reset (gimple_call_clobber_set (s));
     243     18639392 : }
     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     12215033 : gimple_build_call_1 (tree fn, unsigned nargs)
     252              : {
     253     12215033 :   gcall *s
     254     24430066 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     255              :                                              nargs + 3));
     256     12215033 :   if (TREE_CODE (fn) == FUNCTION_DECL)
     257     11996507 :     fn = build_fold_addr_expr (fn);
     258     12215033 :   gimple_set_op (s, 1, fn);
     259     12215033 :   gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn)));
     260     12215033 :   gimple_call_reset_alias_info (s);
     261     12215033 :   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       771914 : gimple_build_call_vec (tree fn, const vec<tree> &args)
     270              : {
     271       771914 :   unsigned i;
     272       771914 :   unsigned nargs = args.length ();
     273       771914 :   gcall *call = gimple_build_call_1 (fn, nargs);
     274              : 
     275      3397115 :   for (i = 0; i < nargs; i++)
     276      1853287 :     gimple_call_set_arg (call, i, args[i]);
     277              : 
     278       771914 :   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       625170 : gimple_build_call (tree fn, unsigned nargs, ...)
     287              : {
     288       625170 :   va_list ap;
     289       625170 :   gcall *call;
     290       625170 :   unsigned i;
     291              : 
     292       625170 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     293              : 
     294       625170 :   call = gimple_build_call_1 (fn, nargs);
     295              : 
     296       625170 :   va_start (ap, nargs);
     297      1295761 :   for (i = 0; i < nargs; i++)
     298       670591 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     299       625170 :   va_end (ap);
     300              : 
     301       625170 :   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         2456 : gimple_build_call_valist (tree fn, unsigned nargs, va_list ap)
     310              : {
     311         2456 :   gcall *call;
     312         2456 :   unsigned i;
     313              : 
     314         2456 :   gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn));
     315              : 
     316         2456 :   call = gimple_build_call_1 (fn, nargs);
     317              : 
     318        11963 :   for (i = 0; i < nargs; i++)
     319         7051 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     320              : 
     321         2456 :   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       864269 : gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs)
     331              : {
     332       864269 :   gcall *s
     333      1728538 :     = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK,
     334              :                                              nargs + 3));
     335       864269 :   s->subcode |= GF_CALL_INTERNAL;
     336       864269 :   gimple_call_set_internal_fn (s, fn);
     337       864269 :   gimple_call_reset_alias_info (s);
     338       864269 :   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       481057 : gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...)
     347              : {
     348       481057 :   va_list ap;
     349       481057 :   gcall *call;
     350       481057 :   unsigned i;
     351              : 
     352       481057 :   call = gimple_build_call_internal_1 (fn, nargs);
     353       481057 :   va_start (ap, nargs);
     354      1933991 :   for (i = 0; i < nargs; i++)
     355      1452934 :     gimple_call_set_arg (call, i, va_arg (ap, tree));
     356       481057 :   va_end (ap);
     357              : 
     358       481057 :   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       383199 : gimple_build_call_internal_vec (enum internal_fn fn, const vec<tree> &args)
     367              : {
     368       383199 :   unsigned i, nargs;
     369       383199 :   gcall *call;
     370              : 
     371       383199 :   nargs = args.length ();
     372       383199 :   call = gimple_build_call_internal_1 (fn, nargs);
     373      1907756 :   for (i = 0; i < nargs; i++)
     374      1141358 :     gimple_call_set_arg (call, i, args[i]);
     375              : 
     376       383199 :   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     10815506 : gimple_build_call_from_tree (tree t, tree fnptrtype)
     386              : {
     387     10815506 :   unsigned i, nargs;
     388     10815506 :   gcall *call;
     389              : 
     390     10815506 :   gcc_assert (TREE_CODE (t) == CALL_EXPR);
     391              : 
     392     10815506 :   nargs = call_expr_nargs (t);
     393              : 
     394     10815506 :   tree fndecl = NULL_TREE;
     395     10815506 :   if (CALL_EXPR_FN (t) == NULL_TREE)
     396           13 :     call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs);
     397              :   else
     398              :     {
     399     10815493 :       fndecl = get_callee_fndecl (t);
     400     10978123 :       call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs);
     401              :     }
     402              : 
     403     30197165 :   for (i = 0; i < nargs; i++)
     404     19381659 :     gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i));
     405              : 
     406     10815506 :   gimple_set_block (call, TREE_BLOCK (t));
     407     10815506 :   gimple_set_location (call, EXPR_LOCATION (t));
     408              : 
     409              :   /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL.  */
     410     10815506 :   gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t));
     411     10815506 :   gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t));
     412     10815506 :   gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t));
     413     10815506 :   gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t));
     414     10815506 :   if (fndecl
     415     10652863 :       && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
     416     13106200 :       && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl)))
     417        41650 :     gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t));
     418     10773856 :   else if (fndecl
     419     21385069 :            && (DECL_IS_OPERATOR_NEW_P (fndecl)
     420     10555215 :                || DECL_IS_OPERATOR_DELETE_P (fndecl)))
     421       133429 :     gimple_call_set_from_new_or_delete (call, CALL_FROM_NEW_OR_DELETE_P (t));
     422              :   else
     423     10640427 :     gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t));
     424     10815506 :   gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t));
     425     10815506 :   gimple_call_set_nothrow (call, TREE_NOTHROW (t));
     426     10815506 :   if (fndecl)
     427     32121232 :     gimple_call_set_expected_throw (call,
     428     10652863 :                                     flags_from_decl_or_type (fndecl)
     429     10652863 :                                     & ECF_XTHROW);
     430     10815506 :   gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t));
     431     10815506 :   copy_warning (call, t);
     432              : 
     433     10815506 :   if (fnptrtype)
     434              :     {
     435     10815371 :       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     10815371 :       if (!fndecl)
     441              :         {
     442       162508 :           gcc_assert (POINTER_TYPE_P (fnptrtype));
     443       162508 :           tree fntype = TREE_TYPE (fnptrtype);
     444              : 
     445       162508 :           if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype)))
     446           21 :             gimple_call_set_nocf_check (call, true);
     447              :         }
     448              :     }
     449              : 
     450     10815506 :   return call;
     451              : }
     452              : 
     453              : /* Build a gcall to __builtin_unreachable as rewritten by
     454              :    -fsanitize=unreachable.  */
     455              : 
     456              : gcall *
     457       182495 : gimple_build_builtin_unreachable (location_t loc)
     458              : {
     459       182495 :   tree data = NULL_TREE;
     460       182495 :   tree fn = sanitize_unreachable_fn (&data, loc);
     461       182495 :   gcall *g = gimple_build_call (fn, data != NULL_TREE, data);
     462       182495 :   gimple_call_set_ctrl_altering (g, true);
     463       182495 :   gimple_set_location (g, loc);
     464       182495 :   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     88574374 : gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL)
     474              : {
     475     88574374 :   enum tree_code subcode;
     476     88574374 :   tree op1, op2, op3;
     477              : 
     478     88574374 :   extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3);
     479     88574374 :   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     94932710 : gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1,
     488              :                        tree op2, tree op3 MEM_STAT_DECL)
     489              : {
     490     94932710 :   unsigned num_ops;
     491     94932710 :   gassign *p;
     492              : 
     493              :   /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the
     494              :      code).  */
     495     94932710 :   num_ops = get_gimple_rhs_num_ops (subcode) + 1;
     496              : 
     497    189865420 :   p = as_a <gassign *> (
     498              :         gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops
     499              :                                     PASS_MEM_STAT));
     500     94932710 :   gimple_assign_set_lhs (p, lhs);
     501              :   /* For COND_EXPR, op1 should not be a comparison. */
     502     94932710 :   if (op1 && subcode == COND_EXPR)
     503       285857 :     gcc_assert (!COMPARISON_CLASS_P  (op1));
     504     94932710 :   gimple_assign_set_rhs1 (p, op1);
     505     94932710 :   if (op2)
     506              :     {
     507     14972728 :       gcc_assert (num_ops > 2);
     508     14972728 :       gimple_assign_set_rhs2 (p, op2);
     509              :     }
     510              : 
     511     94932710 :   if (op3)
     512              :     {
     513       401372 :       gcc_assert (num_ops > 3);
     514       401372 :       gimple_assign_set_rhs3 (p, op3);
     515              :     }
     516              : 
     517     94932710 :   return p;
     518              : }
     519              : 
     520              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands
     521              :    OP1, OP2 and OP3.  */
     522              : 
     523              : gassign *
     524     89951171 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     525              :                      tree op2, tree op3 MEM_STAT_DECL)
     526              : {
     527     89951171 :   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      3492679 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1,
     535              :                      tree op2 MEM_STAT_DECL)
     536              : {
     537      3492679 :   return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE
     538      3492679 :                                 PASS_MEM_STAT);
     539              : }
     540              : 
     541              : /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1.  */
     542              : 
     543              : gassign *
     544      1488860 : gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL)
     545              : {
     546      1488860 :   return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE
     547      1488860 :                                 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     10827222 : gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs,
     559              :                    tree t_label, tree f_label)
     560              : {
     561     10827222 :   gcond *p;
     562              : 
     563     10827222 :   gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison);
     564     21654444 :   p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4));
     565     10827222 :   gimple_cond_set_lhs (p, lhs);
     566     10827222 :   gimple_cond_set_rhs (p, rhs);
     567     10827222 :   gimple_cond_set_true_label (p, t_label);
     568     10827222 :   gimple_cond_set_false_label (p, f_label);
     569     10827222 :   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       102291 : gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label)
     577              : {
     578       102291 :   enum tree_code code;
     579       102291 :   tree lhs, rhs;
     580              : 
     581       102291 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     582       102291 :   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       433702 : gimple_cond_set_condition_from_tree (gcond *stmt, tree cond)
     590              : {
     591       433702 :   enum tree_code code;
     592       433702 :   tree lhs, rhs;
     593              : 
     594       433702 :   gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs);
     595       433702 :   gimple_cond_set_condition (stmt, code, lhs, rhs);
     596       433702 : }
     597              : 
     598              : /* Build a GIMPLE_LABEL statement for LABEL.  */
     599              : 
     600              : glabel *
     601     19466683 : gimple_build_label (tree label)
     602              : {
     603     19466683 :   glabel *p
     604     19466683 :     = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1));
     605     19466683 :   gimple_label_set_label (p, label);
     606     19466683 :   return p;
     607              : }
     608              : 
     609              : /* Build a GIMPLE_GOTO statement to label DEST.  */
     610              : 
     611              : ggoto *
     612      7138898 : gimple_build_goto (tree dest)
     613              : {
     614      7138898 :   ggoto *p
     615      7138898 :     = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1));
     616      7138898 :   gimple_goto_set_dest (p, dest);
     617      7138898 :   return p;
     618              : }
     619              : 
     620              : 
     621              : /* Build a GIMPLE_NOP statement.  */
     622              : 
     623              : gimple *
     624     15675693 : gimple_build_nop (void)
     625              : {
     626     15675693 :   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      7508706 : gimple_build_bind (tree vars, gimple_seq body, tree block)
     636              : {
     637      7508706 :   gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0));
     638      7508706 :   gimple_bind_set_vars (p, vars);
     639      7508706 :   if (body)
     640      1358409 :     gimple_bind_set_body (p, body);
     641      7508706 :   if (block)
     642      6003845 :     gimple_bind_set_block (p, block);
     643      7508706 :   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       102832 : gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs,
     656              :                     unsigned nclobbers, unsigned nlabels)
     657              : {
     658       102832 :   gasm *p;
     659       102832 :   int size = strlen (string);
     660              : 
     661       102832 :   p = as_a <gasm *> (
     662       102832 :         gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK,
     663              :                                ninputs + noutputs + nclobbers + nlabels));
     664              : 
     665       102832 :   p->ni = ninputs;
     666       102832 :   p->no = noutputs;
     667       102832 :   p->nc = nclobbers;
     668       102832 :   p->nl = nlabels;
     669       102832 :   p->string = ggc_alloc_string (string, size);
     670              : 
     671       102832 :   if (GATHER_STATISTICS)
     672              :     gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size;
     673              : 
     674       102832 :   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       102832 : 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       102832 :   gasm *p;
     694       102832 :   unsigned i;
     695              : 
     696       202101 :   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       333169 :   for (i = 0; i < vec_safe_length (inputs); i++)
     703        47045 :     gimple_asm_set_input_op (p, i, (*inputs)[i]);
     704              : 
     705       264378 :   for (i = 0; i < vec_safe_length (outputs); i++)
     706        65540 :     gimple_asm_set_output_op (p, i, (*outputs)[i]);
     707              : 
     708       362010 :   for (i = 0; i < vec_safe_length (clobbers); i++)
     709        95467 :     gimple_asm_set_clobber_op (p, i, (*clobbers)[i]);
     710              : 
     711       103730 :   for (i = 0; i < vec_safe_length (labels); i++)
     712          898 :     gimple_asm_set_label_op (p, i, (*labels)[i]);
     713              : 
     714       102832 :   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        40814 : gimple_build_catch (tree types, gimple_seq handler)
     724              : {
     725        40814 :   gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0));
     726        40814 :   gimple_catch_set_types (p, types);
     727        40814 :   if (handler)
     728        40802 :     gimple_catch_set_handler (p, handler);
     729              : 
     730        40814 :   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         5832 : gimple_build_eh_filter (tree types, gimple_seq failure)
     740              : {
     741         5832 :   geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0));
     742         5832 :   gimple_eh_filter_set_types (p, types);
     743         5832 :   if (failure)
     744         5832 :     gimple_eh_filter_set_failure (p, failure);
     745              : 
     746         5832 :   return p;
     747              : }
     748              : 
     749              : /* Build a GIMPLE_EH_MUST_NOT_THROW statement.  */
     750              : 
     751              : geh_mnt *
     752      1340776 : gimple_build_eh_must_not_throw (tree decl)
     753              : {
     754      1340776 :   geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0));
     755              : 
     756      1340776 :   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
     757      1340776 :   gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN);
     758      1340776 :   gimple_eh_must_not_throw_set_fndecl (p, decl);
     759              : 
     760      1340776 :   return p;
     761              : }
     762              : 
     763              : /* Build a GIMPLE_EH_ELSE statement.  */
     764              : 
     765              : geh_else *
     766          498 : gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body)
     767              : {
     768          498 :   geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0));
     769          498 :   gimple_eh_else_set_n_body (p, n_body);
     770          498 :   gimple_eh_else_set_e_body (p, e_body);
     771          498 :   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      3264002 : gimple_build_try (gimple_seq eval, gimple_seq cleanup,
     783              :                   enum gimple_try_flags kind)
     784              : {
     785      3264002 :   gtry *p;
     786              : 
     787      3264002 :   gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY);
     788      3264002 :   p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0));
     789      3264002 :   gimple_set_subcode (p, kind);
     790      3264002 :   if (eval)
     791      3171160 :     gimple_try_set_eval (p, eval);
     792      3264002 :   if (cleanup)
     793      3264002 :     gimple_try_set_cleanup (p, cleanup);
     794              : 
     795      3264002 :   return p;
     796              : }
     797              : 
     798              : /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement.
     799              : 
     800              :    CLEANUP is the cleanup expression.  */
     801              : 
     802              : gimple *
     803       652329 : gimple_build_wce (gimple_seq cleanup)
     804              : {
     805       652329 :   gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0);
     806       652329 :   if (cleanup)
     807       652329 :     gimple_wce_set_cleanup (p, cleanup);
     808              : 
     809       652329 :   return p;
     810              : }
     811              : 
     812              : 
     813              : /* Build a GIMPLE_RESX statement.  */
     814              : 
     815              : gresx *
     816       942812 : gimple_build_resx (int region)
     817              : {
     818       942812 :   gresx *p
     819       942812 :     = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0));
     820       942812 :   p->region = region;
     821       942812 :   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        66827 : gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label)
     832              : {
     833              :   /* nlabels + 1 default label + 1 index.  */
     834        66827 :   gcc_checking_assert (default_label);
     835       133654 :   gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH,
     836              :                                                         ERROR_MARK,
     837              :                                                         1 + 1 + nlabels));
     838        66827 :   gimple_switch_set_index (p, index);
     839        66827 :   gimple_switch_set_default_label (p, default_label);
     840        66827 :   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        66827 : gimple_build_switch (tree index, tree default_label, const vec<tree> &args)
     851              : {
     852        66827 :   unsigned i, nlabels = args.length ();
     853              : 
     854        66827 :   gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label);
     855              : 
     856              :   /* Copy the labels from the vector to the switch statement.  */
     857      1223808 :   for (i = 0; i < nlabels; i++)
     858      1090154 :     gimple_switch_set_label (p, i + 1, args[i]);
     859              : 
     860        66827 :   return p;
     861              : }
     862              : 
     863              : /* Build a GIMPLE_EH_DISPATCH statement.  */
     864              : 
     865              : geh_dispatch *
     866        42600 : gimple_build_eh_dispatch (int region)
     867              : {
     868        42600 :   geh_dispatch *p
     869        42600 :     = as_a <geh_dispatch *> (
     870              :         gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0));
     871        42600 :   p->region = region;
     872        42600 :   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     68028565 : gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL)
     881              : {
     882     68028565 :   gdebug *p
     883     68028565 :     = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG,
     884              :                                                    (unsigned)GIMPLE_DEBUG_BIND, 2
     885              :                                                    PASS_MEM_STAT));
     886     68028565 :   gimple_debug_bind_set_var (p, var);
     887     68028565 :   gimple_debug_bind_set_value (p, value);
     888     68028565 :   if (stmt)
     889     67031897 :     gimple_set_location (p, gimple_location (stmt));
     890              : 
     891     68028565 :   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       727643 : gimple_build_debug_source_bind (tree var, tree value,
     901              :                                      gimple *stmt MEM_STAT_DECL)
     902              : {
     903       727643 :   gdebug *p
     904       727643 :     = as_a <gdebug *> (
     905              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     906              :                                     (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2
     907              :                                     PASS_MEM_STAT));
     908              : 
     909       727643 :   gimple_debug_source_bind_set_var (p, var);
     910       727643 :   gimple_debug_source_bind_set_value (p, value);
     911       727643 :   if (stmt)
     912       576801 :     gimple_set_location (p, gimple_location (stmt));
     913              : 
     914       727643 :   return p;
     915              : }
     916              : 
     917              : 
     918              : /* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at
     919              :    LOCATION.  */
     920              : 
     921              : gdebug *
     922      2497979 : gimple_build_debug_begin_stmt (tree block, location_t location
     923              :                                     MEM_STAT_DECL)
     924              : {
     925      2497979 :   gdebug *p
     926      2497979 :     = as_a <gdebug *> (
     927              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     928              :                                     (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0
     929              :                                     PASS_MEM_STAT));
     930              : 
     931      2497979 :   gimple_set_location (p, location);
     932      2497979 :   gimple_set_block (p, block);
     933      2497979 :   cfun->debug_marker_count++;
     934              : 
     935      2497979 :   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      4090624 : gimple_build_debug_inline_entry (tree block, location_t location
     944              :                                       MEM_STAT_DECL)
     945              : {
     946      4090624 :   gdebug *p
     947      4090624 :     = as_a <gdebug *> (
     948              :         gimple_build_with_ops_stat (GIMPLE_DEBUG,
     949              :                                     (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0
     950              :                                     PASS_MEM_STAT));
     951              : 
     952      4090624 :   gimple_set_location (p, location);
     953      4090624 :   gimple_set_block (p, block);
     954      4090624 :   cfun->debug_marker_count++;
     955              : 
     956      4090624 :   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        53336 : gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse,
     989              :                       gimple_seq pre_body)
     990              : {
     991        53336 :   gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0));
     992        53336 :   if (body)
     993        49481 :     gimple_omp_set_body (p, body);
     994        53336 :   gimple_omp_for_set_clauses (p, clauses);
     995        53336 :   gimple_omp_for_set_kind (p, kind);
     996        53336 :   p->collapse = collapse;
     997        53336 :   p->iter =  ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse);
     998              : 
     999        53336 :   if (pre_body)
    1000         3571 :     gimple_omp_for_set_pre_body (p, pre_body);
    1001              : 
    1002        53336 :   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        18435 : gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn,
    1015              :                            tree data_arg)
    1016              : {
    1017        18435 :   gomp_parallel *p
    1018        18435 :     = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0));
    1019        18435 :   if (body)
    1020        18239 :     gimple_omp_set_body (p, body);
    1021        18435 :   gimple_omp_parallel_set_clauses (p, clauses);
    1022        18435 :   gimple_omp_parallel_set_child_fn (p, child_fn);
    1023        18435 :   gimple_omp_parallel_set_data_arg (p, data_arg);
    1024              : 
    1025        18435 :   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         5406 : 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         5406 :   gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0));
    1044         5406 :   if (body)
    1045         5313 :     gimple_omp_set_body (p, body);
    1046         5406 :   gimple_omp_task_set_clauses (p, clauses);
    1047         5406 :   gimple_omp_task_set_child_fn (p, child_fn);
    1048         5406 :   gimple_omp_task_set_data_arg (p, data_arg);
    1049         5406 :   gimple_omp_task_set_copy_fn (p, copy_fn);
    1050         5406 :   gimple_omp_task_set_arg_size (p, arg_size);
    1051         5406 :   gimple_omp_task_set_arg_align (p, arg_align);
    1052              : 
    1053         5406 :   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        51781 : gimple_build_omp_continue (tree control_def, tree control_use)
    1141              : {
    1142        51781 :   gomp_continue *p
    1143        51781 :     = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0));
    1144        51781 :   gimple_omp_continue_set_control_def (p, control_def);
    1145        51781 :   gimple_omp_continue_set_control_use (p, control_use);
    1146        51781 :   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       101665 : gimple_build_omp_return (bool wait_p)
    1173              : {
    1174       101665 :   gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0);
    1175       101665 :   if (wait_p)
    1176        37714 :     gimple_omp_return_set_nowait (p);
    1177              : 
    1178       101665 :   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         1292 : gimple_build_omp_scan (gimple_seq body, tree clauses)
    1190              : {
    1191         1292 :   gomp_scan *p
    1192         1292 :     = as_a <gomp_scan *> (gimple_alloc (GIMPLE_OMP_SCAN, 0));
    1193         1292 :   gimple_omp_scan_set_clauses (p, clauses);
    1194         1292 :   if (body)
    1195         1078 :     gimple_omp_set_body (p, body);
    1196              : 
    1197         1292 :   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          226 : gimple_build_omp_scope (gimple_seq body, tree clauses)
    1256              : {
    1257          226 :   gimple *p = gimple_alloc (GIMPLE_OMP_SCOPE, 0);
    1258          226 :   gimple_omp_scope_set_clauses (p, clauses);
    1259          226 :   if (body)
    1260          168 :     gimple_omp_set_body (p, body);
    1261              : 
    1262          226 :   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        43023 : gimple_build_omp_target (gimple_seq body, int kind, tree clauses,
    1304              :                          gimple_seq iterator_loops)
    1305              : {
    1306        43023 :   gomp_target *p
    1307        43023 :     = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0));
    1308        43023 :   if (body)
    1309        29291 :     gimple_omp_set_body (p, body);
    1310        43023 :   gimple_omp_target_set_clauses (p, clauses);
    1311        43023 :   gimple_omp_target_set_kind (p, kind);
    1312        43023 :   gimple_omp_target_set_iterator_loops (p, iterator_loops);
    1313              : 
    1314        43023 :   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         8818 : gimple_build_omp_teams (gimple_seq body, tree clauses)
    1325              : {
    1326         8818 :   gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0));
    1327         8818 :   if (body)
    1328         8818 :     gimple_omp_set_body (p, body);
    1329         8818 :   gimple_omp_teams_set_clauses (p, clauses);
    1330              : 
    1331         8818 :   return p;
    1332              : }
    1333              : 
    1334              : 
    1335              : /* Build a GIMPLE_OMP_ATOMIC_LOAD statement.  */
    1336              : 
    1337              : gomp_atomic_load *
    1338        10253 : gimple_build_omp_atomic_load (tree lhs, tree rhs, enum omp_memory_order mo)
    1339              : {
    1340        10253 :   gomp_atomic_load *p
    1341        10253 :     = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0));
    1342        10253 :   gimple_omp_atomic_load_set_lhs (p, lhs);
    1343        10253 :   gimple_omp_atomic_load_set_rhs (p, rhs);
    1344        10253 :   gimple_omp_atomic_set_memory_order (p, mo);
    1345        10253 :   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        10253 : gimple_build_omp_atomic_store (tree val, enum omp_memory_order mo)
    1354              : {
    1355        10253 :   gomp_atomic_store *p
    1356        10253 :     = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0));
    1357        10253 :   gimple_omp_atomic_store_set_val (p, val);
    1358        10253 :   gimple_omp_atomic_set_memory_order (p, mo);
    1359        10253 :   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     47028792 : gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs)
    1413              : {
    1414     47028792 :   gimple_stmt_iterator si;
    1415     47028792 :   if (gs == NULL)
    1416            0 :     return;
    1417              : 
    1418     47028792 :   si = gsi_last (*seq_p);
    1419     47028792 :   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    194374521 : gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs)
    1430              : {
    1431    194374521 :   gimple_stmt_iterator si;
    1432              : 
    1433    194374521 :   if (gs == NULL)
    1434            0 :     return;
    1435              : 
    1436    194374521 :   si = gsi_last (*seq_p);
    1437    194374521 :   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     17088325 : gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src)
    1445              : {
    1446     17088325 :   gimple_stmt_iterator si;
    1447     17088325 :   if (src == NULL)
    1448      5203490 :     return;
    1449              : 
    1450     11884835 :   si = gsi_last (*dst_p);
    1451     11884835 :   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       278362 : gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src)
    1460              : {
    1461       278362 :   gimple_stmt_iterator si;
    1462       278362 :   if (src == NULL)
    1463        93210 :     return;
    1464              : 
    1465       185152 :   si = gsi_last (*dst_p);
    1466       185152 :   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    267875130 : 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    267875130 :   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    678727022 : annotate_one_with_location (gimple *gs, location_t location)
    1487              : {
    1488    678727022 :   if (!gimple_has_location (gs)
    1489    337474322 :       && !gimple_do_not_emit_location_p (gs)
    1490    678727022 :       && should_carry_location_p (gs))
    1491     26149008 :     gimple_set_location (gs, location);
    1492    678727022 : }
    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    100155396 : annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi,
    1500              :                                   location_t location)
    1501              : {
    1502    100155396 :   if (gsi_end_p (gsi))
    1503     34624592 :     gsi = gsi_start (seq);
    1504              :   else
    1505     65530804 :     gsi_next (&gsi);
    1506              : 
    1507    778530329 :   for (; !gsi_end_p (gsi); gsi_next (&gsi))
    1508    678374933 :     annotate_one_with_location (gsi_stmt (gsi), location);
    1509    100155396 : }
    1510              : 
    1511              : /* Set the location for all the statements in a sequence STMT_P to LOCATION.  */
    1512              : 
    1513              : void
    1514       227743 : annotate_all_with_location (gimple_seq stmt_p, location_t location)
    1515              : {
    1516       227743 :   gimple_stmt_iterator i;
    1517              : 
    1518       227743 :   if (gimple_seq_empty_p (stmt_p))
    1519       227743 :     return;
    1520              : 
    1521       572140 :   for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i))
    1522              :     {
    1523       352089 :       gimple *gs = gsi_stmt (i);
    1524       352089 :       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        36531 : empty_stmt_p (gimple *stmt)
    1533              : {
    1534        36531 :   if (gimple_code (stmt) == GIMPLE_NOP)
    1535              :     return true;
    1536        36529 :   if (gbind *bind_stmt = dyn_cast <gbind *> (stmt))
    1537        21659 :     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        36608 : empty_body_p (gimple_seq body)
    1546              : {
    1547        36608 :   gimple_stmt_iterator i;
    1548              : 
    1549        36608 :   if (gimple_seq_empty_p (body))
    1550              :     return true;
    1551        36714 :   for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i))
    1552        36531 :     if (!empty_stmt_p (gsi_stmt (i))
    1553        36531 :         && !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      1874352 : gimple_seq_copy (gimple_seq src)
    1564              : {
    1565      1874352 :   gimple_stmt_iterator gsi;
    1566      1874352 :   gimple_seq new_seq = NULL;
    1567      1874352 :   gimple *stmt;
    1568              : 
    1569      4210005 :   for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi))
    1570              :     {
    1571      2335653 :       stmt = gimple_copy (gsi_stmt (gsi));
    1572      2335653 :       gimple_seq_add_stmt (&new_seq, stmt);
    1573              :     }
    1574              : 
    1575      1874352 :   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      1017935 : gimple_call_same_target_p (const gimple *c1, const gimple *c2)
    1584              : {
    1585      1017935 :   if (gimple_call_internal_p (c1))
    1586         8138 :     return (gimple_call_internal_p (c2)
    1587         8138 :             && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2)
    1588        16276 :             && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1))
    1589            0 :                 || c1 == c2));
    1590              :   else
    1591      1009797 :     return (gimple_call_fn (c1) == gimple_call_fn (c2)
    1592      1009797 :             || (gimple_call_fndecl (c1)
    1593      1009156 :                 && 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   4300110265 : gimple_call_flags (const gimple *stmt)
    1601              : {
    1602   4300110265 :   int flags = 0;
    1603              : 
    1604   4300110265 :   if (gimple_call_internal_p (stmt))
    1605    122398106 :     flags = internal_fn_flags (gimple_call_internal_fn (stmt));
    1606              :   else
    1607              :     {
    1608   4177712159 :       tree decl = gimple_call_fndecl (stmt);
    1609   4177712159 :       if (decl)
    1610   4053369663 :         flags = flags_from_decl_or_type (decl);
    1611   4177712159 :       flags |= flags_from_decl_or_type (gimple_call_fntype (stmt));
    1612              :     }
    1613              : 
    1614   4300110265 :   if (stmt->subcode & GF_CALL_NOTHROW)
    1615    756938463 :     flags |= ECF_NOTHROW;
    1616   4300110265 :   if (stmt->subcode & GF_CALL_XTHROW)
    1617     14523694 :     flags |= ECF_XTHROW;
    1618              : 
    1619   4300110265 :   if (stmt->subcode & GF_CALL_BY_DESCRIPTOR)
    1620            0 :     flags |= ECF_BY_DESCRIPTOR;
    1621              : 
    1622   4300110265 :   return flags;
    1623              : }
    1624              : 
    1625              : /* Return the "fn spec" string for call STMT.  */
    1626              : 
    1627              : attr_fnspec
    1628    445081708 : gimple_call_fnspec (const gcall *stmt)
    1629              : {
    1630    445081708 :   tree type, attr;
    1631              : 
    1632    445081708 :   if (gimple_call_internal_p (stmt))
    1633              :     {
    1634      9556521 :       const_tree spec = internal_fn_fnspec (gimple_call_internal_fn (stmt));
    1635      9556521 :       if (spec)
    1636       390979 :         return spec;
    1637              :       else
    1638      9165542 :         return "";
    1639              :     }
    1640              : 
    1641    435525187 :   type = gimple_call_fntype (stmt);
    1642    435525187 :   if (type)
    1643              :     {
    1644    435525187 :       attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type));
    1645    435525187 :       if (attr)
    1646     61087273 :         return TREE_VALUE (TREE_VALUE (attr));
    1647              :     }
    1648    374437914 :   if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
    1649    110713502 :     return builtin_fnspec (gimple_call_fndecl (stmt));
    1650    263724412 :   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    263724412 :   if (fndecl
    1655    249727148 :       && DECL_IS_OPERATOR_DELETE_P (fndecl)
    1656      7544626 :       && DECL_IS_REPLACEABLE_OPERATOR (fndecl)
    1657    271264515 :       && gimple_call_from_new_or_delete (stmt))
    1658              :     {
    1659      7484584 :       if (flag_assume_sane_operators_new_delete)
    1660      7483312 :         return ".co ";
    1661              :       else
    1662         1272 :         return ". o ";
    1663              :     }
    1664              :   /* Similarly operator new can be treated as malloc.  */
    1665    256239828 :   if (fndecl
    1666    242242564 :       && DECL_IS_REPLACEABLE_OPERATOR_NEW_P (fndecl)
    1667    259200799 :       && gimple_call_from_new_or_delete (stmt))
    1668              :     {
    1669      2926142 :       if (flag_assume_sane_operators_new_delete)
    1670      2925154 :         return "mC";
    1671              :       else
    1672          988 :         return "m ";
    1673              :     }
    1674    253313686 :   return "";
    1675              : }
    1676              : 
    1677              : /* Detects argument flags for argument number ARG on call STMT.  */
    1678              : 
    1679              : int
    1680    124953110 : gimple_call_arg_flags (const gcall *stmt, unsigned arg)
    1681              : {
    1682    124953110 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1683    124953110 :   int flags = 0;
    1684              : 
    1685    124953110 :   if (fnspec.known_p ())
    1686     23986711 :     flags = fnspec.arg_eaf_flags (arg);
    1687    124953110 :   tree callee = gimple_call_fndecl (stmt);
    1688    124953110 :   if (callee)
    1689              :     {
    1690    116971411 :       cgraph_node *node = cgraph_node::get (callee);
    1691    116971411 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1692              :                                 : NULL;
    1693              : 
    1694    116757085 :       if (summary && summary->arg_flags.length () > arg)
    1695              :         {
    1696     23263089 :           int modref_flags = summary->arg_flags[arg];
    1697              : 
    1698              :           /* We have possibly optimized out load.  Be conservative here.  */
    1699     23263089 :           if (!node->binds_to_current_def_p ())
    1700     11436720 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1701     23263089 :           if (dbg_cnt (ipa_mod_ref_pta))
    1702     23263089 :             flags |= modref_flags;
    1703              :         }
    1704              :     }
    1705    124953110 :   return flags;
    1706              : }
    1707              : 
    1708              : /* Detects argument flags for return slot on call STMT.  */
    1709              : 
    1710              : int
    1711        96207 : gimple_call_retslot_flags (const gcall *stmt)
    1712              : {
    1713        96207 :   int flags = implicit_retslot_eaf_flags;
    1714              : 
    1715        96207 :   tree callee = gimple_call_fndecl (stmt);
    1716        96207 :   if (callee)
    1717              :     {
    1718        87481 :       cgraph_node *node = cgraph_node::get (callee);
    1719        87481 :       modref_summary *summary = node ? get_modref_function_summary (node)
    1720              :                                 : NULL;
    1721              : 
    1722        87481 :       if (summary)
    1723              :         {
    1724        60938 :           int modref_flags = summary->retslot_flags;
    1725              : 
    1726              :           /* We have possibly optimized out load.  Be conservative here.  */
    1727        60938 :           if (!node->binds_to_current_def_p ())
    1728        51392 :             modref_flags = interposable_eaf_flags (modref_flags, flags);
    1729        60938 :           if (dbg_cnt (ipa_mod_ref_pta))
    1730        60938 :             flags |= modref_flags;
    1731              :         }
    1732              :     }
    1733        96207 :   return flags;
    1734              : }
    1735              : 
    1736              : /* Detects argument flags for static chain on call STMT.  */
    1737              : 
    1738              : int
    1739       180327 : gimple_call_static_chain_flags (const gcall *stmt)
    1740              : {
    1741       180327 :   int flags = 0;
    1742              : 
    1743       180327 :   tree callee = gimple_call_fndecl (stmt);
    1744       180327 :   if (callee)
    1745              :     {
    1746        27872 :       cgraph_node *node = cgraph_node::get (callee);
    1747        27872 :       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        27872 :       gcc_checking_assert (node->binds_to_current_def_p ());
    1753        27872 :       if (summary)
    1754              :         {
    1755        26038 :           int modref_flags = summary->static_chain_flags;
    1756              : 
    1757        26038 :           if (dbg_cnt (ipa_mod_ref_pta))
    1758       180327 :             flags |= modref_flags;
    1759              :         }
    1760              :     }
    1761       180327 :   return flags;
    1762              : }
    1763              : 
    1764              : /* Detects return flags for the call STMT.  */
    1765              : 
    1766              : int
    1767     48268890 : gimple_call_return_flags (const gcall *stmt)
    1768              : {
    1769     48268890 :   if (gimple_call_flags (stmt) & ECF_MALLOC)
    1770              :     return ERF_NOALIAS;
    1771              : 
    1772     46335355 :   attr_fnspec fnspec = gimple_call_fnspec (stmt);
    1773              : 
    1774     46335355 :   unsigned int arg_no;
    1775     46335355 :   if (fnspec.returns_arg (&arg_no))
    1776      1115711 :     return ERF_RETURNS_ARG | arg_no;
    1777              : 
    1778     45219644 :   if (fnspec.returns_noalias_p ())
    1779              :     return ERF_NOALIAS;
    1780              :   return 0;
    1781              : }
    1782              : 
    1783              : 
    1784              : /* Return true if call STMT is known to return a non-zero result.  */
    1785              : 
    1786              : bool
    1787     12632706 : gimple_call_nonnull_result_p (gcall *call)
    1788              : {
    1789     12632706 :   tree fndecl = gimple_call_fndecl (call);
    1790     12632706 :   if (!fndecl)
    1791              :     return false;
    1792     11477966 :   if (flag_delete_null_pointer_checks && !flag_check_new
    1793     11477911 :       && DECL_IS_OPERATOR_NEW_P (fndecl)
    1794     12011221 :       && !TREE_NOTHROW (fndecl))
    1795              :     return true;
    1796              : 
    1797              :   /* References are always non-NULL.  */
    1798     10959908 :   if (flag_delete_null_pointer_checks
    1799     10959908 :       && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE)
    1800              :     return true;
    1801              : 
    1802     10959908 :   if (flag_delete_null_pointer_checks
    1803     21913557 :       && lookup_attribute ("returns_nonnull",
    1804     10953649 :                            TYPE_ATTRIBUTES (gimple_call_fntype (call))))
    1805              :     return true;
    1806     10896319 :   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     11981742 : gimple_call_nonnull_arg (gcall *call)
    1814              : {
    1815     11981742 :   tree fndecl = gimple_call_fndecl (call);
    1816     11981742 :   if (!fndecl)
    1817              :     return NULL_TREE;
    1818              : 
    1819     10833261 :   unsigned rf = gimple_call_return_flags (call);
    1820     10833261 :   if (rf & ERF_RETURNS_ARG)
    1821              :     {
    1822            0 :       unsigned argnum = rf & ERF_RETURN_ARG_MASK;
    1823            0 :       if (argnum < gimple_call_num_args (call))
    1824              :         {
    1825            0 :           tree arg = gimple_call_arg (call, argnum);
    1826            0 :           if (SSA_VAR_P (arg)
    1827            0 :               && infer_nonnull_range_by_attribute (call, arg))
    1828              :             return arg;
    1829              :         }
    1830              :     }
    1831              :   return NULL_TREE;
    1832              : }
    1833              : 
    1834              : 
    1835              : /* Return true if GS is a copy assignment.  */
    1836              : 
    1837              : bool
    1838    202111042 : gimple_assign_copy_p (gimple *gs)
    1839              : {
    1840    202111042 :   return (gimple_assign_single_p (gs)
    1841    202111042 :           && 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     40643440 : gimple_assign_ssa_name_copy_p (gimple *gs)
    1849              : {
    1850     40643440 :   return (gimple_assign_single_p (gs)
    1851     23011407 :           && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME
    1852     54039502 :           && 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        46629 : gimple_assign_unary_nop_p (gimple *gs)
    1872              : {
    1873        46629 :   return (is_gimple_assign (gs)
    1874        46629 :           && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs))
    1875        41394 :               || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR)
    1876         5235 :           && gimple_assign_rhs1 (gs) != error_mark_node
    1877        57099 :           && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs)))
    1878         5235 :               == 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    578893154 : gimple_assign_load_p (const gimple *gs)
    1885              : {
    1886    578893154 :   tree rhs;
    1887    578893154 :   if (!gimple_assign_single_p (gs))
    1888              :     return false;
    1889    345170230 :   rhs = gimple_assign_rhs1 (gs);
    1890    345170230 :   if (TREE_CODE (rhs) == WITH_SIZE_EXPR)
    1891              :     return true;
    1892    345170226 :   if (handled_component_p (rhs))
    1893     95211028 :     rhs = TREE_OPERAND (rhs, 0);
    1894    345170226 :   return (handled_component_p (rhs)
    1895    317411797 :           || DECL_P (rhs)
    1896    257370939 :           || TREE_CODE (rhs) == MEM_REF
    1897    189574820 :           || TREE_CODE (rhs) == TARGET_MEM_REF);
    1898              : }
    1899              : 
    1900              : 
    1901              : /* Set BB to be the basic block holding G.  */
    1902              : 
    1903              : void
    1904    740899044 : gimple_set_bb (gimple *stmt, basic_block bb)
    1905              : {
    1906    740899044 :   stmt->bb = bb;
    1907              : 
    1908    740899044 :   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     38814843 :   if (cfun->cfg)
    1914              :     {
    1915     38814729 :       tree t;
    1916     38814729 :       int uid;
    1917              : 
    1918     38814729 :       t = gimple_label_label (as_a <glabel *> (stmt));
    1919     38814729 :       uid = LABEL_DECL_UID (t);
    1920     38814729 :       if (uid == -1)
    1921              :         {
    1922     19789513 :           unsigned old_len =
    1923     19789513 :             vec_safe_length (label_to_block_map_for_fn (cfun));
    1924     19789513 :           LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++;
    1925     19789513 :           if (old_len <= (unsigned) uid)
    1926      9369191 :             vec_safe_grow_cleared (label_to_block_map_for_fn (cfun), uid + 1);
    1927              :         }
    1928              : 
    1929     38814729 :       (*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      4806193 : gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr)
    1953              : {
    1954      4806193 :   enum tree_code subcode;
    1955      4806193 :   tree op1, op2, op3;
    1956              : 
    1957      4806193 :   extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3);
    1958      4806193 :   gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3);
    1959      4806193 : }
    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      7439006 : gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code,
    1970              :                                 tree op1, tree op2, tree op3)
    1971              : {
    1972      7439006 :   unsigned new_rhs_ops = get_gimple_rhs_num_ops (code);
    1973      7439006 :   gimple *stmt = gsi_stmt (*gsi);
    1974      7439006 :   gimple *old_stmt = stmt;
    1975              : 
    1976              :   /* If the new CODE needs more operands, allocate a new statement.  */
    1977      7439006 :   if (gimple_num_ops (stmt) < new_rhs_ops + 1)
    1978              :     {
    1979       203726 :       tree lhs = gimple_assign_lhs (old_stmt);
    1980       203726 :       stmt = gimple_alloc (gimple_code (old_stmt), new_rhs_ops + 1);
    1981       203726 :       memcpy (stmt, old_stmt, gimple_size (gimple_code (old_stmt)));
    1982       203726 :       gimple_init_singleton (stmt);
    1983              : 
    1984              :       /* The LHS needs to be reset as this also changes the SSA name
    1985              :          on the LHS.  */
    1986       203726 :       gimple_assign_set_lhs (stmt, lhs);
    1987              :     }
    1988              : 
    1989      7439006 :   gimple_set_num_ops (stmt, new_rhs_ops + 1);
    1990      7439006 :   gimple_set_subcode (stmt, code);
    1991      7439006 :   gimple_assign_set_rhs1 (stmt, op1);
    1992      7439006 :   if (new_rhs_ops > 1)
    1993      1162675 :     gimple_assign_set_rhs2 (stmt, op2);
    1994      1162675 :   if (new_rhs_ops > 2)
    1995        35988 :     gimple_assign_set_rhs3 (stmt, op3);
    1996      7439006 :   if (stmt != old_stmt)
    1997       203726 :     gsi_replace (gsi, stmt, false);
    1998      7439006 : }
    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   7115353290 : gimple_get_lhs (const gimple *stmt)
    2008              : {
    2009   7115353290 :   enum gimple_code code = gimple_code (stmt);
    2010              : 
    2011   7115353290 :   if (code == GIMPLE_ASSIGN)
    2012   4481088969 :     return gimple_assign_lhs (stmt);
    2013   2634264321 :   else if (code == GIMPLE_CALL)
    2014    511004498 :     return gimple_call_lhs (stmt);
    2015   2123259823 :   else if (code == GIMPLE_PHI)
    2016    127001657 :     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      2247910 : gimple_set_lhs (gimple *stmt, tree lhs)
    2027              : {
    2028      2247910 :   enum gimple_code code = gimple_code (stmt);
    2029              : 
    2030      2247910 :   if (code == GIMPLE_ASSIGN)
    2031      1066019 :     gimple_assign_set_lhs (stmt, lhs);
    2032      1181891 :   else if (code == GIMPLE_CALL)
    2033      1181891 :     gimple_call_set_lhs (stmt, lhs);
    2034              :   else
    2035            0 :     gcc_unreachable ();
    2036      2247910 : }
    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     72899936 : gimple_copy (gimple *stmt)
    2046              : {
    2047     72899936 :   enum gimple_code code = gimple_code (stmt);
    2048     72899936 :   unsigned num_ops = gimple_num_ops (stmt);
    2049     72899936 :   gimple *copy = gimple_alloc (code, num_ops);
    2050     72899936 :   unsigned i;
    2051              : 
    2052              :   /* Shallow copy all the fields from STMT.  */
    2053     72899936 :   memcpy (copy, stmt, gimple_size (code));
    2054     72899936 :   gimple_init_singleton (copy);
    2055              : 
    2056              :   /* If STMT has sub-statements, deep-copy them as well.  */
    2057     72899936 :   if (gimple_has_substatements (stmt))
    2058              :     {
    2059        42567 :       gimple_seq new_seq;
    2060        42567 :       tree t;
    2061              : 
    2062        42567 :       switch (gimple_code (stmt))
    2063              :         {
    2064          349 :         case GIMPLE_BIND:
    2065          349 :           {
    2066          349 :             gbind *bind_stmt = as_a <gbind *> (stmt);
    2067          349 :             gbind *bind_copy = as_a <gbind *> (copy);
    2068          349 :             new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt));
    2069          349 :             gimple_bind_set_body (bind_copy, new_seq);
    2070          349 :             gimple_bind_set_vars (bind_copy,
    2071              :                                   unshare_expr (gimple_bind_vars (bind_stmt)));
    2072          349 :             gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt));
    2073              :           }
    2074          349 :           break;
    2075              : 
    2076        17498 :         case GIMPLE_CATCH:
    2077        17498 :           {
    2078        17498 :             gcatch *catch_stmt = as_a <gcatch *> (stmt);
    2079        17498 :             gcatch *catch_copy = as_a <gcatch *> (copy);
    2080        17498 :             new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt));
    2081        17498 :             gimple_catch_set_handler (catch_copy, new_seq);
    2082        17498 :             t = unshare_expr (gimple_catch_types (catch_stmt));
    2083        17498 :             gimple_catch_set_types (catch_copy, t);
    2084              :           }
    2085        17498 :           break;
    2086              : 
    2087            0 :         case GIMPLE_EH_FILTER:
    2088            0 :           {
    2089            0 :             geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt);
    2090            0 :             geh_filter *eh_filter_copy = as_a <geh_filter *> (copy);
    2091            0 :             new_seq
    2092            0 :               = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt));
    2093            0 :             gimple_eh_filter_set_failure (eh_filter_copy, new_seq);
    2094            0 :             t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt));
    2095            0 :             gimple_eh_filter_set_types (eh_filter_copy, t);
    2096              :           }
    2097            0 :           break;
    2098              : 
    2099          273 :         case GIMPLE_EH_ELSE:
    2100          273 :           {
    2101          273 :             geh_else *eh_else_stmt = as_a <geh_else *> (stmt);
    2102          273 :             geh_else *eh_else_copy = as_a <geh_else *> (copy);
    2103          273 :             new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt));
    2104          273 :             gimple_eh_else_set_n_body (eh_else_copy, new_seq);
    2105          273 :             new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt));
    2106          273 :             gimple_eh_else_set_e_body (eh_else_copy, new_seq);
    2107              :           }
    2108          273 :           break;
    2109              : 
    2110        24181 :         case GIMPLE_TRY:
    2111        24181 :           {
    2112        24181 :             gtry *try_stmt = as_a <gtry *> (stmt);
    2113        24181 :             gtry *try_copy = as_a <gtry *> (copy);
    2114        24181 :             new_seq = gimple_seq_copy (gimple_try_eval (try_stmt));
    2115        24181 :             gimple_try_set_eval (try_copy, new_seq);
    2116        24181 :             new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt));
    2117        24181 :             gimple_try_set_cleanup (try_copy, new_seq);
    2118              :           }
    2119        24181 :           break;
    2120              : 
    2121          260 :         case GIMPLE_OMP_FOR:
    2122          260 :           new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt));
    2123          260 :           gimple_omp_for_set_pre_body (copy, new_seq);
    2124          260 :           t = unshare_expr (gimple_omp_for_clauses (stmt));
    2125          260 :           gimple_omp_for_set_clauses (copy, t);
    2126          260 :           {
    2127          260 :             gomp_for *omp_for_copy = as_a <gomp_for *> (copy);
    2128          260 :             omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter>
    2129          260 :               ( gimple_omp_for_collapse (stmt));
    2130              :           }
    2131          532 :           for (i = 0; i < gimple_omp_for_collapse (stmt); i++)
    2132              :             {
    2133          272 :               gimple_omp_for_set_cond (copy, i,
    2134              :                                        gimple_omp_for_cond (stmt, i));
    2135          272 :               gimple_omp_for_set_index (copy, i,
    2136              :                                         gimple_omp_for_index (stmt, i));
    2137          272 :               t = unshare_expr (gimple_omp_for_initial (stmt, i));
    2138          272 :               gimple_omp_for_set_initial (copy, i, t);
    2139          272 :               t = unshare_expr (gimple_omp_for_final (stmt, i));
    2140          272 :               gimple_omp_for_set_final (copy, i, t);
    2141          272 :               t = unshare_expr (gimple_omp_for_incr (stmt, i));
    2142          272 :               gimple_omp_for_set_incr (copy, i, t);
    2143              :             }
    2144          260 :           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          260 :         case GIMPLE_OMP_SECTION:
    2250          260 :         case GIMPLE_OMP_MASTER:
    2251          260 :         case GIMPLE_OMP_STRUCTURED_BLOCK:
    2252          260 :         copy_omp_body:
    2253          260 :           new_seq = gimple_seq_copy (gimple_omp_body (stmt));
    2254          260 :           gimple_omp_set_body (copy, new_seq);
    2255          260 :           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     72899936 :   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    222550788 :   for (i = 0; i < num_ops; i++)
    2310    149650852 :     gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i)));
    2311              : 
    2312     72899936 :   if (gimple_has_mem_ops (stmt))
    2313              :     {
    2314     33906915 :       gimple_set_vdef (copy, gimple_vdef (stmt));
    2315     33906915 :       gimple_set_vuse (copy, gimple_vuse (stmt));
    2316              :     }
    2317              : 
    2318              :   /* Clear out SSA operand vectors on COPY.  */
    2319     72899936 :   if (gimple_has_ops (stmt))
    2320              :     {
    2321     72458325 :       gimple_set_use_ops (copy, NULL);
    2322              : 
    2323              :       /* SSA operands need to be updated.  */
    2324     72458325 :       gimple_set_modified (copy, true);
    2325              :     }
    2326              : 
    2327     72899936 :   if (gimple_debug_nonbind_marker_p (stmt))
    2328     16437545 :     cfun->debug_marker_count++;
    2329              : 
    2330     72899936 :   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       741330 : gimple_move_vops (gimple *new_stmt, gimple *old_stmt)
    2338              : {
    2339       741330 :   tree vdef = gimple_vdef (old_stmt);
    2340      1482660 :   gimple_set_vuse (new_stmt, gimple_vuse (old_stmt));
    2341       741330 :   gimple_set_vdef (new_stmt, vdef);
    2342       741330 :   if (vdef && TREE_CODE (vdef) == SSA_NAME)
    2343       258677 :     SSA_NAME_DEF_STMT (vdef) = new_stmt;
    2344       741330 : }
    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    876850833 : gimple_has_side_effects (const gimple *s)
    2354              : {
    2355    876850833 :   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   1324384166 :   if (gimple_has_volatile_ops (s))
    2362              :     return true;
    2363              : 
    2364    665751873 :   if (gimple_code (s) == GIMPLE_ASM
    2365    665751873 :       && gimple_asm_volatile_p (as_a <const gasm *> (s)))
    2366              :     return true;
    2367              : 
    2368    665148417 :   if (is_gimple_call (s))
    2369              :     {
    2370     95220250 :       int flags = gimple_call_flags (s);
    2371              : 
    2372              :       /* An infinite loop is considered a side effect.  */
    2373     95220250 :       if (!(flags & (ECF_CONST | ECF_PURE))
    2374     18941608 :           || (flags & ECF_LOOPING_CONST_OR_PURE))
    2375              :         return true;
    2376              : 
    2377              :       return false;
    2378              :     }
    2379              : 
    2380              :   return false;
    2381              : }
    2382              : 
    2383              : /* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p.
    2384              :    Return true if S can trap.  When INCLUDE_MEM is true, check whether
    2385              :    the memory operations could trap.  When INCLUDE_STORES is true and
    2386              :    S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked.  */
    2387              : 
    2388              : bool
    2389     61069377 : gimple_could_trap_p_1 (const gimple *s, bool include_mem, bool include_stores)
    2390              : {
    2391     61069377 :   tree t, div = NULL_TREE;
    2392     61069377 :   enum tree_code op;
    2393              : 
    2394     61069377 :   if (include_mem)
    2395              :     {
    2396     36450296 :       unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0;
    2397              : 
    2398    125518177 :       for (i = start; i < gimple_num_ops (s); i++)
    2399     93874526 :         if (tree_could_trap_p (gimple_op (s, i)))
    2400              :           return true;
    2401              :     }
    2402              : 
    2403     56262732 :   switch (gimple_code (s))
    2404              :     {
    2405        10396 :     case GIMPLE_ASM:
    2406        10396 :       return gimple_asm_volatile_p (as_a <const gasm *> (s));
    2407              : 
    2408      1471571 :     case GIMPLE_CALL:
    2409      1471571 :       {
    2410      1471571 :         if (gimple_call_internal_p (s))
    2411              :           return false;
    2412      1306547 :         t = gimple_call_fndecl (s);
    2413              :         /* Assume that indirect and calls to weak functions may trap.  */
    2414      1306547 :         if (!t || !DECL_P (t) || DECL_WEAK (t))
    2415              :           return true;
    2416              : 
    2417              :         /* Any floating point builtin operation could trap.  */
    2418      1285037 :         if (gimple_call_builtin_p (s))
    2419              :           {
    2420       969752 :             if (fndecl_built_in_p (t, BUILT_IN_NORMAL))
    2421       866982 :               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       920032 :             tree type = TREE_TYPE (gimple_call_fntype (s));
    2430       920032 :             bool fp_operation = FLOAT_TYPE_P (type);
    2431       923134 :             return fp_operation && flag_trapping_math;
    2432              :           }
    2433              :         return false;
    2434              :       }
    2435     43097957 :     case GIMPLE_ASSIGN:
    2436     43097957 :       op = gimple_assign_rhs_code (s);
    2437              : 
    2438              :       /* For COND_EXPR only the condition may trap.  */
    2439     43097957 :       if (op == COND_EXPR)
    2440        23942 :         return tree_could_trap_p (gimple_assign_rhs1 (s));
    2441              : 
    2442              :       /* For comparisons we need to check rhs operand types instead of lhs type
    2443              :          (which is BOOLEAN_TYPE).  */
    2444     43074015 :       if (TREE_CODE_CLASS (op) == tcc_comparison)
    2445      1650020 :         t = TREE_TYPE (gimple_assign_rhs1 (s));
    2446              :       else
    2447     41423995 :         t = TREE_TYPE (gimple_assign_lhs (s));
    2448              : 
    2449     43074015 :       if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS)
    2450     23860472 :         div = gimple_assign_rhs2 (s);
    2451              : 
    2452     45632595 :       return (operation_could_trap_p (op, FLOAT_TYPE_P (t),
    2453     43074015 :                                       (INTEGRAL_TYPE_P (t)
    2454     43074015 :                                        && TYPE_OVERFLOW_TRAPS (t)),
    2455     43074015 :                                       div));
    2456              : 
    2457      7969304 :     case GIMPLE_COND:
    2458      7969304 :       t = TREE_TYPE (gimple_cond_lhs (s));
    2459      7969304 :       return operation_could_trap_p (gimple_cond_code (s),
    2460     15938608 :                                      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     32290094 : gimple_could_trap_p (const gimple *s)
    2473              : {
    2474     32290094 :   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      3201625 : gimple_assign_rhs_could_trap_p (gimple *s)
    2481              : {
    2482      3201625 :   gcc_assert (is_gimple_assign (s));
    2483      3201625 :   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    102678545 : get_gimple_rhs_num_ops (enum tree_code code)
    2525              : {
    2526    102678545 :   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     62258665 : gimple_compare_field_offset (tree f1, tree f2)
    2623              : {
    2624     62258665 :   if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2))
    2625              :     {
    2626     62258602 :       tree offset1 = DECL_FIELD_OFFSET (f1);
    2627     62258602 :       tree offset2 = DECL_FIELD_OFFSET (f2);
    2628     62258602 :       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    124517204 :               && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1),
    2643     62258602 :                                      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       598072 : gimple_signed_or_unsigned_type (bool unsignedp, tree type)
    2674              : {
    2675       598072 :   tree type1;
    2676       598072 :   int i;
    2677              : 
    2678       598072 :   type1 = TYPE_MAIN_VARIANT (type);
    2679       598072 :   if (type1 == signed_char_type_node
    2680       598072 :       || type1 == char_type_node
    2681       598072 :       || type1 == unsigned_char_type_node)
    2682            0 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2683       598072 :   if (type1 == integer_type_node || type1 == unsigned_type_node)
    2684       345446 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2685       252626 :   if (type1 == short_integer_type_node || type1 == short_unsigned_type_node)
    2686       231680 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2687        20946 :   if (type1 == long_integer_type_node || type1 == long_unsigned_type_node)
    2688           30 :     return unsignedp ? long_unsigned_type_node : long_integer_type_node;
    2689        20916 :   if (type1 == long_long_integer_type_node
    2690        20827 :       || 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        34762 :   for (i = 0; i < NUM_INT_N_ENTS; i ++)
    2696        20827 :     if (int_n_enabled_p[i]
    2697        20827 :         && (type1 == int_n_trees[i].unsigned_type
    2698        14307 :             || type1 == int_n_trees[i].signed_type))
    2699         6892 :         return unsignedp
    2700         6892 :           ? int_n_trees[i].unsigned_type
    2701         6892 :           : int_n_trees[i].signed_type;
    2702              : 
    2703              : #if HOST_BITS_PER_WIDE_INT >= 64
    2704        13935 :   if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node)
    2705            0 :     return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
    2706              : #endif
    2707        13935 :   if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node)
    2708            0 :     return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
    2709        13935 :   if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node)
    2710            0 :     return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
    2711        13935 :   if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node)
    2712            0 :     return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
    2713        13935 :   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        13935 :   GIMPLE_FIXED_TYPES (fract);
    2765        13935 :   GIMPLE_FIXED_TYPES_SAT (fract);
    2766        13935 :   GIMPLE_FIXED_TYPES (accum);
    2767        13935 :   GIMPLE_FIXED_TYPES_SAT (accum);
    2768              : 
    2769        13935 :   GIMPLE_FIXED_MODE_TYPES (qq);
    2770        13935 :   GIMPLE_FIXED_MODE_TYPES (hq);
    2771        13935 :   GIMPLE_FIXED_MODE_TYPES (sq);
    2772        13935 :   GIMPLE_FIXED_MODE_TYPES (dq);
    2773        13935 :   GIMPLE_FIXED_MODE_TYPES (tq);
    2774        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (qq);
    2775        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (hq);
    2776        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (sq);
    2777        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (dq);
    2778        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (tq);
    2779        13935 :   GIMPLE_FIXED_MODE_TYPES (ha);
    2780        13935 :   GIMPLE_FIXED_MODE_TYPES (sa);
    2781        13935 :   GIMPLE_FIXED_MODE_TYPES (da);
    2782        13935 :   GIMPLE_FIXED_MODE_TYPES (ta);
    2783        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (ha);
    2784        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (sa);
    2785        13935 :   GIMPLE_FIXED_MODE_TYPES_SAT (da);
    2786        13935 :   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        13935 :   if (!INTEGRAL_TYPE_P (type)
    2797        13935 :       || 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        13935 :   if (TYPE_OK (signed_char_type_node))
    2804          461 :     return unsignedp ? unsigned_char_type_node : signed_char_type_node;
    2805        13474 :   if (TYPE_OK (integer_type_node))
    2806         3511 :     return unsignedp ? unsigned_type_node : integer_type_node;
    2807         9963 :   if (TYPE_OK (short_integer_type_node))
    2808         4752 :     return unsignedp ? short_unsigned_type_node : short_integer_type_node;
    2809         5211 :   if (TYPE_OK (long_integer_type_node))
    2810            0 :     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       598072 : gimple_signed_type (tree type)
    2860              : {
    2861       598072 :   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      8551291 : gimple_get_alias_set (tree t)
    2870              : {
    2871              :   /* That's all the expressions we handle specially.  */
    2872      8551291 :   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      2434048 :   if (t == char_type_node
    2879      1903550 :       || t == signed_char_type_node
    2880      1903550 :       || 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      1903550 :   if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t))
    2886              :     {
    2887       597170 :       tree t1 = gimple_signed_type (t);
    2888              : 
    2889              :       /* t1 == t can happen for boolean nodes which are always unsigned.  */
    2890       597170 :       if (t1 != t)
    2891       597170 :         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      1306380 :   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     54634983 : gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data)
    2912              : {
    2913     54634983 :   bitmap addresses_taken = (bitmap)data;
    2914     54634983 :   addr = get_base_address (addr);
    2915     54634983 :   if (addr
    2916     54634983 :       && DECL_P (addr))
    2917              :     {
    2918     34661123 :       bitmap_set_bit (addresses_taken, DECL_UID (addr));
    2919     34661123 :       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    875135821 : gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt)
    2930              : {
    2931    875135821 :   return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
    2932    875135821 :                                         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    285385764 : gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl)
    2941              : {
    2942    285385764 :   gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN);
    2943              : 
    2944    285385764 :   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
    2945    283021242 :     if (tree decl = builtin_decl_explicit (DECL_FUNCTION_CODE (fndecl)))
    2946    285385764 :       fndecl = decl;
    2947              : 
    2948    285385764 :   tree ret = gimple_call_lhs (stmt);
    2949    285385764 :   if (ret
    2950    459373493 :       && !useless_type_conversion_p (TREE_TYPE (ret),
    2951    173987729 :                                      TREE_TYPE (TREE_TYPE (fndecl))))
    2952              :     return false;
    2953              : 
    2954    285363781 :   tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
    2955    285363781 :   unsigned nargs = gimple_call_num_args (stmt);
    2956    885896745 :   for (unsigned i = 0; i < nargs; ++i)
    2957              :     {
    2958              :       /* Variadic args follow.  */
    2959    633456955 :       if (!targs)
    2960              :         return true;
    2961    605475108 :       tree arg = gimple_call_arg (stmt, i);
    2962    605475108 :       tree type = TREE_VALUE (targs);
    2963    605475108 :       if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
    2964              :         return false;
    2965    600532964 :       targs = TREE_CHAIN (targs);
    2966              :     }
    2967    504061449 :   if (targs && !VOID_TYPE_P (TREE_VALUE (targs)))
    2968              :     return false;
    2969              :   return true;
    2970              : }
    2971              : 
    2972              : /* Return true when STMT is operator a replaceable delete call.  */
    2973              : 
    2974              : bool
    2975      2632562 : gimple_call_operator_delete_p (const gcall *stmt)
    2976              : {
    2977      2632562 :   tree fndecl;
    2978              : 
    2979      2632562 :   if ((fndecl = gimple_call_fndecl (stmt)) != NULL_TREE)
    2980      2632562 :     return DECL_IS_OPERATOR_DELETE_P (fndecl);
    2981              :   return false;
    2982              : }
    2983              : 
    2984              : /* Return true when STMT is builtins call.  */
    2985              : 
    2986              : bool
    2987     70386040 : gimple_call_builtin_p (const gimple *stmt)
    2988              : {
    2989     70386040 :   tree fndecl;
    2990     70386040 :   if (is_gimple_call (stmt)
    2991     22080264 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    2992     91212939 :       && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN)
    2993      4913442 :     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   1037430539 : gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass)
    3001              : {
    3002   1037430539 :   tree fndecl;
    3003   1037430539 :   if (is_gimple_call (stmt)
    3004    787555477 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    3005   1787673562 :       && DECL_BUILT_IN_CLASS (fndecl) == klass)
    3006    192780057 :     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   3060276645 : gimple_call_builtin_p (const gimple *stmt, enum built_in_function code)
    3014              : {
    3015   3060276645 :   tree fndecl;
    3016   3060276645 :   if (is_gimple_call (stmt)
    3017    889972851 :       && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE
    3018   3907274893 :       && fndecl_built_in_p (fndecl, code))
    3019      2623864 :     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    179500062 : gimple_call_combined_fn (const gimple *stmt)
    3029              : {
    3030    179500062 :   if (const gcall *call = dyn_cast <const gcall *> (stmt))
    3031              :     {
    3032    179291356 :       if (gimple_call_internal_p (call))
    3033      8628225 :         return as_combined_fn (gimple_call_internal_fn (call));
    3034              : 
    3035    170663131 :       tree fndecl = gimple_call_fndecl (stmt);
    3036    170663131 :       if (fndecl
    3037    164561720 :           && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL)
    3038    238367252 :           && gimple_builtin_call_types_compatible_p (stmt, fndecl))
    3039     67159426 :         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     11920437 : gimple_asm_clobbers_memory_p (const gasm *stmt)
    3049              : {
    3050     11920437 :   unsigned i;
    3051              : 
    3052     17189831 :   for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
    3053              :     {
    3054      9597888 :       tree op = gimple_asm_clobber_op (stmt, i);
    3055      9597888 :       if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
    3056              :         return true;
    3057              :     }
    3058              : 
    3059              :   /* Non-empty basic ASM implicitly clobbers memory.  */
    3060      7591943 :   if (gimple_asm_basic_p (stmt) && strlen (gimple_asm_string (stmt)) != 0)
    3061        77988 :     return true;
    3062              : 
    3063              :   return false;
    3064              : }
    3065              : 
    3066              : /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE.  */
    3067              : 
    3068              : void
    3069         5331 : dump_decl_set (FILE *file, bitmap set)
    3070              : {
    3071         5331 :   if (set)
    3072              :     {
    3073         5331 :       bitmap_iterator bi;
    3074         5331 :       unsigned i;
    3075              : 
    3076         5331 :       fprintf (file, "{ ");
    3077              : 
    3078        22214 :       EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
    3079              :         {
    3080        16883 :           fprintf (file, "D.%u", i);
    3081        16883 :           fprintf (file, " ");
    3082              :         }
    3083              : 
    3084         5331 :       fprintf (file, "}");
    3085              :     }
    3086              :   else
    3087            0 :     fprintf (file, "NIL");
    3088         5331 : }
    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     10054158 : nonfreeing_call_p (gimple *call)
    3094              : {
    3095     10054158 :   if (gimple_call_builtin_p (call, BUILT_IN_NORMAL)
    3096     10054158 :       && gimple_call_flags (call) & ECF_LEAF)
    3097      4393831 :     switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call)))
    3098              :       {
    3099              :         /* Just in case these become ECF_LEAF in the future.  */
    3100              :         case BUILT_IN_FREE:
    3101              :         case BUILT_IN_TM_FREE:
    3102              :         case BUILT_IN_REALLOC:
    3103              :         case BUILT_IN_STACK_RESTORE:
    3104              :         case BUILT_IN_GOMP_FREE:
    3105              :         case BUILT_IN_GOMP_REALLOC:
    3106              :           return false;
    3107              :         default:
    3108              :           return true;
    3109              :       }
    3110      5660327 :   else if (gimple_call_internal_p (call))
    3111       766391 :     switch (gimple_call_internal_fn (call))
    3112              :       {
    3113              :       case IFN_ABNORMAL_DISPATCHER:
    3114              :         return true;
    3115        35661 :       case IFN_ASAN_MARK:
    3116        35661 :         return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON;
    3117       724760 :       default:
    3118       724760 :         if (gimple_call_flags (call) & ECF_LEAF)
    3119              :           return true;
    3120              :         return false;
    3121              :       }
    3122              : 
    3123      4893936 :   tree fndecl = gimple_call_fndecl (call);
    3124      4893936 :   if (!fndecl)
    3125              :     return false;
    3126      4733144 :   struct cgraph_node *n = cgraph_node::get (fndecl);
    3127      4733144 :   if (!n)
    3128              :     return false;
    3129      4731764 :   enum availability availability;
    3130      4731764 :   n = n->function_symbol (&availability);
    3131      4731764 :   if (!n || availability <= AVAIL_INTERPOSABLE)
    3132              :     return false;
    3133      1146158 :   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      1654565 : nonbarrier_call_p (gimple *call)
    3140              : {
    3141      1654565 :   if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST))
    3142       644777 :     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     77254808 : check_loadstore (gimple *, tree op, tree, void *data)
    3157              : {
    3158     77254808 :   if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF)
    3159              :     {
    3160              :       /* Some address spaces may legitimately dereference zero.  */
    3161     40247695 :       addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
    3162     40247695 :       if (targetm.addr_space.zero_address_valid (as))
    3163              :         return false;
    3164              : 
    3165     40246580 :       return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0);
    3166              :     }
    3167              :   return false;
    3168              : }
    3169              : 
    3170              : 
    3171              : /* Return true if OP can be inferred to be non-NULL after STMT executes,
    3172              :    either by using a pointer dereference or attributes.  */
    3173              : bool
    3174            0 : infer_nonnull_range (gimple *stmt, tree op)
    3175              : {
    3176            0 :   return (infer_nonnull_range_by_dereference (stmt, op)
    3177            0 :           || infer_nonnull_range_by_attribute (stmt, op));
    3178              : }
    3179              : 
    3180              : /* Return true if OP can be inferred to be non-NULL after STMT
    3181              :    executes by using a pointer dereference.  */
    3182              : bool
    3183    341766592 : infer_nonnull_range_by_dereference (gimple *stmt, tree op)
    3184              : {
    3185              :   /* We can only assume that a pointer dereference will yield
    3186              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3187    341766592 :   if (!flag_delete_null_pointer_checks
    3188    341552910 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3189    341552910 :       || gimple_code (stmt) == GIMPLE_ASM
    3190    682854967 :       || gimple_clobber_p (stmt))
    3191              :     return false;
    3192              : 
    3193    333890062 :   if (walk_stmt_load_store_ops (stmt, (void *)op,
    3194              :                                 check_loadstore, check_loadstore))
    3195              :     return true;
    3196              : 
    3197              :   return false;
    3198              : }
    3199              : 
    3200              : /* Return true if OP can be inferred to be a non-NULL after STMT
    3201              :    executes by using attributes.  If OP2 and OP3 are non-NULL and
    3202              :    nonnull_if_nonzero is the only attribute implying OP being non-NULL
    3203              :    and the corresponding argument(s) aren't non-zero INTEGER_CST, set *OP2
    3204              :    and *OP3 to the corresponding arguments and return true (in that case
    3205              :    returning true doesn't mean OP can be unconditionally inferred to be
    3206              :    non-NULL, but conditionally).  */
    3207              : bool
    3208     77331933 : infer_nonnull_range_by_attribute (gimple *stmt, tree op, tree *op2, tree *op3)
    3209              : {
    3210     77331933 :   if (op2)
    3211              :     {
    3212         3938 :       *op2 = NULL_TREE;
    3213         3938 :       *op3 = NULL_TREE;
    3214              :     }
    3215              : 
    3216              :   /* We can only assume that a pointer dereference will yield
    3217              :      non-NULL if -fdelete-null-pointer-checks is enabled.  */
    3218     77331933 :   if (!flag_delete_null_pointer_checks
    3219     77303256 :       || !POINTER_TYPE_P (TREE_TYPE (op))
    3220    154635189 :       || gimple_code (stmt) == GIMPLE_ASM)
    3221              :     return false;
    3222              : 
    3223     77245139 :   if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt))
    3224              :     {
    3225      4506991 :       tree fntype = gimple_call_fntype (stmt);
    3226      4506991 :       tree attrs = TYPE_ATTRIBUTES (fntype);
    3227      4604498 :       for (; attrs; attrs = TREE_CHAIN (attrs))
    3228              :         {
    3229      1168403 :           attrs = lookup_attribute ("nonnull", attrs);
    3230              : 
    3231              :           /* If "nonnull" wasn't specified, we know nothing about
    3232              :              the argument, unless "nonnull_if_nonzero" attribute is
    3233              :              present.  */
    3234      1168403 :           if (attrs == NULL_TREE)
    3235              :             break;
    3236              : 
    3237              :           /* If "nonnull" applies to all the arguments, then ARG
    3238              :              is non-null if it's in the argument list.  */
    3239       256801 :           if (TREE_VALUE (attrs) == NULL_TREE)
    3240              :             {
    3241       462476 :               for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++)
    3242              :                 {
    3243       312058 :                   if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i)))
    3244       304394 :                       && operand_equal_p (op, gimple_call_arg (stmt, i), 0))
    3245              :                     return true;
    3246              :                 }
    3247              :               return false;
    3248              :             }
    3249              : 
    3250              :           /* Now see if op appears in the nonnull list.  */
    3251       245764 :           for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t))
    3252              :             {
    3253       148257 :               unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1;
    3254       148257 :               if (idx < gimple_call_num_args (stmt))
    3255              :                 {
    3256       148256 :                   tree arg = gimple_call_arg (stmt, idx);
    3257       148256 :                   if (operand_equal_p (op, arg, 0))
    3258              :                     return true;
    3259              :                 }
    3260              :             }
    3261              :         }
    3262              : 
    3263      4347697 :       for (attrs = TYPE_ATTRIBUTES (fntype);
    3264      4549441 :            (attrs = lookup_attribute ("nonnull_if_nonzero", attrs));
    3265       201744 :            attrs = TREE_CHAIN (attrs))
    3266              :         {
    3267       202439 :           tree args = TREE_VALUE (attrs);
    3268       202439 :           unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (args)) - 1;
    3269       202439 :           unsigned int idx2
    3270       202439 :             = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args))) - 1;
    3271       202439 :           unsigned int idx3 = idx2;
    3272       202439 :           if (tree chain2 = TREE_CHAIN (TREE_CHAIN (args)))
    3273         4325 :             idx3 = TREE_INT_CST_LOW (TREE_VALUE (chain2)) - 1;
    3274       202439 :           if (idx < gimple_call_num_args (stmt)
    3275       202427 :               && idx2 < gimple_call_num_args (stmt)
    3276       202416 :               && idx3 < gimple_call_num_args (stmt)
    3277       404855 :               && operand_equal_p (op, gimple_call_arg (stmt, idx), 0))
    3278              :             {
    3279          695 :               tree arg2 = gimple_call_arg (stmt, idx2);
    3280          695 :               tree arg3 = gimple_call_arg (stmt, idx3);
    3281         1390 :               if (!INTEGRAL_TYPE_P (TREE_TYPE (arg2))
    3282         1390 :                   || !INTEGRAL_TYPE_P (TREE_TYPE (arg3)))
    3283              :                 return false;
    3284          695 :               if (integer_nonzerop (arg2) && integer_nonzerop (arg3))
    3285              :                 return true;
    3286          473 :               if (integer_zerop (arg2) || integer_zerop (arg3))
    3287           90 :                 return false;
    3288          383 :               if (op2)
    3289              :                 {
    3290              :                   /* This case is meant for ubsan instrumentation.
    3291              :                      The caller can check at runtime if *OP2 and *OP3 are
    3292              :                      non-zero and OP is null.  */
    3293          132 :                   *op2 = arg2;
    3294          132 :                   *op3 = arg3;
    3295          132 :                   return true;
    3296              :                 }
    3297          251 :               return tree_expr_nonzero_p (arg2) && tree_expr_nonzero_p (arg3);
    3298              :             }
    3299              :         }
    3300              :     }
    3301              : 
    3302              :   /* If this function is marked as returning non-null, then we can
    3303              :      infer OP is non-null if it is used in the return statement.  */
    3304     77085150 :   if (greturn *return_stmt = dyn_cast <greturn *> (stmt))
    3305       959723 :     if (gimple_return_retval (return_stmt)
    3306       551776 :         && operand_equal_p (gimple_return_retval (return_stmt), op, 0)
    3307      1051869 :         && lookup_attribute ("returns_nonnull",
    3308        92146 :                              TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl))))
    3309              :       return true;
    3310              : 
    3311              :   return false;
    3312              : }
    3313              : 
    3314              : /* Compare two case labels.  Because the front end should already have
    3315              :    made sure that case ranges do not overlap, it is enough to only compare
    3316              :    the CASE_LOW values of each case label.  */
    3317              : 
    3318              : static int
    3319     43709196 : compare_case_labels (const void *p1, const void *p2)
    3320              : {
    3321     43709196 :   const_tree const case1 = *(const_tree const*)p1;
    3322     43709196 :   const_tree const case2 = *(const_tree const*)p2;
    3323              : 
    3324              :   /* The 'default' case label always goes first.  */
    3325     43709196 :   if (!CASE_LOW (case1))
    3326              :     return -1;
    3327     43709196 :   else if (!CASE_LOW (case2))
    3328              :     return 1;
    3329              :   else
    3330     43709196 :     return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
    3331              : }
    3332              : 
    3333              : /* Sort the case labels in LABEL_VEC in place in ascending order.  */
    3334              : 
    3335              : void
    3336        69775 : sort_case_labels (vec<tree> &label_vec)
    3337              : {
    3338        69775 :   label_vec.qsort (compare_case_labels);
    3339        69775 : }
    3340              : 
    3341              : /* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement.
    3342              : 
    3343              :    LABELS is a vector that contains all case labels to look at.
    3344              : 
    3345              :    INDEX_TYPE is the type of the switch index expression.  Case labels
    3346              :    in LABELS are discarded if their values are not in the value range
    3347              :    covered by INDEX_TYPE.  The remaining case label values are folded
    3348              :    to INDEX_TYPE.
    3349              : 
    3350              :    If a default case exists in LABELS, it is removed from LABELS and
    3351              :    returned in DEFAULT_CASEP.  If no default case exists, but the
    3352              :    case labels already cover the whole range of INDEX_TYPE, a default
    3353              :    case is returned pointing to one of the existing case labels.
    3354              :    Otherwise DEFAULT_CASEP is set to NULL_TREE.
    3355              : 
    3356              :    DEFAULT_CASEP may be NULL, in which case the above comment doesn't
    3357              :    apply and no action is taken regardless of whether a default case is
    3358              :    found or not.  */
    3359              : 
    3360              : void
    3361        61709 : preprocess_case_label_vec_for_gimple (vec<tree> &labels,
    3362              :                                       tree index_type,
    3363              :                                       tree *default_casep)
    3364              : {
    3365        61709 :   tree min_value, max_value;
    3366        61709 :   tree default_case = NULL_TREE;
    3367        61709 :   size_t i, len;
    3368              : 
    3369        61709 :   i = 0;
    3370        61709 :   min_value = TYPE_MIN_VALUE (index_type);
    3371        61709 :   max_value = TYPE_MAX_VALUE (index_type);
    3372      1149800 :   while (i < labels.length ())
    3373              :     {
    3374      1088091 :       tree elt = labels[i];
    3375      1088091 :       tree low = CASE_LOW (elt);
    3376      1088091 :       tree high = CASE_HIGH (elt);
    3377      1088091 :       bool remove_element = false;
    3378              : 
    3379      1088091 :       if (low)
    3380              :         {
    3381      1053021 :           gcc_checking_assert (TREE_CODE (low) == INTEGER_CST);
    3382      1053021 :           gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST);
    3383              : 
    3384              :           /* This is a non-default case label, i.e. it has a value.
    3385              : 
    3386              :              See if the case label is reachable within the range of
    3387              :              the index type.  Remove out-of-range case values.  Turn
    3388              :              case ranges into a canonical form (high > low strictly)
    3389              :              and convert the case label values to the index type.
    3390              : 
    3391              :              NB: The type of gimple_switch_index() may be the promoted
    3392              :              type, but the case labels retain the original type.  */
    3393              : 
    3394        12782 :           if (high)
    3395              :             {
    3396              :               /* This is a case range.  Discard empty ranges.
    3397              :                  If the bounds or the range are equal, turn this
    3398              :                  into a simple (one-value) case.  */
    3399        12782 :               int cmp = tree_int_cst_compare (high, low);
    3400        12782 :               if (cmp < 0)
    3401              :                 remove_element = true;
    3402        12782 :               else if (cmp == 0)
    3403              :                 high = NULL_TREE;
    3404              :             }
    3405              : 
    3406      1041872 :           if (! high)
    3407              :             {
    3408              :               /* If the simple case value is unreachable, ignore it.  */
    3409      1051388 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3410      1051388 :                    && tree_int_cst_compare (low, min_value) < 0)
    3411      2102733 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3412      1051345 :                       && tree_int_cst_compare (low, max_value) > 0))
    3413              :                 remove_element = true;
    3414              :               else
    3415      1051227 :                 low = fold_convert (index_type, low);
    3416              :             }
    3417              :           else
    3418              :             {
    3419              :               /* If the entire case range is unreachable, ignore it.  */
    3420         1633 :               if ((TREE_CODE (min_value) == INTEGER_CST
    3421         1633 :                    && tree_int_cst_compare (high, min_value) < 0)
    3422         3254 :                   || (TREE_CODE (max_value) == INTEGER_CST
    3423         1621 :                       && tree_int_cst_compare (low, max_value) > 0))
    3424              :                 remove_element = true;
    3425              :               else
    3426              :                 {
    3427              :                   /* If the lower bound is less than the index type's
    3428              :                      minimum value, truncate the range bounds.  */
    3429         1621 :                   if (TREE_CODE (min_value) == INTEGER_CST
    3430         1621 :                       && tree_int_cst_compare (low, min_value) < 0)
    3431              :                     low = min_value;
    3432         1621 :                   low = fold_convert (index_type, low);
    3433              : 
    3434              :                   /* If the upper bound is greater than the index type's
    3435              :                      maximum value, truncate the range bounds.  */
    3436         1621 :                   if (TREE_CODE (max_value) == INTEGER_CST
    3437         1621 :                       && tree_int_cst_compare (high, max_value) > 0)
    3438              :                     high = max_value;
    3439         1621 :                   high = fold_convert (index_type, high);
    3440              : 
    3441              :                   /* We may have folded a case range to a one-value case.  */
    3442         1621 :                   if (tree_int_cst_equal (low, high))
    3443            0 :                     high = NULL_TREE;
    3444              :                 }
    3445              :             }
    3446              : 
    3447      1053021 :           CASE_LOW (elt) = low;
    3448      1053021 :           CASE_HIGH (elt) = high;
    3449              :         }
    3450              :       else
    3451              :         {
    3452        35070 :           gcc_assert (!default_case);
    3453        35070 :           default_case = elt;
    3454              :           /* The default case must be passed separately to the
    3455              :              gimple_build_switch routine.  But if DEFAULT_CASEP
    3456              :              is NULL, we do not remove the default case (it would
    3457              :              be completely lost).  */
    3458        35070 :           if (default_casep)
    3459              :             remove_element = true;
    3460              :         }
    3461              : 
    3462      1053021 :       if (remove_element)
    3463        35243 :         labels.ordered_remove (i);
    3464              :       else
    3465      1052848 :         i++;
    3466              :     }
    3467        61709 :   len = i;
    3468              : 
    3469        61709 :   if (!labels.is_empty ())
    3470        60829 :     sort_case_labels (labels);
    3471              : 
    3472        61709 :   if (default_casep && !default_case)
    3473              :     {
    3474              :       /* If the switch has no default label, add one, so that we jump
    3475              :          around the switch body.  If the labels already cover the whole
    3476              :          range of the switch index_type, add the default label pointing
    3477              :          to one of the existing labels.  */
    3478        14933 :       if (len
    3479        14452 :           && TYPE_MIN_VALUE (index_type)
    3480        14452 :           && TYPE_MAX_VALUE (index_type)
    3481        29385 :           && tree_int_cst_equal (CASE_LOW (labels[0]),
    3482        14452 :                                  TYPE_MIN_VALUE (index_type)))
    3483              :         {
    3484         4354 :           tree low, high = CASE_HIGH (labels[len - 1]);
    3485         4354 :           if (!high)
    3486         4311 :             high = CASE_LOW (labels[len - 1]);
    3487         4354 :           if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type)))
    3488              :             {
    3489           62 :               tree widest_label = labels[0];
    3490          131 :               for (i = 1; i < len; i++)
    3491              :                 {
    3492           83 :                   high = CASE_LOW (labels[i]);
    3493           83 :                   low = CASE_HIGH (labels[i - 1]);
    3494           83 :                   if (!low)
    3495           53 :                     low = CASE_LOW (labels[i - 1]);
    3496              : 
    3497           83 :                   if (CASE_HIGH (labels[i]) != NULL_TREE
    3498          114 :                       && (CASE_HIGH (widest_label) == NULL_TREE
    3499           26 :                           || (wi::gtu_p
    3500           52 :                               (wi::to_wide (CASE_HIGH (labels[i]))
    3501           78 :                                - wi::to_wide (CASE_LOW (labels[i])),
    3502           26 :                                wi::to_wide (CASE_HIGH (widest_label))
    3503          161 :                                - wi::to_wide (CASE_LOW (widest_label))))))
    3504           17 :                     widest_label = labels[i];
    3505              : 
    3506           83 :                   if (wi::to_wide (low) + 1 != wi::to_wide (high))
    3507              :                     break;
    3508              :                 }
    3509           62 :               if (i == len)
    3510              :                 {
    3511              :                   /* Designate the label with the widest range to be the
    3512              :                      default label.  */
    3513           48 :                   tree label = CASE_LABEL (widest_label);
    3514           48 :                   default_case = build_case_label (NULL_TREE, NULL_TREE,
    3515              :                                                    label);
    3516              :                 }
    3517              :             }
    3518              :         }
    3519              :     }
    3520              : 
    3521        61709 :   if (default_casep)
    3522        50003 :     *default_casep = default_case;
    3523        61709 : }
    3524              : 
    3525              : /* Set the location of all statements in SEQ to LOC.  */
    3526              : 
    3527              : void
    3528      1024855 : gimple_seq_set_location (gimple_seq seq, location_t loc)
    3529              : {
    3530      2077234 :   for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i))
    3531      1052379 :     gimple_set_location (gsi_stmt (i), loc);
    3532      1024855 : }
    3533              : 
    3534              : /* Release SSA_NAMEs in SEQ as well as the GIMPLE statements.  */
    3535              : 
    3536              : void
    3537    793032345 : gimple_seq_discard (gimple_seq seq)
    3538              : {
    3539    793032345 :   gimple_stmt_iterator gsi;
    3540              : 
    3541    793615090 :   for (gsi = gsi_start (seq); !gsi_end_p (gsi); )
    3542              :     {
    3543       393739 :       gimple *stmt = gsi_stmt (gsi);
    3544       393739 :       gsi_remove (&gsi, true);
    3545       393739 :       release_defs (stmt);
    3546       393739 :       ggc_free (stmt);
    3547              :     }
    3548    793032345 : }
    3549              : 
    3550              : /* See if STMT now calls function that takes no parameters and if so, drop
    3551              :    call arguments.  This is used when devirtualization machinery redirects
    3552              :    to __builtin_unreachable or __cxa_pure_virtual.  */
    3553              : 
    3554              : void
    3555      1163389 : maybe_remove_unused_call_args (struct function *fn, gimple *stmt)
    3556              : {
    3557      1163389 :   tree decl = gimple_call_fndecl (stmt);
    3558      1163389 :   if (TYPE_ARG_TYPES (TREE_TYPE (decl))
    3559      1162551 :       && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node
    3560      1398408 :       && gimple_call_num_args (stmt))
    3561              :     {
    3562       119623 :       gimple_set_num_ops (stmt, 3);
    3563       119623 :       update_stmt_fn (fn, stmt);
    3564              :     }
    3565      1163389 : }
    3566              : 
    3567              : /* Return false if STMT will likely expand to real function call.  */
    3568              : 
    3569              : bool
    3570      3370456 : gimple_inexpensive_call_p (gcall *stmt)
    3571              : {
    3572      3370456 :   if (gimple_call_internal_p (stmt))
    3573              :     return true;
    3574      3314048 :   tree decl = gimple_call_fndecl (stmt);
    3575      3314048 :   if (decl && is_inexpensive_builtin (decl))
    3576              :     return true;
    3577              :   return false;
    3578              : }
    3579              : 
    3580              : /* Return a non-artificial location for STMT.  If STMT does not have
    3581              :    location information, get the location from EXPR.  */
    3582              : 
    3583              : location_t
    3584       121612 : gimple_or_expr_nonartificial_location (gimple *stmt, tree expr)
    3585              : {
    3586       121612 :   location_t loc = gimple_nonartificial_location (stmt);
    3587       121612 :   if (loc == UNKNOWN_LOCATION && EXPR_HAS_LOCATION (expr))
    3588           58 :     loc = tree_nonartificial_location (expr);
    3589       121612 :   return expansion_point_location_if_in_system_header (loc);
    3590              : }
    3591              : 
    3592              : 
    3593              : #if CHECKING_P
    3594              : 
    3595              : namespace selftest {
    3596              : 
    3597              : /* Selftests for core gimple structures.  */
    3598              : 
    3599              : /* Verify that STMT is pretty-printed as EXPECTED.
    3600              :    Helper function for selftests.  */
    3601              : 
    3602              : static void
    3603           20 : verify_gimple_pp (const char *expected, gimple *stmt)
    3604              : {
    3605           20 :   pretty_printer pp;
    3606           20 :   pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */);
    3607           20 :   ASSERT_STREQ (expected, pp_formatted_text (&pp));
    3608           20 : }
    3609              : 
    3610              : /* Build a GIMPLE_ASSIGN equivalent to
    3611              :      tmp = 5;
    3612              :    and verify various properties of it.  */
    3613              : 
    3614              : static void
    3615            4 : test_assign_single ()
    3616              : {
    3617            4 :   tree type = integer_type_node;
    3618            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3619              :                          get_identifier ("tmp"),
    3620              :                          type);
    3621            4 :   tree rhs = build_int_cst (type, 5);
    3622            4 :   gassign *stmt = gimple_build_assign (lhs, rhs);
    3623            4 :   verify_gimple_pp ("tmp = 5;", stmt);
    3624              : 
    3625            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3626            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3627            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3628            4 :   ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt));
    3629            4 :   ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt));
    3630            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3631            4 :   ASSERT_TRUE (gimple_assign_single_p (stmt));
    3632            8 :   ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt));
    3633            4 : }
    3634              : 
    3635              : /* Build a GIMPLE_ASSIGN equivalent to
    3636              :      tmp = a * b;
    3637              :    and verify various properties of it.  */
    3638              : 
    3639              : static void
    3640            4 : test_assign_binop ()
    3641              : {
    3642            4 :   tree type = integer_type_node;
    3643            4 :   tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3644              :                          get_identifier ("tmp"),
    3645              :                          type);
    3646            4 :   tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3647              :                        get_identifier ("a"),
    3648              :                        type);
    3649            4 :   tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL,
    3650              :                        get_identifier ("b"),
    3651              :                        type);
    3652            4 :   gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b);
    3653            4 :   verify_gimple_pp ("tmp = a * b;", stmt);
    3654              : 
    3655            4 :   ASSERT_TRUE (is_gimple_assign (stmt));
    3656            4 :   ASSERT_EQ (lhs, gimple_assign_lhs (stmt));
    3657            4 :   ASSERT_EQ (lhs, gimple_get_lhs (stmt));
    3658            4 :   ASSERT_EQ (a, gimple_assign_rhs1 (stmt));
    3659            8 :   ASSERT_EQ (b, gimple_assign_rhs2 (stmt));
    3660            4 :   ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt));
    3661            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3662            4 :   ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt));
    3663            4 : }
    3664              : 
    3665              : /* Build a GIMPLE_NOP and verify various properties of it.  */
    3666              : 
    3667              : static void
    3668            4 : test_nop_stmt ()
    3669              : {
    3670            4 :   gimple *stmt = gimple_build_nop ();
    3671            4 :   verify_gimple_pp ("GIMPLE_NOP", stmt);
    3672            4 :   ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt));
    3673            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3674            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3675            4 : }
    3676              : 
    3677              : /* Build a GIMPLE_RETURN equivalent to
    3678              :      return 7;
    3679              :    and verify various properties of it.  */
    3680              : 
    3681              : static void
    3682            4 : test_return_stmt ()
    3683              : {
    3684            4 :   tree type = integer_type_node;
    3685            4 :   tree val = build_int_cst (type, 7);
    3686            4 :   greturn *stmt = gimple_build_return (val);
    3687            4 :   verify_gimple_pp ("return 7;", stmt);
    3688              : 
    3689            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3690            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3691            4 :   ASSERT_EQ (val, gimple_return_retval (stmt));
    3692            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3693            4 : }
    3694              : 
    3695              : /* Build a GIMPLE_RETURN equivalent to
    3696              :      return;
    3697              :    and verify various properties of it.  */
    3698              : 
    3699              : static void
    3700            4 : test_return_without_value ()
    3701              : {
    3702            4 :   greturn *stmt = gimple_build_return (NULL);
    3703            4 :   verify_gimple_pp ("return;", stmt);
    3704              : 
    3705            4 :   ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt));
    3706            4 :   ASSERT_EQ (NULL, gimple_get_lhs (stmt));
    3707            4 :   ASSERT_EQ (NULL, gimple_return_retval (stmt));
    3708            4 :   ASSERT_FALSE (gimple_assign_single_p (stmt));
    3709            4 : }
    3710              : 
    3711              : /* Run all of the selftests within this file.  */
    3712              : 
    3713              : void
    3714            4 : gimple_cc_tests ()
    3715              : {
    3716            4 :   test_assign_single ();
    3717            4 :   test_assign_binop ();
    3718            4 :   test_nop_stmt ();
    3719            4 :   test_return_stmt ();
    3720            4 :   test_return_without_value ();
    3721            4 : }
    3722              : 
    3723              : } // namespace selftest
    3724              : 
    3725              : 
    3726              : #endif /* CHECKING_P */
        

Generated by: LCOV version 2.4-beta

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