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 /* A mask equivalent of HASH's bitfield width. */
27 static const unsigned int HASH_MASK = 0x3fffffff;
28
29 /* The hash value. */
30 unsigned int hash : 30;
31
32 /* True if this value is entered in cselib_preserved_hash_table. */
33 unsigned int in_preserved_table_p : 1;
34
35 /* True if every value referenced by every element of LOCS is known
36 to be a preserved value. */
37 unsigned int all_locs_preserved_p : 1;
38
39 /* A unique id assigned to values. */
40 int uid;
41
42 /* A VALUE rtx that points back to this structure. */
44
45 /* All rtl expressions that hold this value at the current time during a
46 scan. */
48
49 /* If this value is used as an address, points to a list of values that
50 use it as an address in a MEM. */
52
54};
55
56/* A list of rtl expressions that hold the same value. */
58 /* Next element in the list. */
60 /* An rtl expression that holds the value. */
62 /* The insn that made the equivalence. */
64};
65
66/* Describe a single set that is part of an insn. */
74
80
81extern void (*cselib_discard_hook) (cselib_val *);
82extern void (*cselib_record_sets_hook) (rtx_insn *insn, struct cselib_set *sets,
83 int n_sets);
84
85extern cselib_val *cselib_lookup (rtx, machine_mode,
86 int, machine_mode);
87extern cselib_val *cselib_lookup_from_insn (rtx, machine_mode,
88 int, machine_mode, rtx_insn *);
89extern void cselib_init (int);
90extern void cselib_clear_table (void);
91extern void cselib_finish (void);
92extern void cselib_process_insn (rtx_insn *);
93extern bool fp_setter_insn (rtx_insn *);
94extern machine_mode cselib_reg_set_mode (const_rtx);
95extern bool rtx_equal_for_cselib_1 (rtx, rtx, machine_mode, int);
96extern bool cselib_redundant_set_p (rtx);
97extern bool references_value_p (const_rtx);
99typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *);
101 cselib_expand_callback, void *);
103 cselib_expand_callback, void *);
104extern rtx cselib_subst_to_values (rtx, machine_mode);
105extern rtx cselib_subst_to_values_from_insn (rtx, machine_mode, rtx_insn *);
106extern void cselib_invalidate_rtx (rtx);
107
108extern void cselib_reset_table (unsigned int);
109extern unsigned int cselib_get_next_uid (void);
110extern void cselib_preserve_value (cselib_val *);
112extern void cselib_preserve_only_values (void);
113extern void cselib_preserve_cfa_base_value (cselib_val *, unsigned int);
115extern bool cselib_have_permanent_equivalences (void);
117extern bool cselib_sp_based_value_p (cselib_val *);
118extern void cselib_record_sp_cfa_base_equiv (HOST_WIDE_INT, rtx_insn *);
120
121extern void dump_cselib_table (FILE *);
122
123/* Return the canonical value for VAL, following the equivalence chain
124 towards the earliest (== lowest uid) equivalent value. */
125
126inline cselib_val *
128{
129 cselib_val *canon;
130
131 if (!val->locs || val->locs->next
132 || !val->locs->loc || GET_CODE (val->locs->loc) != VALUE
133 || val->uid < CSELIB_VAL_PTR (val->locs->loc)->uid)
134 return val;
135
136 canon = CSELIB_VAL_PTR (val->locs->loc);
137 gcc_checking_assert (canonical_cselib_val (canon) == canon);
138 return canon;
139}
140
141/* Return true if we can prove that X and Y contain the same value, taking
142 our gathered information into account. */
143
144inline bool
146{
147 if (x == y)
148 return true;
149
150 return rtx_equal_for_cselib_1 (x, y, VOIDmode, 0);
151}
152
153#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:572
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:2389
cselib_val * cselib_lookup_from_insn(rtx, machine_mode, int, machine_mode, rtx_insn *)
Definition cselib.cc:2539
void cselib_preserve_only_values(void)
Definition cselib.cc:878
bool cselib_have_permanent_equivalences(void)
Definition cselib.cc:2996
bool cselib_dummy_expand_value_rtx_cb(rtx, bitmap, int, cselib_expand_callback, void *)
Definition cselib.cc:1959
void cselib_finish(void)
Definition cselib.cc:3514
cselib_val * cselib_lookup(rtx, machine_mode, int, machine_mode)
Definition cselib.cc:2558
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:3297
cselib_record_what
Definition cselib.h:76
@ CSELIB_RECORD_MEMORY
Definition cselib.h:77
@ CSELIB_PRESERVE_CONSTANTS
Definition cselib.h:78
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:1941
rtx(* cselib_expand_callback)(rtx, bitmap, int, void *)
Definition cselib.h:99
void cselib_process_insn(rtx_insn *)
Definition cselib.cc:3341
void cselib_init(int)
Definition cselib.cc:3451
void cselib_record_sp_cfa_base_equiv(HOST_WIDE_INT, rtx_insn *)
Definition cselib.cc:3006
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:2967
rtx cselib_expand_value_rtx(rtx, bitmap, int)
Definition cselib.cc:1922
bool cselib_sp_derived_value_p(cselib_val *)
Definition cselib.cc:3041
bool rtx_equal_for_cselib_p(rtx x, rtx y)
Definition cselib.h:145
void cselib_clear_table(void)
Definition cselib.cc:492
machine_mode cselib_reg_set_mode(const_rtx)
Definition cselib.cc:916
void cselib_invalidate_rtx(rtx)
Definition cselib.cc:2896
cselib_val * canonical_cselib_val(cselib_val *val)
Definition cselib.h:127
void dump_cselib_table(FILE *)
Definition cselib.cc:3626
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:2258
unsigned int cselib_get_next_uid(void)
Definition cselib.cc:646
#define CSELIB_VAL_PTR(RTX)
Definition rtl.h:1624
#define GET_CODE(RTX)
Definition rtl.h:726
Definition cselib.h:68
cselib_val * dest_addr_elt
Definition cselib.h:72
cselib_val * src_elt
Definition cselib.h:71
rtx src
Definition cselib.h:69
rtx dest
Definition cselib.h:70
Definition cselib.h:25
int uid
Definition cselib.h:40
struct elt_loc_list * locs
Definition cselib.h:47
struct elt_list * addr_list
Definition cselib.h:51
rtx val_rtx
Definition cselib.h:43
struct cselib_val * next_containing_mem
Definition cselib.h:53
static const unsigned int HASH_MASK
Definition cselib.h:27
unsigned int in_preserved_table_p
Definition cselib.h:33
unsigned int hash
Definition cselib.h:30
unsigned int all_locs_preserved_p
Definition cselib.h:37
Definition cselib.cc:41
Definition cselib.h:57
rtx loc
Definition cselib.h:61
struct elt_loc_list * next
Definition cselib.h:59
rtx_insn * setting_insn
Definition cselib.h:63
Definition rtl.h:546
#define gcc_checking_assert(EXPR)
Definition system.h:824
const T2 & y
Definition wide-int.h:3870