GCC Middle and Back End API Reference
Main Page
Namespaces
Data Structures
Files
File List
Globals
tree-flow.h
Go to the documentation of this file.
1
/* Data and Control Flow Analysis for Trees.
2
Copyright (C) 2001-2013 Free Software Foundation, Inc.
3
Contributed by Diego Novillo <dnovillo@redhat.com>
4
5
This file is part of GCC.
6
7
GCC is free software; you can redistribute it and/or modify
8
it under the terms of the GNU General Public License as published by
9
the Free Software Foundation; either version 3, or (at your option)
10
any later version.
11
12
GCC is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
16
17
You should have received a copy of the GNU General Public License
18
along with GCC; see the file COPYING3. If not see
19
<http://www.gnu.org/licenses/>. */
20
21
#ifndef _TREE_FLOW_H
22
#define _TREE_FLOW_H 1
23
24
#include "
bitmap.h
"
25
#include "
sbitmap.h
"
26
#include "
basic-block.h
"
27
#include "hashtab.h"
28
#include "
gimple.h
"
29
#include "
tree-ssa-operands.h
"
30
#include "
cgraph.h
"
31
#include "
ipa-reference.h
"
32
#include "
tree-ssa-alias.h
"
33
34
35
/* This structure is used to map a gimple statement to a label,
36
or list of labels to represent transaction restart. */
37
38
struct
GTY
(())
tm_restart_node
{
39
gimple
stmt
;
40
tree
label_or_list
;
41
};
42
43
/* Gimple dataflow datastructure. All publicly available fields shall have
44
gimple_ accessor defined in tree-flow-inline.h, all publicly modifiable
45
fields should have gimple_set accessor. */
46
struct
GTY
(())
gimple_df
{
47
/* A vector of all the noreturn calls passed to modify_stmt.
48
cleanup_control_flow uses it to detect cases where a mid-block
49
indirect call has been turned into a noreturn call. When this
50
happens, all the instructions after the call are no longer
51
reachable and must be deleted as dead. */
52
vec<gimple, va_gc>
*
modified_noreturn_calls
;
53
54
/* Array of all SSA_NAMEs used in the function. */
55
vec<tree, va_gc>
*
ssa_names
;
56
57
/* Artificial variable used for the virtual operand FUD chain. */
58
tree
vop
;
59
60
/* The PTA solution for the ESCAPED artificial variable. */
61
struct
pt_solution
escaped
;
62
63
/* A map of decls to artificial ssa-names that point to the partition
64
of the decl. */
65
struct
pointer_map_t
*
GTY
((skip(
""
))) decls_to_pointers;
66
67
/* Free list of SSA_NAMEs. */
68
vec
<
tree
,
va_gc
> *free_ssanames;
69
70
/* Hashtable holding definition for symbol. If this field is not NULL, it
71
means that the first reference to this variable in the function is a
72
USE or a VUSE. In those cases, the SSA renamer creates an SSA name
73
for this variable with an empty defining statement. */
74
htab_t
GTY
((param_is (union tree_node))) default_defs;
75
76
/* True if there are any symbols that need to be renamed. */
77
unsigned
int
ssa_renaming_needed : 1;
78
79
/* True if all virtual operands need to be renamed. */
80
unsigned
int
rename_vops : 1;
81
82
/* True if the code is in ssa form. */
83
unsigned
int
in_ssa_p : 1;
84
85
/* True if IPA points-to information was computed for this function. */
86
unsigned
int
ipa_pta : 1;
87
88
struct
ssa_operands
ssa_operands
;
89
90
/* Map gimple stmt to tree label (or list of labels) for transaction
91
restart and abort. */
92
htab_t
GTY
((param_is (struct
tm_restart_node
))) tm_restart;
93
};
94
95
/* Accessors for internal use only. Generic code should use abstraction
96
provided by tree-flow-inline.h or specific modules. */
97
#define FREE_SSANAMES(fun) (fun)->gimple_df->free_ssanames
98
#define SSANAMES(fun) (fun)->gimple_df->ssa_names
99
#define MODIFIED_NORETURN_CALLS(fun) (fun)->gimple_df->modified_noreturn_calls
100
#define DEFAULT_DEFS(fun) (fun)->gimple_df->default_defs
101
102
typedef
struct
103
{
104
htab_t
htab
;
105
PTR *
slot
;
106
PTR *
limit
;
107
}
htab_iterator
;
108
109
/* Iterate through the elements of hashtable HTAB, using htab_iterator ITER,
110
storing each element in RESULT, which is of type TYPE. */
111
#define FOR_EACH_HTAB_ELEMENT(HTAB, RESULT, TYPE, ITER) \
112
for (RESULT = (TYPE) first_htab_element (&(ITER), (HTAB)); \
113
!end_htab_p (&(ITER)); \
114
RESULT = (TYPE) next_htab_element (&(ITER)))
115
116
/*---------------------------------------------------------------------------
117
Attributes for SSA_NAMEs.
118
119
NOTE: These structures are stored in struct tree_ssa_name
120
but are only used by the tree optimizers, so it makes better sense
121
to declare them here to avoid recompiling unrelated files when
122
making changes.
123
---------------------------------------------------------------------------*/
124
125
/* Aliasing information for SSA_NAMEs representing pointer variables. */
126
127
struct
GTY
(())
ptr_info_def
128
{
129
/* The points-to solution. */
130
struct
pt_solution
pt;
131
132
/* Alignment and misalignment of the pointer in bytes. Together
133
align and misalign specify low known bits of the pointer.
134
ptr & (align - 1) == misalign. */
135
136
/* When known, this is the power-of-two byte alignment of the object this
137
pointer points into. This is usually DECL_ALIGN_UNIT for decls and
138
MALLOC_ABI_ALIGNMENT for allocated storage. When the alignment is not
139
known, it is zero. Do not access directly but use functions
140
get_ptr_info_alignment, set_ptr_info_alignment,
141
mark_ptr_info_alignment_unknown and similar. */
142
unsigned
int
align
;
143
144
/* When alignment is known, the byte offset this pointer differs from the
145
above alignment. Access only through the same helper functions as align
146
above. */
147
unsigned
int
misalign
;
148
};
149
150
151
/* It is advantageous to avoid things like life analysis for variables which
152
do not need PHI nodes. This enum describes whether or not a particular
153
variable may need a PHI node. */
154
155
enum
need_phi_state
{
156
/* This is the default. If we are still in this state after finding
157
all the definition and use sites, then we will assume the variable
158
needs PHI nodes. This is probably an overly conservative assumption. */
159
NEED_PHI_STATE_UNKNOWN
,
160
161
/* This state indicates that we have seen one or more sets of the
162
variable in a single basic block and that the sets dominate all
163
uses seen so far. If after finding all definition and use sites
164
we are still in this state, then the variable does not need any
165
PHI nodes. */
166
NEED_PHI_STATE_NO
,
167
168
/* This state indicates that we have either seen multiple definitions of
169
the variable in multiple blocks, or that we encountered a use in a
170
block that was not dominated by the block containing the set(s) of
171
this variable. This variable is assumed to need PHI nodes. */
172
NEED_PHI_STATE_MAYBE
173
};
174
175
176
/* Immediate use lists are used to directly access all uses for an SSA
177
name and get pointers to the statement for each use.
178
179
The structure ssa_use_operand_d consists of PREV and NEXT pointers
180
to maintain the list. A USE pointer, which points to address where
181
the use is located and a LOC pointer which can point to the
182
statement where the use is located, or, in the case of the root
183
node, it points to the SSA name itself.
184
185
The list is anchored by an occurrence of ssa_operand_d *in* the
186
ssa_name node itself (named 'imm_uses'). This node is uniquely
187
identified by having a NULL USE pointer. and the LOC pointer
188
pointing back to the ssa_name node itself. This node forms the
189
base for a circular list, and initially this is the only node in
190
the list.
191
192
Fast iteration allows each use to be examined, but does not allow
193
any modifications to the uses or stmts.
194
195
Normal iteration allows insertion, deletion, and modification. the
196
iterator manages this by inserting a marker node into the list
197
immediately before the node currently being examined in the list.
198
this marker node is uniquely identified by having null stmt *and* a
199
null use pointer.
200
201
When iterating to the next use, the iteration routines check to see
202
if the node after the marker has changed. if it has, then the node
203
following the marker is now the next one to be visited. if not, the
204
marker node is moved past that node in the list (visualize it as
205
bumping the marker node through the list). this continues until
206
the marker node is moved to the original anchor position. the
207
marker node is then removed from the list.
208
209
If iteration is halted early, the marker node must be removed from
210
the list before continuing. */
211
typedef
struct
immediate_use_iterator_d
212
{
213
/* This is the current use the iterator is processing. */
214
ssa_use_operand_t
*
imm_use
;
215
/* This marks the last use in the list (use node from SSA_NAME) */
216
ssa_use_operand_t
*
end_p
;
217
/* This node is inserted and used to mark the end of the uses for a stmt. */
218
ssa_use_operand_t
iter_node
;
219
/* This is the next ssa_name to visit. IMM_USE may get removed before
220
the next one is traversed to, so it must be cached early. */
221
ssa_use_operand_t
*
next_imm_name
;
222
}
imm_use_iterator
;
223
224
225
/* Use this iterator when simply looking at stmts. Adding, deleting or
226
modifying stmts will cause this iterator to malfunction. */
227
228
#define FOR_EACH_IMM_USE_FAST(DEST, ITER, SSAVAR) \
229
for ((DEST) = first_readonly_imm_use (&(ITER), (SSAVAR)); \
230
!end_readonly_imm_use_p (&(ITER)); \
231
(void) ((DEST) = next_readonly_imm_use (&(ITER))))
232
233
/* Use this iterator to visit each stmt which has a use of SSAVAR. */
234
235
#define FOR_EACH_IMM_USE_STMT(STMT, ITER, SSAVAR) \
236
for ((STMT) = first_imm_use_stmt (&(ITER), (SSAVAR)); \
237
!end_imm_use_stmt_p (&(ITER)); \
238
(void) ((STMT) = next_imm_use_stmt (&(ITER))))
239
240
/* Use this to terminate the FOR_EACH_IMM_USE_STMT loop early. Failure to
241
do so will result in leaving a iterator marker node in the immediate
242
use list, and nothing good will come from that. */
243
#define BREAK_FROM_IMM_USE_STMT(ITER) \
244
{ \
245
end_imm_use_stmt_traverse (&(ITER)); \
246
break; \
247
}
248
249
250
/* Use this iterator in combination with FOR_EACH_IMM_USE_STMT to
251
get access to each occurrence of ssavar on the stmt returned by
252
that iterator.. for instance:
253
254
FOR_EACH_IMM_USE_STMT (stmt, iter, var)
255
{
256
FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
257
{
258
SET_USE (use_p, blah);
259
}
260
update_stmt (stmt);
261
} */
262
263
#define FOR_EACH_IMM_USE_ON_STMT(DEST, ITER) \
264
for ((DEST) = first_imm_use_on_stmt (&(ITER)); \
265
!end_imm_use_on_stmt_p (&(ITER)); \
266
(void) ((DEST) = next_imm_use_on_stmt (&(ITER))))
267
268
269
270
static
inline
void
update_stmt
(
gimple
);
271
static
inline
int
get_lineno
(
const_gimple
);
272
273
/* Accessors for basic block annotations. */
274
static
inline
gimple_seq
phi_nodes
(
const_basic_block
);
275
static
inline
void
set_phi_nodes
(
basic_block
,
gimple_seq
);
276
277
/*---------------------------------------------------------------------------
278
Global declarations
279
---------------------------------------------------------------------------*/
280
struct
int_tree_map
{
281
unsigned
int
uid
;
282
tree
to
;
283
};
284
285
#define num_ssa_names (vec_safe_length (cfun->gimple_df->ssa_names))
286
#define ssa_name(i) ((*cfun->gimple_df->ssa_names)[(i)])
287
288
/* Macros for showing usage statistics. */
289
#define SCALE(x) ((unsigned long) ((x) < 1024*10 \
290
? (x) \
291
: ((x) < 1024*1024*10 \
292
? (x) / 1024 \
293
: (x) / (1024*1024))))
294
295
#define LABEL(x) ((x) < 1024*10 ? 'b' : ((x) < 1024*1024*10 ? 'k' : 'M'))
296
297
#define PERCENT(x,y) ((float)(x) * 100.0 / (float)(y))
298
299
/*---------------------------------------------------------------------------
300
OpenMP Region Tree
301
---------------------------------------------------------------------------*/
302
303
/* Parallel region information. Every parallel and workshare
304
directive is enclosed between two markers, the OMP_* directive
305
and a corresponding OMP_RETURN statement. */
306
307
struct
omp_region
308
{
309
/* The enclosing region. */
310
struct
omp_region
*
outer
;
311
312
/* First child region. */
313
struct
omp_region
*
inner
;
314
315
/* Next peer region. */
316
struct
omp_region
*
next
;
317
318
/* Block containing the omp directive as its last stmt. */
319
basic_block
entry
;
320
321
/* Block containing the OMP_RETURN as its last stmt. */
322
basic_block
exit
;
323
324
/* Block containing the OMP_CONTINUE as its last stmt. */
325
basic_block
cont
;
326
327
/* If this is a combined parallel+workshare region, this is a list
328
of additional arguments needed by the combined parallel+workshare
329
library call. */
330
vec<tree, va_gc>
*
ws_args
;
331
332
/* The code for the omp directive of this region. */
333
enum
gimple_code
type
;
334
335
/* Schedule kind, only used for OMP_FOR type regions. */
336
enum
omp_clause_schedule_kind
sched_kind
;
337
338
/* True if this is a combined parallel+workshare region. */
339
bool
is_combined_parallel
;
340
};
341
342
extern
struct
omp_region
*
root_omp_region
;
343
extern
struct
omp_region
*
new_omp_region
(
basic_block
,
enum
gimple_code
,
344
struct
omp_region
*);
345
extern
void
free_omp_regions
(
void
);
346
void
omp_expand_local
(
basic_block
);
347
tree
copy_var_decl
(tree, tree, tree);
348
349
/*---------------------------------------------------------------------------
350
Function prototypes
351
---------------------------------------------------------------------------*/
352
/* In tree-cfg.c */
353
354
/* Location to track pending stmt for edge insertion. */
355
#define PENDING_STMT(e) ((e)->insns.g)
356
357
extern
void
delete_tree_cfg_annotations
(
void
);
358
extern
bool
stmt_ends_bb_p
(
gimple
);
359
extern
bool
is_ctrl_stmt
(
gimple
);
360
extern
bool
is_ctrl_altering_stmt
(
gimple
);
361
extern
bool
simple_goto_p
(
gimple
);
362
extern
bool
stmt_can_make_abnormal_goto
(
gimple
);
363
extern
basic_block
single_noncomplex_succ
(
basic_block
bb);
364
extern
void
gimple_dump_bb
(FILE *,
basic_block
,
int
,
int
);
365
extern
void
gimple_debug_bb
(
basic_block
);
366
extern
basic_block
gimple_debug_bb_n
(
int
);
367
extern
void
gimple_dump_cfg
(FILE *,
int
);
368
extern
void
gimple_debug_cfg
(
int
);
369
extern
void
dump_cfg_stats
(FILE *);
370
extern
void
dot_cfg
(
void
);
371
extern
void
debug_cfg_stats
(
void
);
372
extern
void
debug_loops
(
int
);
373
extern
void
debug_loop
(
struct
loop
*,
int
);
374
extern
void
debug
(
struct
loop
&ref);
375
extern
void
debug
(
struct
loop
*ptr);
376
extern
void
debug_verbose
(
struct
loop
&ref);
377
extern
void
debug_verbose
(
struct
loop
*ptr);
378
extern
void
debug_loop_num
(
unsigned
,
int
);
379
extern
void
print_loops
(FILE *,
int
);
380
extern
void
print_loops_bb
(FILE *,
basic_block
,
int
,
int
);
381
extern
void
cleanup_dead_labels
(
void
);
382
extern
void
group_case_labels_stmt
(
gimple
);
383
extern
void
group_case_labels
(
void
);
384
extern
gimple
first_stmt
(
basic_block
);
385
extern
gimple
last_stmt
(
basic_block
);
386
extern
gimple
last_and_only_stmt
(
basic_block
);
387
extern
edge
find_taken_edge
(
basic_block
, tree);
388
extern
basic_block
label_to_block_fn
(
struct
function
*, tree);
389
#define label_to_block(t) (label_to_block_fn (cfun, t))
390
extern
void
notice_special_calls
(
gimple
);
391
extern
void
clear_special_calls
(
void
);
392
extern
void
verify_gimple_in_seq
(
gimple_seq
);
393
extern
void
verify_gimple_in_cfg
(
struct
function
*);
394
extern
tree
gimple_block_label
(
basic_block
);
395
extern
void
extract_true_false_edges_from_block
(
basic_block
,
edge
*,
edge
*);
396
extern
bool
gimple_duplicate_sese_region
(
edge
,
edge
,
basic_block
*,
unsigned
,
397
basic_block
*,
bool
);
398
extern
bool
gimple_duplicate_sese_tail
(
edge
,
edge
,
basic_block
*,
unsigned
,
399
basic_block
*);
400
extern
void
gather_blocks_in_sese_region
(
basic_block
entry
,
basic_block
exit
,
401
vec<basic_block>
*bbs_p);
402
extern
void
add_phi_args_after_copy_bb
(
basic_block
);
403
extern
void
add_phi_args_after_copy
(
basic_block
*,
unsigned
,
edge
);
404
extern
bool
gimple_purge_dead_eh_edges
(
basic_block
);
405
extern
bool
gimple_purge_all_dead_eh_edges
(
const_bitmap
);
406
extern
bool
gimple_purge_dead_abnormal_call_edges
(
basic_block
);
407
extern
bool
gimple_purge_all_dead_abnormal_call_edges
(
const_bitmap
);
408
extern
tree
gimplify_build1
(
gimple_stmt_iterator
*,
enum
tree_code
,
409
tree, tree);
410
extern
tree
gimplify_build2
(
gimple_stmt_iterator
*,
enum
tree_code
,
411
tree, tree, tree);
412
extern
tree
gimplify_build3
(
gimple_stmt_iterator
*,
enum
tree_code
,
413
tree, tree, tree, tree);
414
extern
void
init_empty_tree_cfg
(
void
);
415
extern
void
init_empty_tree_cfg_for_function
(
struct
function
*);
416
extern
void
fold_cond_expr_cond
(
void
);
417
extern
void
make_abnormal_goto_edges
(
basic_block
,
bool
);
418
extern
void
replace_uses_by
(tree, tree);
419
extern
void
start_recording_case_labels
(
void
);
420
extern
void
end_recording_case_labels
(
void
);
421
extern
basic_block
move_sese_region_to_fn
(
struct
function
*,
basic_block
,
422
basic_block
, tree);
423
void
remove_edge_and_dominated_blocks
(
edge
);
424
bool
tree_node_can_be_shared
(tree);
425
426
/* In tree-cfgcleanup.c */
427
extern
bitmap
cfgcleanup_altered_bbs
;
428
extern
bool
cleanup_tree_cfg
(
void
);
429
430
/* In tree-pretty-print.c. */
431
extern
void
dump_generic_bb
(FILE *,
basic_block
,
int
,
int
);
432
extern
int
op_code_prio
(
enum
tree_code
);
433
extern
int
op_prio
(
const_tree
);
434
extern
const
char
*
op_symbol_code
(
enum
tree_code
);
435
436
/* In tree-dfa.c */
437
extern
void
renumber_gimple_stmt_uids
(
void
);
438
extern
void
renumber_gimple_stmt_uids_in_blocks
(
basic_block
*,
int
);
439
extern
void
dump_dfa_stats
(FILE *);
440
extern
void
debug_dfa_stats
(
void
);
441
extern
void
dump_variable
(FILE *, tree);
442
extern
void
debug_variable
(tree);
443
extern
void
set_ssa_default_def
(
struct
function
*, tree, tree);
444
extern
tree
ssa_default_def
(
struct
function
*, tree);
445
extern
tree
get_or_create_ssa_default_def
(
struct
function
*, tree);
446
extern
bool
stmt_references_abnormal_ssa_name
(
gimple
);
447
extern
tree
get_addr_base_and_unit_offset
(tree,
HOST_WIDE_INT
*);
448
extern
void
dump_enumerated_decls
(FILE *,
int
);
449
450
/* In tree-phinodes.c */
451
extern
void
reserve_phi_args_for_new_edge
(
basic_block
);
452
extern
void
add_phi_node_to_bb
(
gimple
phi,
basic_block
bb);
453
extern
gimple
create_phi_node
(tree,
basic_block
);
454
extern
void
add_phi_arg
(
gimple
, tree,
edge
, source_location);
455
extern
void
remove_phi_args
(
edge
);
456
extern
void
remove_phi_node
(
gimple_stmt_iterator
*,
bool
);
457
extern
void
remove_phi_nodes
(
basic_block
);
458
extern
void
release_phi_node
(
gimple
);
459
extern
void
phinodes_print_statistics
(
void
);
460
461
/* In gimple-low.c */
462
extern
void
record_vars_into
(tree, tree);
463
extern
void
record_vars
(tree);
464
extern
bool
gimple_seq_may_fallthru
(
gimple_seq
);
465
extern
bool
gimple_stmt_may_fallthru
(
gimple
);
466
extern
bool
gimple_check_call_matching_types
(
gimple
, tree,
bool
);
467
468
469
/* In tree-ssa.c */
470
471
/* Mapping for redirected edges. */
472
struct
_edge_var_map
{
473
tree
result
;
/* PHI result. */
474
tree
def
;
/* PHI arg definition. */
475
source_location
locus
;
/* PHI arg location. */
476
};
477
typedef
struct
_edge_var_map
edge_var_map
;
478
479
480
/* A vector of var maps. */
481
typedef
vec<edge_var_map, va_heap, vl_embed>
edge_var_map_vector
;
482
483
extern
void
init_tree_ssa
(
struct
function
*);
484
extern
void
redirect_edge_var_map_add
(
edge
, tree, tree, source_location);
485
extern
void
redirect_edge_var_map_clear
(
edge
);
486
extern
void
redirect_edge_var_map_dup
(
edge
,
edge
);
487
extern
edge_var_map_vector
*
redirect_edge_var_map_vector
(
edge
);
488
extern
void
redirect_edge_var_map_destroy
(
void
);
489
490
extern
edge
ssa_redirect_edge
(
edge
,
basic_block
);
491
extern
void
flush_pending_stmts
(
edge
);
492
extern
void
verify_ssa
(
bool
);
493
extern
void
delete_tree_ssa
(
void
);
494
extern
bool
ssa_undefined_value_p
(tree);
495
extern
void
warn_uninit
(
enum
opt_code, tree, tree, tree,
const
char
*,
void
*);
496
extern
unsigned
int
warn_uninitialized_vars
(
bool
);
497
extern
void
execute_update_addresses_taken
(
void
);
498
499
/* Call-back function for walk_use_def_chains(). At each reaching
500
definition, a function with this prototype is called. */
501
typedef
bool (*
walk_use_def_chains_fn
) (
tree
,
gimple
,
void
*);
502
503
extern
void
walk_use_def_chains
(tree,
walk_use_def_chains_fn
,
void
*,
bool
);
504
505
void
insert_debug_temps_for_defs
(
gimple_stmt_iterator
*);
506
void
insert_debug_temp_for_var_def
(
gimple_stmt_iterator
*, tree);
507
void
reset_debug_uses
(
gimple
);
508
void
release_defs_bitset
(
bitmap
toremove);
509
510
/* In tree-into-ssa.c */
511
void
update_ssa
(
unsigned
);
512
void
delete_update_ssa
(
void
);
513
tree
create_new_def_for
(tree,
gimple
,
def_operand_p
);
514
bool
need_ssa_update_p
(
struct
function
*);
515
bool
name_registered_for_update_p
(tree);
516
void
release_ssa_name_after_update_ssa
(tree);
517
void
mark_virtual_operands_for_renaming
(
struct
function
*);
518
tree
get_current_def
(tree);
519
void
set_current_def
(tree, tree);
520
521
/* In tree-ssanames.c */
522
extern
void
init_ssanames
(
struct
function
*,
int
);
523
extern
void
fini_ssanames
(
void
);
524
extern
tree
make_ssa_name_fn
(
struct
function
*, tree,
gimple
);
525
extern
tree
copy_ssa_name_fn
(
struct
function
*, tree,
gimple
);
526
extern
tree
duplicate_ssa_name_fn
(
struct
function
*, tree,
gimple
);
527
extern
void
duplicate_ssa_name_ptr_info
(tree,
struct
ptr_info_def
*);
528
extern
void
release_ssa_name
(tree);
529
extern
void
release_defs
(
gimple
);
530
extern
void
replace_ssa_name_symbol
(tree, tree);
531
extern
bool
get_ptr_info_alignment
(
struct
ptr_info_def
*,
unsigned
int
*,
532
unsigned
int
*);
533
extern
void
mark_ptr_info_alignment_unknown
(
struct
ptr_info_def
*);
534
extern
void
set_ptr_info_alignment
(
struct
ptr_info_def
*,
unsigned
int
,
535
unsigned
int
);
536
extern
void
adjust_ptr_info_misalignment
(
struct
ptr_info_def
*,
537
unsigned
int
);
538
539
extern
void
ssanames_print_statistics
(
void
);
540
541
/* In tree-ssa-ccp.c */
542
tree
fold_const_aggregate_ref
(tree);
543
tree
gimple_fold_stmt_to_constant
(
gimple
, tree (*)(tree));
544
545
/* In tree-ssa-dom.c */
546
extern
void
dump_dominator_optimization_stats
(FILE *);
547
extern
void
debug_dominator_optimization_stats
(
void
);
548
int
loop_depth_of_name
(tree);
549
tree
degenerate_phi_result
(
gimple
);
550
bool
simple_iv_increment_p
(
gimple
);
551
552
/* In tree-ssa-copy.c */
553
extern
void
propagate_value
(
use_operand_p
, tree);
554
extern
void
propagate_tree_value
(tree *, tree);
555
extern
void
propagate_tree_value_into_stmt
(
gimple_stmt_iterator
*, tree);
556
extern
void
replace_exp
(
use_operand_p
, tree);
557
extern
bool
may_propagate_copy
(tree, tree);
558
extern
bool
may_propagate_copy_into_stmt
(
gimple
, tree);
559
extern
bool
may_propagate_copy_into_asm
(tree);
560
561
/* In tree-ssa-loop-ch.c */
562
bool
do_while_loop_p
(
struct
loop
*);
563
564
/* Affine iv. */
565
566
typedef
struct
567
{
568
/* Iv = BASE + STEP * i. */
569
tree base,
step
;
570
571
/* True if this iv does not overflow. */
572
bool
no_overflow
;
573
}
affine_iv
;
574
575
/* Description of number of iterations of a loop. All the expressions inside
576
the structure can be evaluated at the end of the loop's preheader
577
(and due to ssa form, also anywhere inside the body of the loop). */
578
579
struct
tree_niter_desc
580
{
581
tree
assumptions
;
/* The boolean expression. If this expression evaluates
582
to false, then the other fields in this structure
583
should not be used; there is no guarantee that they
584
will be correct. */
585
tree
may_be_zero
;
/* The boolean expression. If it evaluates to true,
586
the loop will exit in the first iteration (i.e.
587
its latch will not be executed), even if the niter
588
field says otherwise. */
589
tree
niter
;
/* The expression giving the number of iterations of
590
a loop (provided that assumptions == true and
591
may_be_zero == false), more precisely the number
592
of executions of the latch of the loop. */
593
double_int
max
;
/* The upper bound on the number of iterations of
594
the loop. */
595
596
/* The simplified shape of the exit condition. The loop exits if
597
CONTROL CMP BOUND is false, where CMP is one of NE_EXPR,
598
LT_EXPR, or GT_EXPR, and step of CONTROL is positive if CMP is
599
LE_EXPR and negative if CMP is GE_EXPR. This information is used
600
by loop unrolling. */
601
affine_iv
control
;
602
tree
bound
;
603
enum
tree_code
cmp
;
604
};
605
606
/* In tree-ssa-phiopt.c */
607
bool
empty_block_p
(
basic_block
);
608
basic_block
*
blocks_in_phiopt_order
(
void
);
609
bool
nonfreeing_call_p
(
gimple
);
610
611
/* In tree-ssa-loop*.c */
612
613
unsigned
int
tree_ssa_lim
(
void
);
614
unsigned
int
tree_ssa_unswitch_loops
(
void
);
615
unsigned
int
canonicalize_induction_variables
(
void
);
616
unsigned
int
tree_unroll_loops_completely
(
bool
,
bool
);
617
unsigned
int
tree_ssa_prefetch_arrays
(
void
);
618
void
tree_ssa_iv_optimize
(
void
);
619
unsigned
tree_predictive_commoning
(
void
);
620
tree
canonicalize_loop_ivs
(
struct
loop
*, tree *,
bool
);
621
bool
parallelize_loops
(
void
);
622
623
bool
loop_only_exit_p
(
const
struct
loop
*,
const_edge
);
624
bool
number_of_iterations_exit
(
struct
loop
*,
edge
,
625
struct
tree_niter_desc
*niter,
bool
,
626
bool
every_iteration =
true
);
627
tree
find_loop_niter
(
struct
loop
*,
edge
*);
628
tree
loop_niter_by_eval
(
struct
loop
*,
edge
);
629
tree
find_loop_niter_by_eval
(
struct
loop
*,
edge
*);
630
void
estimate_numbers_of_iterations
(
void
);
631
bool
scev_probably_wraps_p
(tree, tree,
gimple
,
struct
loop
*,
bool
);
632
bool
convert_affine_scev
(
struct
loop
*, tree, tree *, tree *,
gimple
,
bool
);
633
634
bool
nowrap_type_p
(tree);
635
enum
ev_direction
{
EV_DIR_GROWS
,
EV_DIR_DECREASES
,
EV_DIR_UNKNOWN
};
636
enum
ev_direction
scev_direction
(
const_tree
);
637
638
void
free_numbers_of_iterations_estimates
(
void
);
639
void
free_numbers_of_iterations_estimates_loop
(
struct
loop
*);
640
void
rewrite_into_loop_closed_ssa
(
bitmap
,
unsigned
);
641
void
verify_loop_closed_ssa
(
bool
);
642
bool
for_each_index
(tree *,
bool
(*) (tree, tree *,
void
*),
void
*);
643
void
create_iv
(tree, tree, tree,
struct
loop
*,
gimple_stmt_iterator
*,
bool
,
644
tree *, tree *);
645
basic_block
split_loop_exit_edge
(
edge
);
646
void
standard_iv_increment_position
(
struct
loop
*,
gimple_stmt_iterator
*,
647
bool
*);
648
basic_block
ip_end_pos
(
struct
loop
*);
649
basic_block
ip_normal_pos
(
struct
loop
*);
650
bool
gimple_duplicate_loop_to_header_edge
(
struct
loop
*,
edge
,
651
unsigned
int
,
sbitmap
,
652
edge
,
vec<edge>
*,
653
int
);
654
struct
loop
*
slpeel_tree_duplicate_loop_to_edge_cfg
(
struct
loop
*,
edge
);
655
tree
expand_simple_operations
(tree);
656
void
substitute_in_loop_info
(
struct
loop
*, tree, tree);
657
edge
single_dom_exit
(
struct
loop
*);
658
bool
can_unroll_loop_p
(
struct
loop
*
loop
,
unsigned
factor,
659
struct
tree_niter_desc
*niter);
660
void
tree_unroll_loop
(
struct
loop
*,
unsigned
,
661
edge
,
struct
tree_niter_desc
*);
662
typedef
void (*
transform_callback
)(
struct
loop
*,
void
*);
663
void
tree_transform_and_unroll_loop
(
struct
loop
*,
unsigned
,
664
edge
,
struct
tree_niter_desc
*,
665
transform_callback
,
void
*);
666
bool
contains_abnormal_ssa_name_p
(tree);
667
bool
stmt_dominates_stmt_p
(
gimple
,
gimple
);
668
669
/* In tree-ssa-dce.c */
670
void
mark_virtual_operand_for_renaming
(tree);
671
void
mark_virtual_phi_result_for_renaming
(
gimple
);
672
673
/* In tree-ssa-threadedge.c */
674
extern
void
threadedge_initialize_values
(
void
);
675
extern
void
threadedge_finalize_values
(
void
);
676
extern
vec<tree>
ssa_name_values
;
677
#define SSA_NAME_VALUE(x) \
678
(SSA_NAME_VERSION(x) < ssa_name_values.length () \
679
? ssa_name_values[SSA_NAME_VERSION(x)] \
680
: NULL_TREE)
681
extern
void
set_ssa_name_value
(tree, tree);
682
extern
bool
potentially_threadable_block
(
basic_block
);
683
extern
void
thread_across_edge
(
gimple
,
edge
,
bool
,
684
vec<tree>
*, tree (*) (
gimple
,
gimple
));
685
extern
void
propagate_threaded_block_debug_into
(
basic_block
,
basic_block
);
686
687
/* In tree-ssa-loop-im.c */
688
/* The possibilities of statement movement. */
689
690
enum
move_pos
691
{
692
MOVE_IMPOSSIBLE
,
/* No movement -- side effect expression. */
693
MOVE_PRESERVE_EXECUTION
,
/* Must not cause the non-executed statement
694
become executed -- memory accesses, ... */
695
MOVE_POSSIBLE
/* Unlimited movement. */
696
};
697
extern
enum
move_pos
movement_possibility
(
gimple
);
698
char
*
get_lsm_tmp_name
(tree,
unsigned
);
699
700
/* In tree-flow-inline.h */
701
static
inline
bool
unmodifiable_var_p
(
const_tree
);
702
static
inline
bool
ref_contains_array_ref
(
const_tree
);
703
704
/* In tree-eh.c */
705
extern
void
make_eh_edges
(
gimple
);
706
extern
bool
make_eh_dispatch_edges
(
gimple
);
707
extern
edge
redirect_eh_edge
(
edge
,
basic_block
);
708
extern
void
redirect_eh_dispatch_edge
(
gimple
,
edge
,
basic_block
);
709
extern
bool
stmt_could_throw_p
(
gimple
);
710
extern
bool
stmt_can_throw_internal
(
gimple
);
711
extern
bool
stmt_can_throw_external
(
gimple
);
712
extern
void
add_stmt_to_eh_lp_fn
(
struct
function
*,
gimple
,
int
);
713
extern
void
add_stmt_to_eh_lp
(
gimple
,
int
);
714
extern
bool
remove_stmt_from_eh_lp
(
gimple
);
715
extern
bool
remove_stmt_from_eh_lp_fn
(
struct
function
*,
gimple
);
716
extern
int
lookup_stmt_eh_lp_fn
(
struct
function
*,
gimple
);
717
extern
int
lookup_stmt_eh_lp
(
gimple
);
718
extern
bool
maybe_clean_eh_stmt_fn
(
struct
function
*,
gimple
);
719
extern
bool
maybe_clean_eh_stmt
(
gimple
);
720
extern
bool
maybe_clean_or_replace_eh_stmt
(
gimple
,
gimple
);
721
extern
bool
maybe_duplicate_eh_stmt_fn
(
struct
function
*,
gimple
,
722
struct
function
*,
gimple
,
723
struct
pointer_map_t
*,
int
);
724
extern
bool
maybe_duplicate_eh_stmt
(
gimple
,
gimple
);
725
extern
bool
verify_eh_edges
(
gimple
);
726
extern
bool
verify_eh_dispatch_edge
(
gimple
);
727
extern
void
maybe_remove_unreachable_handlers
(
void
);
728
729
/* In tree-ssa-pre.c */
730
void
debug_value_expressions
(
unsigned
int
);
731
732
/* In tree-loop-linear.c */
733
extern
void
linear_transform_loops
(
void
);
734
extern
unsigned
perfect_loop_nest_depth
(
struct
loop
*);
735
736
/* In graphite.c */
737
extern
void
graphite_transform_loops
(
void
);
738
739
/* In tree-data-ref.c */
740
extern
void
tree_check_data_deps
(
void
);
741
742
/* In tree-ssa-loop-ivopts.c */
743
bool
expr_invariant_in_loop_p
(
struct
loop
*, tree);
744
bool
stmt_invariant_in_loop_p
(
struct
loop
*,
gimple
);
745
struct
loop
*
outermost_invariant_loop_for_expr
(
struct
loop
*, tree);
746
bool
multiplier_allowed_in_address_p
(
HOST_WIDE_INT
,
enum
machine_mode,
747
addr_space_t
);
748
bool
may_be_nonaddressable_p
(tree
expr
);
749
750
/* In tree-ssa-threadupdate.c. */
751
extern
bool
thread_through_all_blocks
(
bool
);
752
extern
void
register_jump_thread
(
vec<edge>
);
753
754
/* In gimplify.c */
755
tree
force_gimple_operand_1
(tree,
gimple_seq
*,
gimple_predicate
, tree);
756
tree
force_gimple_operand
(tree,
gimple_seq
*,
bool
, tree);
757
tree
force_gimple_operand_gsi_1
(
gimple_stmt_iterator
*, tree,
758
gimple_predicate
, tree,
759
bool
,
enum
gsi_iterator_update
);
760
tree
force_gimple_operand_gsi
(
gimple_stmt_iterator
*, tree,
bool
, tree,
761
bool
,
enum
gsi_iterator_update
);
762
tree
gimple_fold_indirect_ref
(tree);
763
764
/* In tree-ssa-live.c */
765
extern
void
remove_unused_locals
(
void
);
766
extern
void
dump_scope_blocks
(FILE *,
int
);
767
extern
void
debug_scope_blocks
(
int
);
768
extern
void
debug_scope_block
(tree,
int
);
769
770
/* In tree-ssa-address.c */
771
772
/* Description of a memory address. */
773
774
struct
mem_address
775
{
776
tree
symbol
, base, index, step,
offset
;
777
};
778
779
struct
affine_tree_combination
;
780
tree
create_mem_ref
(
gimple_stmt_iterator
*, tree,
781
struct
affine_tree_combination
*, tree, tree, tree,
bool
);
782
rtx
addr_for_mem_ref
(
struct
mem_address
*,
addr_space_t
,
bool
);
783
void
get_address_description
(tree,
struct
mem_address
*);
784
tree
maybe_fold_tmr
(tree);
785
786
unsigned
int
execute_fixup_cfg
(
void
);
787
bool
fixup_noreturn_call
(
gimple
stmt);
788
789
/* In ipa-pure-const.c */
790
void
warn_function_noreturn
(tree);
791
792
/* In tree-ssa-ter.c */
793
bool
stmt_is_replaceable_p
(
gimple
);
794
795
/* In tree-parloops.c */
796
bool
parallelized_function_p
(tree);
797
798
#include "
tree-flow-inline.h
"
799
800
void
swap_tree_operands
(
gimple
, tree *, tree *);
801
802
#endif
/* _TREE_FLOW_H */
gcc
tree-flow.h
Generated by
1.8.1.1