GCC Middle and Back End API Reference
cselib.h
Go to the documentation of this file.
1/* Common subexpression elimination for GNU compiler.
2 Copyright (C) 1987-2026 Free Software Foundation, Inc.
3
4This file is part of GCC.
5
6GCC is free software; you can redistribute it and/or modify it under
7the terms of the GNU General Public License as published by the Free
8Software Foundation; either version 3, or (at your option) any later
9version.
10
11GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or
13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14for more details.
15
16You should have received a copy of the GNU General Public License
17along with GCC; see the file COPYING3. If not see
18<http://www.gnu.org/licenses/>. */
19
20#ifndef GCC_CSELIB_H
21#define GCC_CSELIB_H
22
23/* Describe a value. */
25{
26 /* The hash value. */
27 unsigned int hash;
28
29 /* True if this value is entered in cselib_preserved_hash_table. */
30 unsigned int in_preserved_table_p : 1;
31
32 /* True if every value referenced by every element of LOCS is known
33 to be a preserved value. */
34 unsigned int all_locs_preserved_p : 1;
35
36 /* A VALUE rtx that points back to this structure. */
38
39 /* All rtl expressions that hold this value at the current time during a
40 scan. */
42
43 /* If this value is used as an address, points to a list of values that
44 use it as an address in a MEM. */
46
48};
49
50/* A list of rtl expressions that hold the same value. */
52 /* Next element in the list. */
54 /* An rtl expression that holds the value. */
56 /* The insn that made the equivalence. */
58};
59
60/* Describe a single set that is part of an insn. */
68
74
75extern void (*cselib_discard_hook) (cselib_val *);
76extern void (*cselib_record_sets_hook) (rtx_insn *insn, struct cselib_set *sets,
77 int n_sets);
78
79extern cselib_val *cselib_lookup (rtx, machine_mode,
80 int, machine_mode);
81extern cselib_val *cselib_lookup_from_insn (rtx, machine_mode,
82 int, machine_mode, rtx_insn *);
83extern void cselib_init (int);
84extern void cselib_clear_table (void);
85extern void cselib_finish (void);
86extern void cselib_process_insn (rtx_insn *);
87extern bool fp_setter_insn (rtx_insn *);
88extern machine_mode cselib_reg_set_mode (const_rtx);
89extern bool rtx_equal_for_cselib_1 (rtx, rtx, machine_mode, int);
90extern bool cselib_redundant_set_p (rtx);
91extern bool references_value_p (const_rtx);
93typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *);
98extern rtx cselib_subst_to_values (rtx, machine_mode);
99extern rtx cselib_subst_to_values_from_insn (rtx, machine_mode, rtx_insn *);
100extern void cselib_invalidate_rtx (rtx);
101
102extern void cselib_reset_table (unsigned int);
103extern unsigned int cselib_get_next_uid (void);
104extern void cselib_preserve_value (cselib_val *);
106extern void cselib_preserve_only_values (void);
107extern void cselib_preserve_cfa_base_value (cselib_val *, unsigned int);
109extern bool cselib_have_permanent_equivalences (void);
111extern bool cselib_sp_based_value_p (cselib_val *);
112extern void cselib_record_sp_cfa_base_equiv (HOST_WIDE_INT, rtx_insn *);
114
115extern void dump_cselib_table (FILE *);
116
117/* Return the canonical value for VAL, following the equivalence chain
118 towards the earliest (== lowest uid) equivalent value. */
119
120inline cselib_val *
122{
123 cselib_val *canon;
124
125 if (!val->locs || val->locs->next
126 || !val->locs->loc || GET_CODE (val->locs->loc) != VALUE
127 || CSELIB_VAL_UID (val->val_rtx) < CSELIB_VAL_UID (val->locs->loc))
128 return val;
129
130 canon = CSELIB_VAL_PTR (val->locs->loc);
131 gcc_checking_assert (canonical_cselib_val (canon) == canon);
132 return canon;
133}
134
135/* Return true if we can prove that X and Y contain the same value, taking
136 our gathered information into account. */
137
138inline bool
140{
141 if (x == y)
142 return true;
143
144 return rtx_equal_for_cselib_1 (x, y, VOIDmode, 0);
145}
146
147#endif /* GCC_CSELIB_H */
struct rtx_def * rtx
Definition coretypes.h:57
const struct rtx_def * const_rtx
Definition coretypes.h:58
class bitmap_head * bitmap
Definition coretypes.h:51
void(* cselib_discard_hook)(cselib_val *)
Definition cselib.cc:294
void(* cselib_record_sets_hook)(rtx_insn *insn, struct cselib_set *sets, int n_sets)
Definition cselib.cc:301
void cselib_reset_table(unsigned int)
Definition cselib.cc:573
void cselib_preserve_value(cselib_val *)
Definition cselib.cc:846
rtx cselib_subst_to_values_from_insn(rtx, machine_mode, rtx_insn *)
Definition cselib.cc:2390
cselib_val * cselib_lookup_from_insn(rtx, machine_mode, int, machine_mode, rtx_insn *)
Definition cselib.cc:2540
void cselib_preserve_only_values(void)
Definition cselib.cc:878
bool cselib_have_permanent_equivalences(void)
Definition cselib.cc:2997
bool cselib_dummy_expand_value_rtx_cb(rtx, bitmap, int, cselib_expand_callback, void *)
Definition cselib.cc:1960
void cselib_finish(void)
Definition cselib.cc:3515
cselib_val * cselib_lookup(rtx, machine_mode, int, machine_mode)
Definition cselib.cc:2559
void cselib_set_value_sp_based(cselib_val *)
Definition cselib.cc:896
bool cselib_sp_based_value_p(cselib_val *)
Definition cselib.cc:905
bool fp_setter_insn(rtx_insn *)
Definition cselib.cc:3298
cselib_record_what
Definition cselib.h:70
@ CSELIB_RECORD_MEMORY
Definition cselib.h:71
@ CSELIB_PRESERVE_CONSTANTS
Definition cselib.h:72
bool cselib_preserved_value_p(cselib_val *)
Definition cselib.cc:854
bool rtx_equal_for_cselib_1(rtx, rtx, machine_mode, int)
Definition cselib.cc:1015
rtx cselib_expand_value_rtx_cb(rtx, bitmap, int, cselib_expand_callback, void *)
Definition cselib.cc:1942
rtx(* cselib_expand_callback)(rtx, bitmap, int, void *)
Definition cselib.h:93
void cselib_process_insn(rtx_insn *)
Definition cselib.cc:3342
void cselib_init(int)
Definition cselib.cc:3452
void cselib_record_sp_cfa_base_equiv(HOST_WIDE_INT, rtx_insn *)
Definition cselib.cc:3007
bool references_value_p(const_rtx)
Definition cselib.cc:676
bool cselib_redundant_set_p(rtx)
Definition cselib.cc:1262
void cselib_add_permanent_equiv(cselib_val *, rtx, rtx_insn *)
Definition cselib.cc:2968
rtx cselib_expand_value_rtx(rtx, bitmap, int)
Definition cselib.cc:1923
bool cselib_sp_derived_value_p(cselib_val *)
Definition cselib.cc:3042
bool rtx_equal_for_cselib_p(rtx x, rtx y)
Definition cselib.h:139
void cselib_clear_table(void)
Definition cselib.cc:493
machine_mode cselib_reg_set_mode(const_rtx)
Definition cselib.cc:916
void cselib_invalidate_rtx(rtx)
Definition cselib.cc:2897
cselib_val * canonical_cselib_val(cselib_val *val)
Definition cselib.h:121
void dump_cselib_table(FILE *)
Definition cselib.cc:3627
void cselib_preserve_cfa_base_value(cselib_val *, unsigned int)
Definition cselib.cc:863
rtx cselib_subst_to_values(rtx, machine_mode)
Definition cselib.cc:2259
unsigned int cselib_get_next_uid(void)
Definition cselib.cc:647
#define CSELIB_VAL_UID(RTX)
Definition rtl.h:1630
#define CSELIB_VAL_PTR(RTX)
Definition rtl.h:1627
#define GET_CODE(RTX)
Definition rtl.h:729
Definition cselib.h:62
cselib_val * dest_addr_elt
Definition cselib.h:66
cselib_val * src_elt
Definition cselib.h:65
rtx src
Definition cselib.h:63
rtx dest
Definition cselib.h:64
Definition cselib.h:25
struct elt_loc_list * locs
Definition cselib.h:41
struct elt_list * addr_list
Definition cselib.h:45
rtx val_rtx
Definition cselib.h:37
struct cselib_val * next_containing_mem
Definition cselib.h:47
unsigned int in_preserved_table_p
Definition cselib.h:30
unsigned int hash
Definition cselib.h:27
unsigned int all_locs_preserved_p
Definition cselib.h:34
Definition cselib.cc:41
Definition cselib.h:51
rtx loc
Definition cselib.h:55
struct elt_loc_list * next
Definition cselib.h:53
rtx_insn * setting_insn
Definition cselib.h:57
Definition rtl.h:549
#define gcc_checking_assert(EXPR)
Definition system.h:827
const T2 & y
Definition wide-int.h:3870