LCOV - code coverage report
Current view: top level - gcc - tree-ssa-threadupdate.h Coverage Total Hit
Test: gcc.info Lines: 100.0 % 3 3
Test Date: 2026-09-19 16:22:48 Functions: - 0 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Communication between registering jump thread requests and
       2              :    updating the SSA/CFG for jump threading.
       3              :    Copyright (C) 2013-2026 Free Software Foundation, Inc.
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify
       8              : it under the terms of the GNU General Public License as published by
       9              : the Free Software Foundation; either version 3, or (at your option)
      10              : any later version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful,
      13              : but WITHOUT ANY WARRANTY; without even the implied warranty of
      14              : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15              : GNU General Public License for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #ifndef _TREE_SSA_THREADUPDATE_H
      22              : #define _TREE_SSA_THREADUPDATE_H 1
      23              : 
      24              : enum jump_thread_edge_type
      25              : {
      26              :   EDGE_START_JUMP_THREAD,
      27              :   EDGE_COPY_SRC_BLOCK,
      28              :   EDGE_COPY_SRC_JOINER_BLOCK,
      29              :   EDGE_NO_COPY_SRC_BLOCK
      30              : };
      31              : 
      32              : // We keep the registered jump threading opportunities in this
      33              : // vector as edge pairs (original_edge, target_edge).
      34              : 
      35              : class jump_thread_edge
      36              : {
      37              : public:
      38     28284218 :   jump_thread_edge (edge e, jump_thread_edge_type t) : e (e), type (t) {}
      39              : 
      40              :   edge e;
      41              :   jump_thread_edge_type type;
      42              : };
      43              : 
      44              : class jump_thread_path_allocator
      45              : {
      46              : public:
      47              :   jump_thread_path_allocator ();
      48              :   ~jump_thread_path_allocator ();
      49              :   jump_thread_edge *allocate_thread_edge (edge, jump_thread_edge_type);
      50              :   vec<jump_thread_edge *> *allocate_thread_path ();
      51              : private:
      52              :   DISABLE_COPY_AND_ASSIGN (jump_thread_path_allocator);
      53              :   obstack m_obstack;
      54              : };
      55              : 
      56              : // Abstract class for the jump thread registry.
      57              : //
      58              : // When all candidates have been registered with
      59              : // register_jump_thread(), thread_through_all_blocks() is called to
      60              : // update the CFG.
      61              : 
      62              : class jt_path_registry
      63              : {
      64              : public:
      65              :   jt_path_registry (bool backedge_threads);
      66              :   virtual ~jt_path_registry ();
      67              :   bool register_jump_thread (vec<jump_thread_edge *> *);
      68              :   bool thread_through_all_blocks (bool peel_loop_headers);
      69              :   void push_edge (vec<jump_thread_edge *> *path, edge, jump_thread_edge_type);
      70              :   vec<jump_thread_edge *> *allocate_thread_path ();
      71              :   void debug ();
      72              : protected:
      73              :   void debug_path (FILE *, int pathno);
      74              :   void remove_path (unsigned pathno);
      75              :   void remove_path (unsigned pathno, edge first);
      76              :   void add_first_edge (edge);
      77              :   void drop_first_edge (edge);
      78              :   unsigned first_edge_count (edge);
      79              :   vec<vec<jump_thread_edge *> *> m_paths;
      80              :   // How many registered paths start on a given edge.
      81              :   hash_map<edge, unsigned> m_first_edge_counts;
      82              :   unsigned long m_num_threaded_edges;
      83              : private:
      84              :   virtual bool update_cfg (bool peel_loop_headers) = 0;
      85              :   bool cancel_invalid_paths (vec<jump_thread_edge *> &path);
      86              :   jump_thread_path_allocator m_allocator;
      87              :   // True if threading through back edges is allowed.  This is only
      88              :   // allowed in the generic copier in the backward threader.
      89              :   bool m_backedge_threads;
      90              :   DISABLE_COPY_AND_ASSIGN (jt_path_registry);
      91              : };
      92              : 
      93              : // Forward threader path registry using a custom BB copier.
      94              : 
      95              : class fwd_jt_path_registry : public jt_path_registry
      96              : {
      97              : public:
      98              :   fwd_jt_path_registry ();
      99              :   ~fwd_jt_path_registry ();
     100              :   void remove_jump_threads_including (edge);
     101              : private:
     102              :   bool update_cfg (bool peel_loop_headers) override;
     103              :   void mark_threaded_blocks (bitmap threaded_blocks);
     104              :   bool thread_block_1 (basic_block, bool noloop_only, bool joiners);
     105              :   bool thread_block (basic_block, bool noloop_only);
     106              :   bool thread_through_loop_header (class loop *loop,
     107              :                                    bool may_peel_loop_headers);
     108              :   class redirection_data *lookup_redirection_data (edge e, enum insert_option);
     109              : 
     110              :   hash_table<struct removed_edges> *m_removed_edges;
     111              : 
     112              :   // Main data structure to hold information for duplicates of BB.
     113              :   hash_table<redirection_data> *m_redirection_data;
     114              : };
     115              : 
     116              : // Backward threader path registry using a generic BB copier.
     117              : 
     118      6477228 : class back_jt_path_registry : public jt_path_registry
     119              : {
     120              : public:
     121              :   back_jt_path_registry ();
     122              : private:
     123              :   bool update_cfg (bool peel_loop_headers) override;
     124              :   void adjust_paths_after_duplication (unsigned curr_path_num);
     125              :   bool duplicate_thread_path (edge entry, edge exit, basic_block *region,
     126              :                               unsigned n_region, unsigned current_path_no,
     127              :                               const char **failure_reason);
     128              :   bool rewire_first_differing_edge (unsigned path_num, unsigned edge_num);
     129              :   bool adjust_one_path (vec<jump_thread_edge *> *curr_path,
     130              :                         unsigned cand_path_num);
     131              : };
     132              : 
     133              : // Rather than search all the edges in jump thread paths each time DOM
     134              : // is able to simply if control statement, we build a hash table with
     135              : // the deleted edges.  We only care about the address of the edge, not
     136              : // its contents.
     137              : struct removed_edges : nofree_ptr_hash<edge_def>
     138              : {
     139      5493981 :   static hashval_t hash (edge e) { return htab_hash_pointer (e); }
     140              :   static bool equal (edge e1, edge e2) { return e1 == e2; }
     141              : };
     142              : 
     143              : extern unsigned int estimate_threading_killed_stmts (basic_block);
     144              : 
     145              : enum bb_dom_status
     146              : {
     147              :   /* BB does not dominate latch of the LOOP.  */
     148              :   DOMST_NONDOMINATING,
     149              :   /* The LOOP is broken (there is no path from the header to its latch.  */
     150              :   DOMST_LOOP_BROKEN,
     151              :   /* BB dominates the latch of the LOOP.  */
     152              :   DOMST_DOMINATING
     153              : };
     154              : 
     155              : enum bb_dom_status determine_bb_domination_status (class loop *, basic_block);
     156              : 
     157              : // In tree-ssa-dom.cc.
     158              : extern void free_dom_edge_info (edge);
     159              : 
     160              : #endif
        

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.