LCOV - code coverage report
Current view: top level - gcc - rtlhooks.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 94.1 % 34 32
Test Date: 2026-02-28 14:20:25 Functions: 80.0 % 5 4
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Generic hooks for the RTL middle-end.
       2              :    Copyright (C) 2004-2026 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 under
       7              : the terms of the GNU General Public License as published by the Free
       8              : Software Foundation; either version 3, or (at your option) any later
       9              : version.
      10              : 
      11              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14              : 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              : #include "config.h"
      21              : #include "system.h"
      22              : #include "coretypes.h"
      23              : #include "tm.h"
      24              : #include "function.h"
      25              : #include "rtl.h"
      26              : #include "tree.h"
      27              : #include "insn-config.h"
      28              : #include "memmodel.h"
      29              : #include "emit-rtl.h"
      30              : #include "recog.h"
      31              : #include "rtlhooks-def.h"
      32              : #include "explow.h"
      33              : #include "target.h"
      34              : 
      35              : 
      36              : /* For speed, we will copy the RTX hooks struct member-by-member
      37              :    instead of doing indirect calls.  For these reason, we initialize
      38              :    *two* struct rtl_hooks globals: rtl_hooks is the one that is used
      39              :    to actually call the hooks, while general_rtl_hooks is used
      40              :    to restore the hooks by passes that modify them.  */
      41              : 
      42              : const struct rtl_hooks general_rtl_hooks = RTL_HOOKS_INITIALIZER;
      43              : struct rtl_hooks rtl_hooks = RTL_HOOKS_INITIALIZER;
      44              : 
      45              : rtx
      46      4687884 : gen_lowpart_general (machine_mode mode, rtx x)
      47              : {
      48      4718505 :   rtx result = gen_lowpart_common (mode, x);
      49              : 
      50      4718505 :   if (result)
      51              :     return result;
      52              :   /* Handle SUBREGs and hard REGs that were rejected by
      53              :      simplify_gen_subreg.  */
      54       101923 :   else if (REG_P (x) || GET_CODE (x) == SUBREG)
      55              :     {
      56           66 :       result = gen_lowpart_common (mode, copy_to_reg (x));
      57           66 :       gcc_assert (result != 0);
      58              :       return result;
      59              :     }
      60              :   else
      61              :     {
      62              :       /* The only additional case we can do is MEM.  */
      63       101857 :       gcc_assert (MEM_P (x));
      64              : 
      65              :       /* The following exposes the use of "x" to CSE.  */
      66       101857 :       scalar_int_mode xmode;
      67       101857 :       if (is_a <scalar_int_mode> (GET_MODE (x), &xmode)
      68        46902 :           && GET_MODE_SIZE (xmode) <= UNITS_PER_WORD
      69        37568 :           && TRULY_NOOP_TRUNCATION_MODES_P (mode, xmode)
      70        37568 :           && !reload_completed)
      71        30621 :         return gen_lowpart_general (mode, force_reg (xmode, x));
      72              : 
      73        71236 :       poly_int64 offset = byte_lowpart_offset (mode, GET_MODE (x));
      74        71236 :       return adjust_address (x, mode, offset);
      75              :     }
      76              : }
      77              : 
      78              : rtx
      79     29911180 : reg_num_sign_bit_copies_general (const_rtx, scalar_int_mode, scalar_int_mode,
      80              :                                  unsigned int *)
      81              : {
      82     29911180 :   return NULL;
      83              : }
      84              : 
      85              : rtx
      86     74876276 : reg_nonzero_bits_general (const_rtx, scalar_int_mode, scalar_int_mode,
      87              :                           unsigned HOST_WIDE_INT *)
      88              : {
      89     74876276 :   return NULL;
      90              : }
      91              : 
      92              : bool
      93            0 : reg_truncated_to_mode_general (machine_mode mode ATTRIBUTE_UNUSED,
      94              :                                const_rtx x ATTRIBUTE_UNUSED)
      95              : {
      96            0 :   return false;
      97              : }
      98              : 
      99              : /* Assuming that X is an rtx (e.g., MEM, REG or SUBREG) for a fixed-point
     100              :    number, return an rtx (MEM, SUBREG, or CONST_INT) that refers to the
     101              :    least-significant part of X.
     102              :    MODE specifies how big a part of X to return.
     103              : 
     104              :    If the requested operation cannot be done, 0 is returned.
     105              : 
     106              :    This is similar to gen_lowpart_general.  */
     107              : 
     108              : rtx
     109     24764459 : gen_lowpart_if_possible (machine_mode mode, rtx x)
     110              : {
     111     24764459 :   rtx result = gen_lowpart_common (mode, x);
     112              : 
     113     24764459 :   if (result)
     114              :     return result;
     115        46700 :   else if (MEM_P (x))
     116              :     {
     117              :       /* This is the only other case we handle.  */
     118         8440 :       poly_int64 offset = byte_lowpart_offset (mode, GET_MODE (x));
     119         8440 :       rtx new_rtx = adjust_address_nv (x, mode, offset);
     120        16880 :       if (! memory_address_addr_space_p (mode, XEXP (new_rtx, 0),
     121         8440 :                                          MEM_ADDR_SPACE (x)))
     122              :         return 0;
     123              : 
     124         8020 :       return new_rtx;
     125              :     }
     126        38260 :   else if (mode != GET_MODE (x) && GET_MODE (x) != VOIDmode && !SUBREG_P (x)
     127        72681 :            && validate_subreg (mode, GET_MODE (x), x,
     128              :                                subreg_lowpart_offset (mode, GET_MODE (x))))
     129        33911 :     return gen_lowpart_SUBREG (mode, x);
     130              :   else
     131         4349 :     return 0;
     132              : }
     133              : 
        

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.