LCOV - code coverage report
Current view: top level - gcc - ifcvt.h (source / functions) Coverage Total Hit
Test: gcc.info Lines: 100.0 % 1 1
Test Date: 2024-12-21 13:15:12 Functions: - 0 0
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* If-conversion header file.
       2                 :             :    Copyright (C) 2014-2024 Free Software Foundation, Inc.
       3                 :             : 
       4                 :             :    This file is part of GCC.
       5                 :             : 
       6                 :             :    GCC is free software; you can redistribute it and/or modify it
       7                 :             :    under the terms of the GNU General Public License as published by
       8                 :             :    the Free Software Foundation; either version 3, or (at your option)
       9                 :             :    any later version.
      10                 :             : 
      11                 :             :    GCC is distributed in the hope that it will be useful, but WITHOUT
      12                 :             :    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      13                 :             :    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
      14                 :             :    License for more details.
      15                 :             : 
      16                 :             :    You should have received a copy of the GNU General Public License
      17                 :             :    along with GCC; see the file COPYING3.  If not see
      18                 :             :    <http://www.gnu.org/licenses/>.  */
      19                 :             : 
      20                 :             : #ifndef GCC_IFCVT_H
      21                 :             : #define GCC_IFCVT_H
      22                 :             : 
      23                 :             : /* Structure to group all of the information to process IF-THEN and
      24                 :             :    IF-THEN-ELSE blocks for the conditional execution support.  */
      25                 :             : 
      26                 :             : struct ce_if_block
      27                 :             : {
      28                 :             :   basic_block test_bb;                  /* First test block.  */
      29                 :             :   basic_block then_bb;                  /* THEN block.  */
      30                 :             :   basic_block else_bb;                  /* ELSE block or NULL.  */
      31                 :             :   basic_block join_bb;                  /* Join THEN/ELSE blocks.  */
      32                 :             :   basic_block last_test_bb;             /* Last bb to hold && or || tests.  */
      33                 :             :   int num_multiple_test_blocks;         /* # of && and || basic blocks.  */
      34                 :             :   int num_and_and_blocks;               /* # of && blocks.  */
      35                 :             :   int num_or_or_blocks;                 /* # of || blocks.  */
      36                 :             :   int num_multiple_test_insns;          /* # of insns in && and || blocks.  */
      37                 :             :   int and_and_p;                        /* Complex test is &&.  */
      38                 :             :   int num_then_insns;                   /* # of insns in THEN block.  */
      39                 :             :   int num_else_insns;                   /* # of insns in ELSE block.  */
      40                 :             :   int pass;                             /* Pass number.  */
      41                 :             : };
      42                 :             : 
      43                 :      225634 : struct noce_multiple_sets_info
      44                 :             : {
      45                 :             :   /* A list of indices to instructions that we need to rewire into this
      46                 :             :      instruction when we replace them with temporary conditional moves.  */
      47                 :             :   auto_vec<int> rewired_src;
      48                 :             :   /* The true targets for a conditional move.  */
      49                 :             :   rtx target;
      50                 :             :   /* The temporaries introduced to allow us to not consider register
      51                 :             :      overlap.  */
      52                 :             :   rtx temporary;
      53                 :             :   /* The insns we've emitted.  */
      54                 :             :   rtx_insn *unmodified_insn;
      55                 :             :   /* True if a simple move can be used instead of a conditional move.  */
      56                 :             :   bool need_cmov;
      57                 :             : };
      58                 :             : 
      59                 :             : /* Used by noce_process_if_block to communicate with its subroutines.
      60                 :             : 
      61                 :             :    The subroutines know that A and B may be evaluated freely.  They
      62                 :             :    know that X is a register.  They should insert new instructions
      63                 :             :    before cond_earliest.  */
      64                 :             : 
      65                 :             : struct noce_if_info
      66                 :             : {
      67                 :             :   /* The basic blocks that make up the IF-THEN-{ELSE-,}JOIN block.  */
      68                 :             :   basic_block test_bb, then_bb, else_bb, join_bb;
      69                 :             : 
      70                 :             :   /* The jump that ends TEST_BB.  */
      71                 :             :   rtx_insn *jump;
      72                 :             : 
      73                 :             :   /* The jump condition.  */
      74                 :             :   rtx cond;
      75                 :             : 
      76                 :             :   /* Reversed jump condition.  */
      77                 :             :   rtx rev_cond;
      78                 :             : 
      79                 :             :   /* New insns should be inserted before this one.  */
      80                 :             :   rtx_insn *cond_earliest;
      81                 :             : 
      82                 :             :   /* Insns in the THEN and ELSE block.  There is always just this
      83                 :             :      one insns in those blocks.  The insns are single_set insns.
      84                 :             :      If there was no ELSE block, INSN_B is the last insn before
      85                 :             :      COND_EARLIEST, or NULL_RTX.  In the former case, the insn
      86                 :             :      operands are still valid, as if INSN_B was moved down below
      87                 :             :      the jump.  */
      88                 :             :   rtx_insn *insn_a, *insn_b;
      89                 :             : 
      90                 :             :   /* The SET_SRC of INSN_A and INSN_B.  */
      91                 :             :   rtx a, b;
      92                 :             : 
      93                 :             :   /* The SET_DEST of INSN_A.  */
      94                 :             :   rtx x;
      95                 :             : 
      96                 :             :   /* The original set destination that the THEN and ELSE basic blocks finally
      97                 :             :      write their result to.  */
      98                 :             :   rtx orig_x;
      99                 :             :   /* True if this if block is not canonical.  In the canonical form of
     100                 :             :      if blocks, the THEN_BB is the block reached via the fallthru edge
     101                 :             :      from TEST_BB.  For the noce transformations, we allow the symmetric
     102                 :             :      form as well.  */
     103                 :             :   bool then_else_reversed;
     104                 :             : 
     105                 :             :   /* True if THEN_BB is conditional on !COND rather than COND.
     106                 :             :      This is used if:
     107                 :             : 
     108                 :             :      - JUMP branches to THEN_BB on COND
     109                 :             :      - JUMP falls through to JOIN_BB on !COND
     110                 :             :      - COND cannot be reversed.  */
     111                 :             :   bool cond_inverted;
     112                 :             : 
     113                 :             :   /* True if the contents of then_bb and else_bb are a
     114                 :             :      simple single set instruction.  */
     115                 :             :   bool then_simple;
     116                 :             :   bool else_simple;
     117                 :             : 
     118                 :             :   /* True if we're optimisizing the control block for speed, false if
     119                 :             :      we're optimizing for size.  */
     120                 :             :   bool speed_p;
     121                 :             : 
     122                 :             :   /* An estimate of the original costs.  When optimizing for size, this is the
     123                 :             :      combined cost of COND, JUMP and the costs for THEN_BB and ELSE_BB.
     124                 :             :      When optimizing for speed, we use the costs of COND plus weighted average
     125                 :             :      of the costs for THEN_BB and ELSE_BB, as computed in the next field.  */
     126                 :             :   unsigned int original_cost;
     127                 :             : 
     128                 :             :   /* Maximum permissible cost for the unconditional sequence we should
     129                 :             :      generate to replace this branch.  */
     130                 :             :   unsigned int max_seq_cost;
     131                 :             : 
     132                 :             :   /* The name of the noce transform that succeeded in if-converting
     133                 :             :      this structure.  Used for debugging.  */
     134                 :             :   const char *transform_name;
     135                 :             : };
     136                 :             : 
     137                 :             : #endif /* GCC_IFCVT_H */
        

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