]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/gimple-fold.h
[PR105455] Set edge probabilities when hardening conditionals
[thirdparty/gcc.git] / gcc / gimple-fold.h
CommitLineData
cfef45c8
RG
1/* Gimple folding definitions.
2
7adcbafe 3 Copyright (C) 2011-2022 Free Software Foundation, Inc.
cfef45c8
RG
4 Contributed by Richard Guenther <rguenther@suse.de>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
10Software Foundation; either version 3, or (at your option) any later
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for more details.
17
18You should have received a copy of the GNU General Public License
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
21
22#ifndef GCC_GIMPLE_FOLD_H
23#define GCC_GIMPLE_FOLD_H
24
edc19e03 25extern tree create_tmp_reg_or_ssa_name (tree, gimple *stmt = NULL);
744730a4
AM
26extern tree canonicalize_constructor_val (tree, tree);
27extern tree get_symbol_constant_value (tree);
5d6655eb 28struct c_strlen_data;
84de9426 29extern bool get_range_strlen (tree, c_strlen_data *, unsigned eltsize);
744730a4 30extern void gimplify_and_update_call_from_tree (gimple_stmt_iterator *, tree);
52a5515e 31extern bool update_gimple_call (gimple_stmt_iterator *, tree, int, ...);
744730a4 32extern bool fold_stmt (gimple_stmt_iterator *);
e0ee10ed 33extern bool fold_stmt (gimple_stmt_iterator *, tree (*) (tree));
744730a4 34extern bool fold_stmt_inplace (gimple_stmt_iterator *);
5f487a34 35extern tree maybe_fold_and_comparisons (tree, enum tree_code, tree, tree,
fc8d9e44
RB
36 enum tree_code, tree, tree,
37 basic_block = nullptr);
5f487a34 38extern tree maybe_fold_or_comparisons (tree, enum tree_code, tree, tree,
fc8d9e44
RB
39 enum tree_code, tree, tree,
40 basic_block = nullptr);
8e1fe3f7 41extern bool clear_padding_type_may_have_padding_p (tree);
896048cf 42extern void clear_type_padding_in_mask (tree, unsigned char *);
849a76a5
JJ
43extern bool optimize_atomic_compare_exchange_p (gimple *);
44extern void fold_builtin_atomic_compare_exchange (gimple_stmt_iterator *);
1304953e
JJ
45extern bool arith_overflowed_p (enum tree_code, const_tree, const_tree,
46 const_tree);
e0ee10ed 47extern tree no_follow_ssa_edges (tree);
45cc9f96 48extern tree follow_single_use_edges (tree);
c566cc9f 49extern tree follow_all_ssa_edges (tree);
355fe088 50extern tree gimple_fold_stmt_to_constant_1 (gimple *, tree (*) (tree),
d2a85801 51 tree (*) (tree) = no_follow_ssa_edges);
355fe088 52extern tree gimple_fold_stmt_to_constant (gimple *, tree (*) (tree));
35b4d3a6
MS
53extern tree fold_ctor_reference (tree, tree, const poly_uint64&,
54 const poly_uint64&, tree,
55 unsigned HOST_WIDE_INT * = NULL);
744730a4
AM
56extern tree fold_const_aggregate_ref_1 (tree, tree (*) (tree));
57extern tree fold_const_aggregate_ref (tree);
ec77d61f
JH
58extern tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree,
59 bool *can_refer = NULL);
85942f45 60extern tree gimple_get_virt_method_for_vtable (HOST_WIDE_INT, tree,
ec77d61f
JH
61 unsigned HOST_WIDE_INT,
62 bool *can_refer = NULL);
b184c8f1 63extern tree gimple_fold_indirect_ref (tree);
a104bd88
MS
64extern bool gimple_fold_builtin_sprintf (gimple_stmt_iterator *);
65extern bool gimple_fold_builtin_snprintf (gimple_stmt_iterator *);
19e51b40 66extern bool arith_code_with_undefined_signed_overflow (tree_code);
82c8ff79 67extern gimple_seq rewrite_to_defined_overflow (gimple *, bool = false);
e3174bdf 68extern void replace_call_with_value (gimple_stmt_iterator *, tree);
6847c656 69extern tree tree_vec_extract (gimple_stmt_iterator *, tree, tree, tree, tree);
cfef45c8 70
3d2cf79f
RB
71/* gimple_build, functionally matching fold_buildN, outputs stmts
72 int the provided sequence, matching and simplifying them on-the-fly.
73 Supposed to replace force_gimple_operand (fold_buildN (...), ...). */
74extern tree gimple_build (gimple_seq *, location_t,
c26de36d 75 enum tree_code, tree, tree);
3d2cf79f 76extern tree gimple_build (gimple_seq *, location_t,
c26de36d 77 enum tree_code, tree, tree, tree);
3d2cf79f 78extern tree gimple_build (gimple_seq *, location_t,
c26de36d 79 enum tree_code, tree, tree, tree, tree);
684c97dd 80template<class ...Args>
3d2cf79f 81inline tree
684c97dd 82gimple_build (gimple_seq *seq, enum tree_code code, tree type, Args ...ops)
3d2cf79f 83{
684c97dd
RB
84 static_assert (sizeof...(ops) > 0 && sizeof...(ops) <= 3,
85 "Number of operands must be from one to three");
86 return gimple_build (seq, UNKNOWN_LOCATION, code, type, ops...);
3d2cf79f 87}
684c97dd 88
93a73251 89extern tree gimple_build (gimple_seq *, location_t, combined_fn, tree);
eb69361d 90extern tree gimple_build (gimple_seq *, location_t, combined_fn, tree, tree);
eb69361d
RS
91extern tree gimple_build (gimple_seq *, location_t, combined_fn,
92 tree, tree, tree);
eb69361d
RS
93extern tree gimple_build (gimple_seq *, location_t, combined_fn,
94 tree, tree, tree, tree);
684c97dd 95template<class ...Args>
3d2cf79f 96inline tree
684c97dd 97gimple_build (gimple_seq *seq, combined_fn fn, tree type, Args ...args)
3d2cf79f 98{
684c97dd
RB
99 static_assert (sizeof...(args) < 4,
100 "Number of arguments must be less than four");
101 return gimple_build (seq, UNKNOWN_LOCATION, fn, type, args...);
3d2cf79f
RB
102}
103
d4f5cd5e
RB
104extern tree gimple_convert (gimple_seq *, location_t, tree, tree);
105inline tree
106gimple_convert (gimple_seq *seq, tree type, tree op)
107{
108 return gimple_convert (seq, UNKNOWN_LOCATION, type, op);
109}
110
74e3c262
RB
111extern tree gimple_convert_to_ptrofftype (gimple_seq *, location_t, tree);
112inline tree
113gimple_convert_to_ptrofftype (gimple_seq *seq, tree op)
114{
115 return gimple_convert_to_ptrofftype (seq, UNKNOWN_LOCATION, op);
116}
117
e7c45b66
RS
118extern tree gimple_build_vector_from_val (gimple_seq *, location_t, tree,
119 tree);
120inline tree
121gimple_build_vector_from_val (gimple_seq *seq, tree type, tree op)
122{
123 return gimple_build_vector_from_val (seq, UNKNOWN_LOCATION, type, op);
124}
125
abe73c3d
RS
126class tree_vector_builder;
127extern tree gimple_build_vector (gimple_seq *, location_t,
128 tree_vector_builder *);
e7c45b66 129inline tree
abe73c3d 130gimple_build_vector (gimple_seq *seq, tree_vector_builder *builder)
e7c45b66 131{
abe73c3d 132 return gimple_build_vector (seq, UNKNOWN_LOCATION, builder);
e7c45b66
RS
133}
134
93a73251
MM
135extern tree gimple_build_round_up (gimple_seq *, location_t, tree, tree,
136 unsigned HOST_WIDE_INT);
137inline tree
138gimple_build_round_up (gimple_seq *seq, tree type, tree old_size,
139 unsigned HOST_WIDE_INT align)
140{
141 return gimple_build_round_up (seq, UNKNOWN_LOCATION, type, old_size, align);
142}
143
68e57f04 144extern bool gimple_stmt_nonnegative_warnv_p (gimple *, bool *, int = 0);
67dbe582 145extern bool gimple_stmt_integer_valued_real_p (gimple *, int = 0);
68e57f04 146
e53b6e56 147/* In gimple-match.cc. */
3d2cf79f
RB
148extern tree gimple_simplify (enum tree_code, tree, tree,
149 gimple_seq *, tree (*)(tree));
150extern tree gimple_simplify (enum tree_code, tree, tree, tree,
151 gimple_seq *, tree (*)(tree));
152extern tree gimple_simplify (enum tree_code, tree, tree, tree, tree,
153 gimple_seq *, tree (*)(tree));
eb69361d 154extern tree gimple_simplify (combined_fn, tree, tree,
3d2cf79f 155 gimple_seq *, tree (*)(tree));
eb69361d 156extern tree gimple_simplify (combined_fn, tree, tree, tree,
3d2cf79f 157 gimple_seq *, tree (*)(tree));
eb69361d 158extern tree gimple_simplify (combined_fn, tree, tree, tree, tree,
3d2cf79f
RB
159 gimple_seq *, tree (*)(tree));
160
cfef45c8 161#endif /* GCC_GIMPLE_FOLD_H */