1 /* Data flow functions for trees.
2 Copyright (C) 2001-2015 Free Software Foundation, Inc.
3 Contributed by Diego Novillo <dnovillo@redhat.com>
5 This file is part of GCC.
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)
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.
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/>. */
23 #include "coretypes.h"
29 #include "double-int.h"
36 #include "fold-const.h"
37 #include "stor-layout.h"
40 #include "hard-reg-set.h"
42 #include "dominance.h"
44 #include "basic-block.h"
45 #include "langhooks.h"
47 #include "tree-pretty-print.h"
48 #include "tree-ssa-alias.h"
49 #include "internal-fn.h"
50 #include "gimple-expr.h"
53 #include "gimple-iterator.h"
54 #include "gimple-walk.h"
55 #include "gimple-ssa.h"
56 #include "tree-phinodes.h"
57 #include "ssa-iterators.h"
58 #include "stringpool.h"
59 #include "tree-ssanames.h"
61 #include "statistics.h"
63 #include "fixed-value.h"
64 #include "insn-config.h"
74 #include "tree-inline.h"
75 #include "tree-pass.h"
78 /* Build and maintain data flow information for trees. */
80 /* Counters used to display DFA and SSA statistics. */
87 size_t max_num_phi_args
;
93 /* Local functions. */
94 static void collect_dfa_stats (struct dfa_stats_d
*);
97 /*---------------------------------------------------------------------------
98 Dataflow analysis (DFA) routines
99 ---------------------------------------------------------------------------*/
101 /* Renumber all of the gimple stmt uids. */
104 renumber_gimple_stmt_uids (void)
108 set_gimple_stmt_max_uid (cfun
, 0);
109 FOR_ALL_BB_FN (bb
, cfun
)
111 gimple_stmt_iterator bsi
;
112 for (bsi
= gsi_start_phis (bb
); !gsi_end_p (bsi
); gsi_next (&bsi
))
114 gimple stmt
= gsi_stmt (bsi
);
115 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (cfun
));
117 for (bsi
= gsi_start_bb (bb
); !gsi_end_p (bsi
); gsi_next (&bsi
))
119 gimple stmt
= gsi_stmt (bsi
);
120 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (cfun
));
125 /* Like renumber_gimple_stmt_uids, but only do work on the basic blocks
126 in BLOCKS, of which there are N_BLOCKS. Also renumbers PHIs. */
129 renumber_gimple_stmt_uids_in_blocks (basic_block
*blocks
, int n_blocks
)
133 set_gimple_stmt_max_uid (cfun
, 0);
134 for (i
= 0; i
< n_blocks
; i
++)
136 basic_block bb
= blocks
[i
];
137 gimple_stmt_iterator bsi
;
138 for (bsi
= gsi_start_phis (bb
); !gsi_end_p (bsi
); gsi_next (&bsi
))
140 gimple stmt
= gsi_stmt (bsi
);
141 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (cfun
));
143 for (bsi
= gsi_start_bb (bb
); !gsi_end_p (bsi
); gsi_next (&bsi
))
145 gimple stmt
= gsi_stmt (bsi
);
146 gimple_set_uid (stmt
, inc_gimple_stmt_max_uid (cfun
));
153 /*---------------------------------------------------------------------------
155 ---------------------------------------------------------------------------*/
157 /* Dump variable VAR and its may-aliases to FILE. */
160 dump_variable (FILE *file
, tree var
)
162 if (TREE_CODE (var
) == SSA_NAME
)
164 if (POINTER_TYPE_P (TREE_TYPE (var
)))
165 dump_points_to_info_for (file
, var
);
166 var
= SSA_NAME_VAR (var
);
169 if (var
== NULL_TREE
)
171 fprintf (file
, "<nil>");
175 print_generic_expr (file
, var
, dump_flags
);
177 fprintf (file
, ", UID D.%u", (unsigned) DECL_UID (var
));
178 if (DECL_PT_UID (var
) != DECL_UID (var
))
179 fprintf (file
, ", PT-UID D.%u", (unsigned) DECL_PT_UID (var
));
181 fprintf (file
, ", ");
182 print_generic_expr (file
, TREE_TYPE (var
), dump_flags
);
184 if (TREE_ADDRESSABLE (var
))
185 fprintf (file
, ", is addressable");
187 if (is_global_var (var
))
188 fprintf (file
, ", is global");
190 if (TREE_THIS_VOLATILE (var
))
191 fprintf (file
, ", is volatile");
193 if (cfun
&& ssa_default_def (cfun
, var
))
195 fprintf (file
, ", default def: ");
196 print_generic_expr (file
, ssa_default_def (cfun
, var
), dump_flags
);
199 if (DECL_INITIAL (var
))
201 fprintf (file
, ", initial: ");
202 print_generic_expr (file
, DECL_INITIAL (var
), dump_flags
);
205 fprintf (file
, "\n");
209 /* Dump variable VAR and its may-aliases to stderr. */
212 debug_variable (tree var
)
214 dump_variable (stderr
, var
);
218 /* Dump various DFA statistics to FILE. */
221 dump_dfa_stats (FILE *file
)
223 struct dfa_stats_d dfa_stats
;
225 unsigned long size
, total
= 0;
226 const char * const fmt_str
= "%-30s%-13s%12s\n";
227 const char * const fmt_str_1
= "%-30s%13lu%11lu%c\n";
228 const char * const fmt_str_3
= "%-43s%11lu%c\n";
230 = lang_hooks
.decl_printable_name (current_function_decl
, 2);
232 collect_dfa_stats (&dfa_stats
);
234 fprintf (file
, "\nDFA Statistics for %s\n\n", funcname
);
236 fprintf (file
, "---------------------------------------------------------\n");
237 fprintf (file
, fmt_str
, "", " Number of ", "Memory");
238 fprintf (file
, fmt_str
, "", " instances ", "used ");
239 fprintf (file
, "---------------------------------------------------------\n");
241 size
= dfa_stats
.num_uses
* sizeof (tree
*);
243 fprintf (file
, fmt_str_1
, "USE operands", dfa_stats
.num_uses
,
244 SCALE (size
), LABEL (size
));
246 size
= dfa_stats
.num_defs
* sizeof (tree
*);
248 fprintf (file
, fmt_str_1
, "DEF operands", dfa_stats
.num_defs
,
249 SCALE (size
), LABEL (size
));
251 size
= dfa_stats
.num_vuses
* sizeof (tree
*);
253 fprintf (file
, fmt_str_1
, "VUSE operands", dfa_stats
.num_vuses
,
254 SCALE (size
), LABEL (size
));
256 size
= dfa_stats
.num_vdefs
* sizeof (tree
*);
258 fprintf (file
, fmt_str_1
, "VDEF operands", dfa_stats
.num_vdefs
,
259 SCALE (size
), LABEL (size
));
261 size
= dfa_stats
.num_phis
* sizeof (struct gphi
);
263 fprintf (file
, fmt_str_1
, "PHI nodes", dfa_stats
.num_phis
,
264 SCALE (size
), LABEL (size
));
266 size
= dfa_stats
.num_phi_args
* sizeof (struct phi_arg_d
);
268 fprintf (file
, fmt_str_1
, "PHI arguments", dfa_stats
.num_phi_args
,
269 SCALE (size
), LABEL (size
));
271 fprintf (file
, "---------------------------------------------------------\n");
272 fprintf (file
, fmt_str_3
, "Total memory used by DFA/SSA data", SCALE (total
),
274 fprintf (file
, "---------------------------------------------------------\n");
275 fprintf (file
, "\n");
277 if (dfa_stats
.num_phis
)
278 fprintf (file
, "Average number of arguments per PHI node: %.1f (max: %ld)\n",
279 (float) dfa_stats
.num_phi_args
/ (float) dfa_stats
.num_phis
,
280 (long) dfa_stats
.max_num_phi_args
);
282 fprintf (file
, "\n");
286 /* Dump DFA statistics on stderr. */
289 debug_dfa_stats (void)
291 dump_dfa_stats (stderr
);
295 /* Collect DFA statistics and store them in the structure pointed to by
299 collect_dfa_stats (struct dfa_stats_d
*dfa_stats_p ATTRIBUTE_UNUSED
)
303 gcc_assert (dfa_stats_p
);
305 memset ((void *)dfa_stats_p
, 0, sizeof (struct dfa_stats_d
));
307 /* Walk all the statements in the function counting references. */
308 FOR_EACH_BB_FN (bb
, cfun
)
310 for (gphi_iterator si
= gsi_start_phis (bb
); !gsi_end_p (si
);
313 gphi
*phi
= si
.phi ();
314 dfa_stats_p
->num_phis
++;
315 dfa_stats_p
->num_phi_args
+= gimple_phi_num_args (phi
);
316 if (gimple_phi_num_args (phi
) > dfa_stats_p
->max_num_phi_args
)
317 dfa_stats_p
->max_num_phi_args
= gimple_phi_num_args (phi
);
320 for (gimple_stmt_iterator si
= gsi_start_bb (bb
); !gsi_end_p (si
);
323 gimple stmt
= gsi_stmt (si
);
324 dfa_stats_p
->num_defs
+= NUM_SSA_OPERANDS (stmt
, SSA_OP_DEF
);
325 dfa_stats_p
->num_uses
+= NUM_SSA_OPERANDS (stmt
, SSA_OP_USE
);
326 dfa_stats_p
->num_vdefs
+= gimple_vdef (stmt
) ? 1 : 0;
327 dfa_stats_p
->num_vuses
+= gimple_vuse (stmt
) ? 1 : 0;
333 /*---------------------------------------------------------------------------
334 Miscellaneous helpers
335 ---------------------------------------------------------------------------*/
337 /* Lookup VAR UID in the default_defs hashtable and return the associated
341 ssa_default_def (struct function
*fn
, tree var
)
343 struct tree_decl_minimal ind
;
344 struct tree_ssa_name in
;
345 gcc_assert (TREE_CODE (var
) == VAR_DECL
346 || TREE_CODE (var
) == PARM_DECL
347 || TREE_CODE (var
) == RESULT_DECL
);
349 ind
.uid
= DECL_UID (var
);
350 return DEFAULT_DEFS (fn
)->find_with_hash ((tree
)&in
, DECL_UID (var
));
353 /* Insert the pair VAR's UID, DEF into the default_defs hashtable
357 set_ssa_default_def (struct function
*fn
, tree var
, tree def
)
359 struct tree_decl_minimal ind
;
360 struct tree_ssa_name in
;
362 gcc_assert (TREE_CODE (var
) == VAR_DECL
363 || TREE_CODE (var
) == PARM_DECL
364 || TREE_CODE (var
) == RESULT_DECL
);
366 ind
.uid
= DECL_UID (var
);
369 tree
*loc
= DEFAULT_DEFS (fn
)->find_slot_with_hash ((tree
)&in
,
374 SSA_NAME_IS_DEFAULT_DEF (*(tree
*)loc
) = false;
375 DEFAULT_DEFS (fn
)->clear_slot (loc
);
379 gcc_assert (TREE_CODE (def
) == SSA_NAME
&& SSA_NAME_VAR (def
) == var
);
380 tree
*loc
= DEFAULT_DEFS (fn
)->find_slot_with_hash ((tree
)&in
,
381 DECL_UID (var
), INSERT
);
383 /* Default definition might be changed by tail call optimization. */
385 SSA_NAME_IS_DEFAULT_DEF (*loc
) = false;
387 /* Mark DEF as the default definition for VAR. */
389 SSA_NAME_IS_DEFAULT_DEF (def
) = true;
392 /* Retrieve or create a default definition for VAR. */
395 get_or_create_ssa_default_def (struct function
*fn
, tree var
)
397 tree ddef
= ssa_default_def (fn
, var
);
398 if (ddef
== NULL_TREE
)
400 ddef
= make_ssa_name_fn (fn
, var
, gimple_build_nop ());
401 set_ssa_default_def (fn
, var
, ddef
);
407 /* If EXP is a handled component reference for a structure, return the
408 base variable. The access range is delimited by bit positions *POFFSET and
409 *POFFSET + *PMAX_SIZE. The access size is *PSIZE bits. If either
410 *PSIZE or *PMAX_SIZE is -1, they could not be determined. If *PSIZE
411 and *PMAX_SIZE are equal, the access is non-variable. */
414 get_ref_base_and_extent (tree exp
, HOST_WIDE_INT
*poffset
,
415 HOST_WIDE_INT
*psize
,
416 HOST_WIDE_INT
*pmax_size
)
418 offset_int bitsize
= -1;
420 tree size_tree
= NULL_TREE
;
421 offset_int bit_offset
= 0;
422 bool seen_variable_array_ref
= false;
424 /* First get the final access size from just the outermost expression. */
425 if (TREE_CODE (exp
) == COMPONENT_REF
)
426 size_tree
= DECL_SIZE (TREE_OPERAND (exp
, 1));
427 else if (TREE_CODE (exp
) == BIT_FIELD_REF
)
428 size_tree
= TREE_OPERAND (exp
, 1);
429 else if (!VOID_TYPE_P (TREE_TYPE (exp
)))
431 machine_mode mode
= TYPE_MODE (TREE_TYPE (exp
));
433 size_tree
= TYPE_SIZE (TREE_TYPE (exp
));
435 bitsize
= int (GET_MODE_PRECISION (mode
));
437 if (size_tree
!= NULL_TREE
438 && TREE_CODE (size_tree
) == INTEGER_CST
)
439 bitsize
= wi::to_offset (size_tree
);
441 /* Initially, maxsize is the same as the accessed element size.
442 In the following it will only grow (or become -1). */
445 /* Compute cumulative bit-offset for nested component-refs and array-refs,
446 and find the ultimate containing object. */
449 switch (TREE_CODE (exp
))
452 bit_offset
+= wi::to_offset (TREE_OPERAND (exp
, 2));
457 tree field
= TREE_OPERAND (exp
, 1);
458 tree this_offset
= component_ref_field_offset (exp
);
460 if (this_offset
&& TREE_CODE (this_offset
) == INTEGER_CST
)
462 offset_int woffset
= wi::lshift (wi::to_offset (this_offset
),
464 woffset
+= wi::to_offset (DECL_FIELD_BIT_OFFSET (field
));
465 bit_offset
+= woffset
;
467 /* If we had seen a variable array ref already and we just
468 referenced the last field of a struct or a union member
469 then we have to adjust maxsize by the padding at the end
471 if (seen_variable_array_ref
&& maxsize
!= -1)
473 tree stype
= TREE_TYPE (TREE_OPERAND (exp
, 0));
474 tree next
= DECL_CHAIN (field
);
475 while (next
&& TREE_CODE (next
) != FIELD_DECL
)
476 next
= DECL_CHAIN (next
);
478 || TREE_CODE (stype
) != RECORD_TYPE
)
480 tree fsize
= DECL_SIZE_UNIT (field
);
481 tree ssize
= TYPE_SIZE_UNIT (stype
);
483 || TREE_CODE (fsize
) != INTEGER_CST
485 || TREE_CODE (ssize
) != INTEGER_CST
)
489 offset_int tem
= (wi::to_offset (ssize
)
490 - wi::to_offset (fsize
));
491 tem
= wi::lshift (tem
, LOG2_BITS_PER_UNIT
);
500 tree csize
= TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp
, 0)));
501 /* We need to adjust maxsize to the whole structure bitsize.
502 But we can subtract any constant offset seen so far,
503 because that would get us out of the structure otherwise. */
506 && TREE_CODE (csize
) == INTEGER_CST
)
507 maxsize
= wi::to_offset (csize
) - bit_offset
;
515 case ARRAY_RANGE_REF
:
517 tree index
= TREE_OPERAND (exp
, 1);
518 tree low_bound
, unit_size
;
520 /* If the resulting bit-offset is constant, track it. */
521 if (TREE_CODE (index
) == INTEGER_CST
522 && (low_bound
= array_ref_low_bound (exp
),
523 TREE_CODE (low_bound
) == INTEGER_CST
)
524 && (unit_size
= array_ref_element_size (exp
),
525 TREE_CODE (unit_size
) == INTEGER_CST
))
528 = wi::sext (wi::to_offset (index
) - wi::to_offset (low_bound
),
529 TYPE_PRECISION (TREE_TYPE (index
)));
530 woffset
*= wi::to_offset (unit_size
);
531 woffset
= wi::lshift (woffset
, LOG2_BITS_PER_UNIT
);
532 bit_offset
+= woffset
;
534 /* An array ref with a constant index up in the structure
535 hierarchy will constrain the size of any variable array ref
536 lower in the access hierarchy. */
537 seen_variable_array_ref
= false;
541 tree asize
= TYPE_SIZE (TREE_TYPE (TREE_OPERAND (exp
, 0)));
542 /* We need to adjust maxsize to the whole array bitsize.
543 But we can subtract any constant offset seen so far,
544 because that would get us outside of the array otherwise. */
547 && TREE_CODE (asize
) == INTEGER_CST
)
548 maxsize
= wi::to_offset (asize
) - bit_offset
;
552 /* Remember that we have seen an array ref with a variable
554 seen_variable_array_ref
= true;
563 bit_offset
+= bitsize
;
566 case VIEW_CONVERT_EXPR
:
570 /* Via the variable index or index2 we can reach the
571 whole object. Still hand back the decl here. */
572 if (TREE_CODE (TMR_BASE (exp
)) == ADDR_EXPR
573 && (TMR_INDEX (exp
) || TMR_INDEX2 (exp
)))
575 exp
= TREE_OPERAND (TMR_BASE (exp
), 0);
582 /* We need to deal with variable arrays ending structures such as
583 struct { int length; int a[1]; } x; x.a[d]
584 struct { struct { int a; int b; } a[1]; } x; x.a[d].a
585 struct { struct { int a[1]; } a[1]; } x; x.a[0][d], x.a[d][0]
586 struct { int len; union { int a[1]; struct X x; } u; } x; x.u.a[d]
587 where we do not know maxsize for variable index accesses to
588 the array. The simplest way to conservatively deal with this
589 is to punt in the case that offset + maxsize reaches the
590 base type boundary. This needs to include possible trailing
591 padding that is there for alignment purposes. */
592 if (seen_variable_array_ref
594 && (TYPE_SIZE (TREE_TYPE (exp
)) == NULL_TREE
595 || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp
))) != INTEGER_CST
596 || (bit_offset
+ maxsize
597 == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp
))))))
600 /* Hand back the decl for MEM[&decl, off]. */
601 if (TREE_CODE (TREE_OPERAND (exp
, 0)) == ADDR_EXPR
)
603 if (integer_zerop (TREE_OPERAND (exp
, 1)))
604 exp
= TREE_OPERAND (TREE_OPERAND (exp
, 0), 0);
607 offset_int off
= mem_ref_offset (exp
);
608 off
= wi::lshift (off
, LOG2_BITS_PER_UNIT
);
610 if (wi::fits_shwi_p (off
))
613 exp
= TREE_OPERAND (TREE_OPERAND (exp
, 0), 0);
623 exp
= TREE_OPERAND (exp
, 0);
626 /* We need to deal with variable arrays ending structures. */
627 if (seen_variable_array_ref
629 && (TYPE_SIZE (TREE_TYPE (exp
)) == NULL_TREE
630 || TREE_CODE (TYPE_SIZE (TREE_TYPE (exp
))) != INTEGER_CST
631 || (bit_offset
+ maxsize
632 == wi::to_offset (TYPE_SIZE (TREE_TYPE (exp
))))))
636 if (!wi::fits_shwi_p (bitsize
) || wi::neg_p (bitsize
))
645 *psize
= bitsize
.to_shwi ();
647 if (!wi::fits_shwi_p (bit_offset
))
655 /* In case of a decl or constant base object we can do better. */
659 /* If maxsize is unknown adjust it according to the size of the
663 && TREE_CODE (DECL_SIZE (exp
)) == INTEGER_CST
)
664 maxsize
= wi::to_offset (DECL_SIZE (exp
)) - bit_offset
;
666 else if (CONSTANT_CLASS_P (exp
))
668 /* If maxsize is unknown adjust it according to the size of the
669 base type constant. */
671 && TYPE_SIZE (TREE_TYPE (exp
))
672 && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp
))) == INTEGER_CST
)
673 maxsize
= (wi::to_offset (TYPE_SIZE (TREE_TYPE (exp
)))
677 /* ??? Due to negative offsets in ARRAY_REF we can end up with
678 negative bit_offset here. We might want to store a zero offset
680 *poffset
= bit_offset
.to_shwi ();
681 if (!wi::fits_shwi_p (maxsize
) || wi::neg_p (maxsize
))
684 *pmax_size
= maxsize
.to_shwi ();
689 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
690 denotes the starting address of the memory access EXP.
691 Returns NULL_TREE if the offset is not constant or any component
692 is not BITS_PER_UNIT-aligned.
693 VALUEIZE if non-NULL is used to valueize SSA names. It should return
694 its argument or a constant if the argument is known to be constant. */
697 get_addr_base_and_unit_offset_1 (tree exp
, HOST_WIDE_INT
*poffset
,
698 tree (*valueize
) (tree
))
700 HOST_WIDE_INT byte_offset
= 0;
702 /* Compute cumulative byte-offset for nested component-refs and array-refs,
703 and find the ultimate containing object. */
706 switch (TREE_CODE (exp
))
710 HOST_WIDE_INT this_off
= TREE_INT_CST_LOW (TREE_OPERAND (exp
, 2));
711 if (this_off
% BITS_PER_UNIT
)
713 byte_offset
+= this_off
/ BITS_PER_UNIT
;
719 tree field
= TREE_OPERAND (exp
, 1);
720 tree this_offset
= component_ref_field_offset (exp
);
721 HOST_WIDE_INT hthis_offset
;
724 || TREE_CODE (this_offset
) != INTEGER_CST
725 || (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field
))
729 hthis_offset
= TREE_INT_CST_LOW (this_offset
);
730 hthis_offset
+= (TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (field
))
732 byte_offset
+= hthis_offset
;
737 case ARRAY_RANGE_REF
:
739 tree index
= TREE_OPERAND (exp
, 1);
740 tree low_bound
, unit_size
;
743 && TREE_CODE (index
) == SSA_NAME
)
744 index
= (*valueize
) (index
);
746 /* If the resulting bit-offset is constant, track it. */
747 if (TREE_CODE (index
) == INTEGER_CST
748 && (low_bound
= array_ref_low_bound (exp
),
749 TREE_CODE (low_bound
) == INTEGER_CST
)
750 && (unit_size
= array_ref_element_size (exp
),
751 TREE_CODE (unit_size
) == INTEGER_CST
))
754 = wi::sext (wi::to_offset (index
) - wi::to_offset (low_bound
),
755 TYPE_PRECISION (TREE_TYPE (index
)));
756 woffset
*= wi::to_offset (unit_size
);
757 byte_offset
+= woffset
.to_shwi ();
768 byte_offset
+= TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (exp
)));
771 case VIEW_CONVERT_EXPR
:
776 tree base
= TREE_OPERAND (exp
, 0);
778 && TREE_CODE (base
) == SSA_NAME
)
779 base
= (*valueize
) (base
);
781 /* Hand back the decl for MEM[&decl, off]. */
782 if (TREE_CODE (base
) == ADDR_EXPR
)
784 if (!integer_zerop (TREE_OPERAND (exp
, 1)))
786 offset_int off
= mem_ref_offset (exp
);
787 byte_offset
+= off
.to_short_addr ();
789 exp
= TREE_OPERAND (base
, 0);
796 tree base
= TREE_OPERAND (exp
, 0);
798 && TREE_CODE (base
) == SSA_NAME
)
799 base
= (*valueize
) (base
);
801 /* Hand back the decl for MEM[&decl, off]. */
802 if (TREE_CODE (base
) == ADDR_EXPR
)
804 if (TMR_INDEX (exp
) || TMR_INDEX2 (exp
))
806 if (!integer_zerop (TMR_OFFSET (exp
)))
808 offset_int off
= mem_ref_offset (exp
);
809 byte_offset
+= off
.to_short_addr ();
811 exp
= TREE_OPERAND (base
, 0);
820 exp
= TREE_OPERAND (exp
, 0);
824 *poffset
= byte_offset
;
828 /* Returns the base object and a constant BITS_PER_UNIT offset in *POFFSET that
829 denotes the starting address of the memory access EXP.
830 Returns NULL_TREE if the offset is not constant or any component
831 is not BITS_PER_UNIT-aligned. */
834 get_addr_base_and_unit_offset (tree exp
, HOST_WIDE_INT
*poffset
)
836 return get_addr_base_and_unit_offset_1 (exp
, poffset
, NULL
);
839 /* Returns true if STMT references an SSA_NAME that has
840 SSA_NAME_OCCURS_IN_ABNORMAL_PHI set, otherwise false. */
843 stmt_references_abnormal_ssa_name (gimple stmt
)
848 FOR_EACH_SSA_USE_OPERAND (use_p
, stmt
, oi
, SSA_OP_USE
)
850 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (use_p
)))
857 /* Pair of tree and a sorting index, for dump_enumerated_decls. */
858 struct GTY(()) numbered_tree_d
863 typedef struct numbered_tree_d numbered_tree
;
866 /* Compare two declarations references by their DECL_UID / sequence number.
870 compare_decls_by_uid (const void *pa
, const void *pb
)
872 const numbered_tree
*nt_a
= ((const numbered_tree
*)pa
);
873 const numbered_tree
*nt_b
= ((const numbered_tree
*)pb
);
875 if (DECL_UID (nt_a
->t
) != DECL_UID (nt_b
->t
))
876 return DECL_UID (nt_a
->t
) - DECL_UID (nt_b
->t
);
877 return nt_a
->num
- nt_b
->num
;
880 /* Called via walk_gimple_stmt / walk_gimple_op by dump_enumerated_decls. */
882 dump_enumerated_decls_push (tree
*tp
, int *walk_subtrees
, void *data
)
884 struct walk_stmt_info
*wi
= (struct walk_stmt_info
*) data
;
885 vec
<numbered_tree
> *list
= (vec
<numbered_tree
> *) wi
->info
;
891 nt
.num
= list
->length ();
892 list
->safe_push (nt
);
897 /* Find all the declarations used by the current function, sort them by uid,
898 and emit the sorted list. Each declaration is tagged with a sequence
899 number indicating when it was found during statement / tree walking,
900 so that TDF_NOUID comparisons of anonymous declarations are still
901 meaningful. Where a declaration was encountered more than once, we
902 emit only the sequence number of the first encounter.
903 FILE is the dump file where to output the list and FLAGS is as in
904 print_generic_expr. */
906 dump_enumerated_decls (FILE *file
, int flags
)
909 struct walk_stmt_info wi
;
910 auto_vec
<numbered_tree
, 40> decl_list
;
912 memset (&wi
, '\0', sizeof (wi
));
913 wi
.info
= (void *) &decl_list
;
914 FOR_EACH_BB_FN (bb
, cfun
)
916 gimple_stmt_iterator gsi
;
918 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
919 if (!is_gimple_debug (gsi_stmt (gsi
)))
920 walk_gimple_stmt (&gsi
, NULL
, dump_enumerated_decls_push
, &wi
);
922 decl_list
.qsort (compare_decls_by_uid
);
923 if (decl_list
.length ())
927 tree last
= NULL_TREE
;
929 fprintf (file
, "Declarations used by %s, sorted by DECL_UID:\n",
930 current_function_name ());
931 FOR_EACH_VEC_ELT (decl_list
, ix
, ntp
)
935 fprintf (file
, "%d: ", ntp
->num
);
936 print_generic_decl (file
, ntp
->t
, flags
);
937 fprintf (file
, "\n");