1 /* SSA operands management for trees.
2 Copyright (C) 2003-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
26 #include "print-tree.h"
32 #include "hard-reg-set.h"
35 #include "gimple-pretty-print.h"
38 #include "basic-block.h"
39 #include "tree-ssa-alias.h"
40 #include "internal-fn.h"
41 #include "gimple-expr.h"
44 #include "gimple-ssa.h"
45 #include "tree-phinodes.h"
46 #include "ssa-iterators.h"
47 #include "stringpool.h"
48 #include "tree-ssanames.h"
49 #include "tree-inline.h"
53 #include "langhooks.h"
54 #include "diagnostic-core.h"
57 /* This file contains the code required to manage the operands cache of the
58 SSA optimizer. For every stmt, we maintain an operand cache in the stmt
59 annotation. This cache contains operands that will be of interest to
60 optimizers and other passes wishing to manipulate the IL.
62 The operand type are broken up into REAL and VIRTUAL operands. The real
63 operands are represented as pointers into the stmt's operand tree. Thus
64 any manipulation of the real operands will be reflected in the actual tree.
65 Virtual operands are represented solely in the cache, although the base
66 variable for the SSA_NAME may, or may not occur in the stmt's tree.
67 Manipulation of the virtual operands will not be reflected in the stmt tree.
69 The routines in this file are concerned with creating this operand cache
72 The operand tree is the parsed by the various get_* routines which look
73 through the stmt tree for the occurrence of operands which may be of
74 interest, and calls are made to the append_* routines whenever one is
75 found. There are 4 of these routines, each representing one of the
76 4 types of operands. Defs, Uses, Virtual Uses, and Virtual May Defs.
78 The append_* routines check for duplication, and simply keep a list of
79 unique objects for each operand type in the build_* extendable vectors.
81 Once the stmt tree is completely parsed, the finalize_ssa_operands()
82 routine is called, which proceeds to perform the finalization routine
83 on each of the 4 operand vectors which have been built up.
85 If the stmt had a previous operand cache, the finalization routines
86 attempt to match up the new operands with the old ones. If it's a perfect
87 match, the old vector is simply reused. If it isn't a perfect match, then
88 a new vector is created and the new operands are placed there. For
89 virtual operands, if the previous cache had SSA_NAME version of a
90 variable, and that same variable occurs in the same operands cache, then
91 the new cache vector will also get the same SSA_NAME.
93 i.e., if a stmt had a VUSE of 'a_5', and 'a' occurs in the new
94 operand vector for VUSE, then the new vector will also be modified
95 such that it contains 'a_5' rather than 'a'. */
98 /* Flags to describe operand properties in helpers. */
100 /* By default, operands are loaded. */
103 /* Operand is the target of an assignment expression or a
104 call-clobbered variable. */
105 #define opf_def (1 << 0)
107 /* No virtual operands should be created in the expression. This is used
108 when traversing ADDR_EXPR nodes which have different semantics than
109 other expressions. Inside an ADDR_EXPR node, the only operands that we
110 need to consider are indices into arrays. For instance, &a.b[i] should
111 generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
113 #define opf_no_vops (1 << 1)
115 /* Operand is in a place where address-taken does not imply addressable. */
116 #define opf_non_addressable (1 << 3)
118 /* Operand is in a place where opf_non_addressable does not apply. */
119 #define opf_not_non_addressable (1 << 4)
121 /* Operand is having its address taken. */
122 #define opf_address_taken (1 << 5)
124 /* Array for building all the use operands. */
125 static vec
<tree
> build_uses
;
127 /* The built VDEF operand. */
128 static tree build_vdef
;
130 /* The built VUSE operand. */
131 static tree build_vuse
;
133 /* Bitmap obstack for our datastructures that needs to survive across
134 compilations of multiple functions. */
135 static bitmap_obstack operands_bitmap_obstack
;
137 static void get_expr_operands (struct function
*, gimple
, tree
*, int);
139 /* Number of functions with initialized ssa_operands. */
140 static int n_initialized
= 0;
142 /* Accessor to tree-ssa-operands.c caches. */
143 static inline struct ssa_operands
*
144 gimple_ssa_operands (const struct function
*fun
)
146 return &fun
->gimple_df
->ssa_operands
;
150 /* Return true if the SSA operands cache is active. */
153 ssa_operands_active (struct function
*fun
)
158 return fun
->gimple_df
&& gimple_ssa_operands (fun
)->ops_active
;
162 /* Create the VOP variable, an artificial global variable to act as a
163 representative of all of the virtual operands FUD chain. */
166 create_vop_var (struct function
*fn
)
170 gcc_assert (fn
->gimple_df
->vop
== NULL_TREE
);
172 global_var
= build_decl (BUILTINS_LOCATION
, VAR_DECL
,
173 get_identifier (".MEM"),
175 DECL_ARTIFICIAL (global_var
) = 1;
176 DECL_IGNORED_P (global_var
) = 1;
177 TREE_READONLY (global_var
) = 0;
178 DECL_EXTERNAL (global_var
) = 1;
179 TREE_STATIC (global_var
) = 1;
180 TREE_USED (global_var
) = 1;
181 DECL_CONTEXT (global_var
) = NULL_TREE
;
182 TREE_THIS_VOLATILE (global_var
) = 0;
183 TREE_ADDRESSABLE (global_var
) = 0;
184 VAR_DECL_IS_VIRTUAL_OPERAND (global_var
) = 1;
186 fn
->gimple_df
->vop
= global_var
;
189 /* These are the sizes of the operand memory buffer in bytes which gets
190 allocated each time more operands space is required. The final value is
191 the amount that is allocated every time after that.
192 In 1k we can fit 25 use operands (or 63 def operands) on a host with
193 8 byte pointers, that would be 10 statements each with 1 def and 2
196 #define OP_SIZE_INIT 0
197 #define OP_SIZE_1 (1024 - sizeof (void *))
198 #define OP_SIZE_2 (1024 * 4 - sizeof (void *))
199 #define OP_SIZE_3 (1024 * 16 - sizeof (void *))
201 /* Initialize the operand cache routines. */
204 init_ssa_operands (struct function
*fn
)
206 if (!n_initialized
++)
208 build_uses
.create (10);
209 build_vuse
= NULL_TREE
;
210 build_vdef
= NULL_TREE
;
211 bitmap_obstack_initialize (&operands_bitmap_obstack
);
214 gcc_assert (gimple_ssa_operands (fn
)->operand_memory
== NULL
);
215 gimple_ssa_operands (fn
)->operand_memory_index
216 = gimple_ssa_operands (fn
)->ssa_operand_mem_size
;
217 gimple_ssa_operands (fn
)->ops_active
= true;
218 gimple_ssa_operands (fn
)->ssa_operand_mem_size
= OP_SIZE_INIT
;
223 /* Dispose of anything required by the operand routines. */
226 fini_ssa_operands (struct function
*fn
)
228 struct ssa_operand_memory_d
*ptr
;
230 if (!--n_initialized
)
232 build_uses
.release ();
233 build_vdef
= NULL_TREE
;
234 build_vuse
= NULL_TREE
;
237 gimple_ssa_operands (fn
)->free_uses
= NULL
;
239 while ((ptr
= gimple_ssa_operands (fn
)->operand_memory
) != NULL
)
241 gimple_ssa_operands (fn
)->operand_memory
242 = gimple_ssa_operands (fn
)->operand_memory
->next
;
246 gimple_ssa_operands (fn
)->ops_active
= false;
249 bitmap_obstack_release (&operands_bitmap_obstack
);
251 fn
->gimple_df
->vop
= NULL_TREE
;
255 /* Return memory for an operand of size SIZE. */
258 ssa_operand_alloc (struct function
*fn
, unsigned size
)
262 gcc_assert (size
== sizeof (struct use_optype_d
));
264 if (gimple_ssa_operands (fn
)->operand_memory_index
+ size
265 >= gimple_ssa_operands (fn
)->ssa_operand_mem_size
)
267 struct ssa_operand_memory_d
*ptr
;
269 switch (gimple_ssa_operands (fn
)->ssa_operand_mem_size
)
272 gimple_ssa_operands (fn
)->ssa_operand_mem_size
= OP_SIZE_1
;
275 gimple_ssa_operands (fn
)->ssa_operand_mem_size
= OP_SIZE_2
;
279 gimple_ssa_operands (fn
)->ssa_operand_mem_size
= OP_SIZE_3
;
286 ptr
= (ssa_operand_memory_d
*) ggc_internal_alloc
287 (sizeof (void *) + gimple_ssa_operands (fn
)->ssa_operand_mem_size
);
289 ptr
->next
= gimple_ssa_operands (fn
)->operand_memory
;
290 gimple_ssa_operands (fn
)->operand_memory
= ptr
;
291 gimple_ssa_operands (fn
)->operand_memory_index
= 0;
294 ptr
= &(gimple_ssa_operands (fn
)->operand_memory
295 ->mem
[gimple_ssa_operands (fn
)->operand_memory_index
]);
296 gimple_ssa_operands (fn
)->operand_memory_index
+= size
;
301 /* Allocate a USE operand. */
303 static inline struct use_optype_d
*
304 alloc_use (struct function
*fn
)
306 struct use_optype_d
*ret
;
307 if (gimple_ssa_operands (fn
)->free_uses
)
309 ret
= gimple_ssa_operands (fn
)->free_uses
;
310 gimple_ssa_operands (fn
)->free_uses
311 = gimple_ssa_operands (fn
)->free_uses
->next
;
314 ret
= (struct use_optype_d
*)
315 ssa_operand_alloc (fn
, sizeof (struct use_optype_d
));
320 /* Adds OP to the list of uses of statement STMT after LAST. */
322 static inline use_optype_p
323 add_use_op (struct function
*fn
, gimple stmt
, tree
*op
, use_optype_p last
)
325 use_optype_p new_use
;
327 new_use
= alloc_use (fn
);
328 USE_OP_PTR (new_use
)->use
= op
;
329 link_imm_use_stmt (USE_OP_PTR (new_use
), *op
, stmt
);
330 last
->next
= new_use
;
331 new_use
->next
= NULL
;
337 /* Takes elements from build_defs and turns them into def operands of STMT.
338 TODO -- Make build_defs vec of tree *. */
341 finalize_ssa_defs (struct function
*fn
, gimple stmt
)
343 /* Pre-pend the vdef we may have built. */
344 if (build_vdef
!= NULL_TREE
)
346 tree oldvdef
= gimple_vdef (stmt
);
348 && TREE_CODE (oldvdef
) == SSA_NAME
)
349 oldvdef
= SSA_NAME_VAR (oldvdef
);
350 if (oldvdef
!= build_vdef
)
351 gimple_set_vdef (stmt
, build_vdef
);
354 /* Clear and unlink a no longer necessary VDEF. */
355 if (build_vdef
== NULL_TREE
356 && gimple_vdef (stmt
) != NULL_TREE
)
358 if (TREE_CODE (gimple_vdef (stmt
)) == SSA_NAME
)
360 unlink_stmt_vdef (stmt
);
361 release_ssa_name_fn (fn
, gimple_vdef (stmt
));
363 gimple_set_vdef (stmt
, NULL_TREE
);
366 /* If we have a non-SSA_NAME VDEF, mark it for renaming. */
367 if (gimple_vdef (stmt
)
368 && TREE_CODE (gimple_vdef (stmt
)) != SSA_NAME
)
370 fn
->gimple_df
->rename_vops
= 1;
371 fn
->gimple_df
->ssa_renaming_needed
= 1;
376 /* Takes elements from build_uses and turns them into use operands of STMT.
377 TODO -- Make build_uses vec of tree *. */
380 finalize_ssa_uses (struct function
*fn
, gimple stmt
)
383 struct use_optype_d new_list
;
384 use_optype_p old_ops
, ptr
, last
;
386 /* Pre-pend the VUSE we may have built. */
387 if (build_vuse
!= NULL_TREE
)
389 tree oldvuse
= gimple_vuse (stmt
);
391 && TREE_CODE (oldvuse
) == SSA_NAME
)
392 oldvuse
= SSA_NAME_VAR (oldvuse
);
393 if (oldvuse
!= (build_vuse
!= NULL_TREE
394 ? build_vuse
: build_vdef
))
395 gimple_set_vuse (stmt
, NULL_TREE
);
396 build_uses
.safe_insert (0, (tree
)gimple_vuse_ptr (stmt
));
399 new_list
.next
= NULL
;
402 old_ops
= gimple_use_ops (stmt
);
404 /* Clear a no longer necessary VUSE. */
405 if (build_vuse
== NULL_TREE
406 && gimple_vuse (stmt
) != NULL_TREE
)
407 gimple_set_vuse (stmt
, NULL_TREE
);
409 /* If there is anything in the old list, free it. */
412 for (ptr
= old_ops
; ptr
; ptr
= ptr
->next
)
413 delink_imm_use (USE_OP_PTR (ptr
));
414 old_ops
->next
= gimple_ssa_operands (fn
)->free_uses
;
415 gimple_ssa_operands (fn
)->free_uses
= old_ops
;
418 /* If we added a VUSE, make sure to set the operand if it is not already
419 present and mark it for renaming. */
420 if (build_vuse
!= NULL_TREE
421 && gimple_vuse (stmt
) == NULL_TREE
)
423 gimple_set_vuse (stmt
, gimple_vop (fn
));
424 fn
->gimple_df
->rename_vops
= 1;
425 fn
->gimple_df
->ssa_renaming_needed
= 1;
428 /* Now create nodes for all the new nodes. */
429 for (new_i
= 0; new_i
< build_uses
.length (); new_i
++)
431 tree
*op
= (tree
*) build_uses
[new_i
];
432 last
= add_use_op (fn
, stmt
, op
, last
);
435 /* Now set the stmt's operands. */
436 gimple_set_use_ops (stmt
, new_list
.next
);
440 /* Clear the in_list bits and empty the build array for VDEFs and
444 cleanup_build_arrays (void)
446 build_vdef
= NULL_TREE
;
447 build_vuse
= NULL_TREE
;
448 build_uses
.truncate (0);
452 /* Finalize all the build vectors, fill the new ones into INFO. */
455 finalize_ssa_stmt_operands (struct function
*fn
, gimple stmt
)
457 finalize_ssa_defs (fn
, stmt
);
458 finalize_ssa_uses (fn
, stmt
);
459 cleanup_build_arrays ();
463 /* Start the process of building up operands vectors in INFO. */
466 start_ssa_stmt_operands (void)
468 gcc_assert (build_uses
.length () == 0);
469 gcc_assert (build_vuse
== NULL_TREE
);
470 gcc_assert (build_vdef
== NULL_TREE
);
474 /* Add USE_P to the list of pointers to operands. */
477 append_use (tree
*use_p
)
479 build_uses
.safe_push ((tree
) use_p
);
483 /* Add VAR to the set of variables that require a VDEF operator. */
486 append_vdef (tree var
)
488 gcc_assert ((build_vdef
== NULL_TREE
489 || build_vdef
== var
)
490 && (build_vuse
== NULL_TREE
491 || build_vuse
== var
));
498 /* Add VAR to the set of variables that require a VUSE operator. */
501 append_vuse (tree var
)
503 gcc_assert (build_vuse
== NULL_TREE
504 || build_vuse
== var
);
509 /* Add virtual operands for STMT. FLAGS is as in get_expr_operands. */
512 add_virtual_operand (struct function
*fn
,
513 gimple stmt ATTRIBUTE_UNUSED
, int flags
)
515 /* Add virtual operands to the stmt, unless the caller has specifically
516 requested not to do that (used when adding operands inside an
517 ADDR_EXPR expression). */
518 if (flags
& opf_no_vops
)
521 gcc_assert (!is_gimple_debug (stmt
));
524 append_vdef (gimple_vop (fn
));
526 append_vuse (gimple_vop (fn
));
530 /* Add *VAR_P to the appropriate operand array for statement STMT.
531 FLAGS is as in get_expr_operands. If *VAR_P is a GIMPLE register,
532 it will be added to the statement's real operands, otherwise it is
533 added to virtual operands. */
536 add_stmt_operand (struct function
*fn
, tree
*var_p
, gimple stmt
, int flags
)
540 gcc_assert (SSA_VAR_P (*var_p
));
542 if (is_gimple_reg (var
))
544 /* The variable is a GIMPLE register. Add it to real operands. */
550 fn
->gimple_df
->ssa_renaming_needed
= 1;
554 /* Mark statements with volatile operands. */
555 if (!(flags
& opf_no_vops
)
556 && TREE_THIS_VOLATILE (var
))
557 gimple_set_has_volatile_ops (stmt
, true);
559 /* The variable is a memory access. Add virtual operands. */
560 add_virtual_operand (fn
, stmt
, flags
);
564 /* Mark the base address of REF as having its address taken.
565 REF may be a single variable whose address has been taken or any
566 other valid GIMPLE memory reference (structure reference, array,
570 mark_address_taken (tree ref
)
574 /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF
575 as the only thing we take the address of. If VAR is a structure,
576 taking the address of a field means that the whole structure may
577 be referenced using pointer arithmetic. See PR 21407 and the
578 ensuing mailing list discussion. */
579 var
= get_base_address (ref
);
583 TREE_ADDRESSABLE (var
) = 1;
584 else if (TREE_CODE (var
) == MEM_REF
585 && TREE_CODE (TREE_OPERAND (var
, 0)) == ADDR_EXPR
586 && DECL_P (TREE_OPERAND (TREE_OPERAND (var
, 0), 0)))
587 TREE_ADDRESSABLE (TREE_OPERAND (TREE_OPERAND (var
, 0), 0)) = 1;
592 /* A subroutine of get_expr_operands to handle MEM_REF.
594 STMT is the statement being processed, EXPR is the MEM_REF
597 FLAGS is as in get_expr_operands. */
600 get_mem_ref_operands (struct function
*fn
,
601 gimple stmt
, tree expr
, int flags
)
603 tree
*pptr
= &TREE_OPERAND (expr
, 0);
605 if (!(flags
& opf_no_vops
)
606 && TREE_THIS_VOLATILE (expr
))
607 gimple_set_has_volatile_ops (stmt
, true);
610 add_virtual_operand (fn
, stmt
, flags
);
612 /* If requested, add a USE operand for the base pointer. */
613 get_expr_operands (fn
, stmt
, pptr
,
614 opf_non_addressable
| opf_use
615 | (flags
& (opf_no_vops
|opf_not_non_addressable
)));
619 /* A subroutine of get_expr_operands to handle TARGET_MEM_REF. */
622 get_tmr_operands (struct function
*fn
, gimple stmt
, tree expr
, int flags
)
624 if (!(flags
& opf_no_vops
)
625 && TREE_THIS_VOLATILE (expr
))
626 gimple_set_has_volatile_ops (stmt
, true);
628 /* First record the real operands. */
629 get_expr_operands (fn
, stmt
,
630 &TMR_BASE (expr
), opf_use
| (flags
& opf_no_vops
));
631 get_expr_operands (fn
, stmt
,
632 &TMR_INDEX (expr
), opf_use
| (flags
& opf_no_vops
));
633 get_expr_operands (fn
, stmt
,
634 &TMR_INDEX2 (expr
), opf_use
| (flags
& opf_no_vops
));
636 add_virtual_operand (fn
, stmt
, flags
);
640 /* If STMT is a call that may clobber globals and other symbols that
641 escape, add them to the VDEF/VUSE lists for it. */
644 maybe_add_call_vops (struct function
*fn
, gimple stmt
)
646 int call_flags
= gimple_call_flags (stmt
);
648 /* If aliases have been computed already, add VDEF or VUSE
649 operands for all the symbols that have been found to be
651 if (!(call_flags
& ECF_NOVOPS
))
653 /* A 'pure' or a 'const' function never call-clobbers anything. */
654 if (!(call_flags
& (ECF_PURE
| ECF_CONST
)))
655 add_virtual_operand (fn
, stmt
, opf_def
);
656 else if (!(call_flags
& ECF_CONST
))
657 add_virtual_operand (fn
, stmt
, opf_use
);
662 /* Scan operands in the ASM_EXPR stmt referred to in INFO. */
665 get_asm_stmt_operands (struct function
*fn
, gimple stmt
)
668 const char **oconstraints
;
669 const char *constraint
;
670 bool allows_mem
, allows_reg
, is_inout
;
672 noutputs
= gimple_asm_noutputs (stmt
);
673 oconstraints
= (const char **) alloca ((noutputs
) * sizeof (const char *));
675 /* Gather all output operands. */
676 for (i
= 0; i
< gimple_asm_noutputs (stmt
); i
++)
678 tree link
= gimple_asm_output_op (stmt
, i
);
679 constraint
= TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link
)));
680 oconstraints
[i
] = constraint
;
681 parse_output_constraint (&constraint
, i
, 0, 0, &allows_mem
,
682 &allows_reg
, &is_inout
);
684 /* This should have been split in gimplify_asm_expr. */
685 gcc_assert (!allows_reg
|| !is_inout
);
687 /* Memory operands are addressable. Note that STMT needs the
688 address of this operand. */
689 if (!allows_reg
&& allows_mem
)
690 mark_address_taken (TREE_VALUE (link
));
692 get_expr_operands (fn
, stmt
,
693 &TREE_VALUE (link
), opf_def
| opf_not_non_addressable
);
696 /* Gather all input operands. */
697 for (i
= 0; i
< gimple_asm_ninputs (stmt
); i
++)
699 tree link
= gimple_asm_input_op (stmt
, i
);
700 constraint
= TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link
)));
701 parse_input_constraint (&constraint
, 0, 0, noutputs
, 0, oconstraints
,
702 &allows_mem
, &allows_reg
);
704 /* Memory operands are addressable. Note that STMT needs the
705 address of this operand. */
706 if (!allows_reg
&& allows_mem
)
707 mark_address_taken (TREE_VALUE (link
));
709 get_expr_operands (fn
, stmt
, &TREE_VALUE (link
), opf_not_non_addressable
);
712 /* Clobber all memory and addressable symbols for asm ("" : : : "memory"); */
713 if (gimple_asm_clobbers_memory_p (stmt
))
714 add_virtual_operand (fn
, stmt
, opf_def
);
718 /* Recursively scan the expression pointed to by EXPR_P in statement
719 STMT. FLAGS is one of the OPF_* constants modifying how to
720 interpret the operands found. */
723 get_expr_operands (struct function
*fn
, gimple stmt
, tree
*expr_p
, int flags
)
726 enum tree_code_class codeclass
;
728 int uflags
= opf_use
;
733 if (is_gimple_debug (stmt
))
734 uflags
|= (flags
& opf_no_vops
);
736 code
= TREE_CODE (expr
);
737 codeclass
= TREE_CODE_CLASS (code
);
742 /* Taking the address of a variable does not represent a
743 reference to it, but the fact that the statement takes its
744 address will be of interest to some passes (e.g. alias
746 if ((!(flags
& opf_non_addressable
)
747 || (flags
& opf_not_non_addressable
))
748 && !is_gimple_debug (stmt
))
749 mark_address_taken (TREE_OPERAND (expr
, 0));
751 /* Otherwise, there may be variables referenced inside but there
752 should be no VUSEs created, since the referenced objects are
753 not really accessed. The only operands that we should find
754 here are ARRAY_REF indices which will always be real operands
755 (GIMPLE does not allow non-registers as array indices). */
756 flags
|= opf_no_vops
;
757 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 0),
758 flags
| opf_not_non_addressable
| opf_address_taken
);
765 if (!(flags
& opf_address_taken
))
766 add_stmt_operand (fn
, expr_p
, stmt
, flags
);
769 case DEBUG_EXPR_DECL
:
770 gcc_assert (gimple_debug_bind_p (stmt
));
774 get_mem_ref_operands (fn
, stmt
, expr
, flags
);
778 get_tmr_operands (fn
, stmt
, expr
, flags
);
782 case ARRAY_RANGE_REF
:
787 if (!(flags
& opf_no_vops
)
788 && TREE_THIS_VOLATILE (expr
))
789 gimple_set_has_volatile_ops (stmt
, true);
791 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 0), flags
);
793 if (code
== COMPONENT_REF
)
795 if (!(flags
& opf_no_vops
)
796 && TREE_THIS_VOLATILE (TREE_OPERAND (expr
, 1)))
797 gimple_set_has_volatile_ops (stmt
, true);
798 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 2), uflags
);
800 else if (code
== ARRAY_REF
|| code
== ARRAY_RANGE_REF
)
802 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 1), uflags
);
803 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 2), uflags
);
804 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 3), uflags
);
811 /* WITH_SIZE_EXPR is a pass-through reference to its first argument,
812 and an rvalue reference to its second argument. */
813 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 1), uflags
);
814 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 0), flags
);
820 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 0), uflags
);
821 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 1), uflags
);
822 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 2), uflags
);
827 /* General aggregate CONSTRUCTORs have been decomposed, but they
828 are still in use as the COMPLEX_EXPR equivalent for vectors. */
830 unsigned HOST_WIDE_INT idx
;
832 /* A volatile constructor is actually TREE_CLOBBER_P, transfer
833 the volatility to the statement, don't use TREE_CLOBBER_P for
834 mirroring the other uses of THIS_VOLATILE in this file. */
835 if (!(flags
& opf_no_vops
)
836 && TREE_THIS_VOLATILE (expr
))
837 gimple_set_has_volatile_ops (stmt
, true);
840 vec_safe_iterate (CONSTRUCTOR_ELTS (expr
), idx
, &ce
);
842 get_expr_operands (fn
, stmt
, &ce
->value
, uflags
);
848 if (!(flags
& opf_no_vops
)
849 && TREE_THIS_VOLATILE (expr
))
850 gimple_set_has_volatile_ops (stmt
, true);
853 case VIEW_CONVERT_EXPR
:
855 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 0), flags
);
863 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 0), flags
);
864 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 1), flags
);
870 case REALIGN_LOAD_EXPR
:
871 case WIDEN_MULT_PLUS_EXPR
:
872 case WIDEN_MULT_MINUS_EXPR
:
875 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 0), flags
);
876 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 1), flags
);
877 get_expr_operands (fn
, stmt
, &TREE_OPERAND (expr
, 2), flags
);
884 case CASE_LABEL_EXPR
:
885 /* Expressions that make no memory references. */
889 if (codeclass
== tcc_unary
)
891 if (codeclass
== tcc_binary
|| codeclass
== tcc_comparison
)
893 if (codeclass
== tcc_constant
|| codeclass
== tcc_type
)
897 /* If we get here, something has gone wrong. */
898 #ifdef ENABLE_CHECKING
899 fprintf (stderr
, "unhandled expression in get_expr_operands():\n");
901 fputs ("\n", stderr
);
907 /* Parse STMT looking for operands. When finished, the various
908 build_* operand vectors will have potential operands in them. */
911 parse_ssa_operands (struct function
*fn
, gimple stmt
)
913 enum gimple_code code
= gimple_code (stmt
);
914 size_t i
, n
, start
= 0;
919 get_asm_stmt_operands (fn
, stmt
);
922 case GIMPLE_TRANSACTION
:
923 /* The start of a transaction is a memory barrier. */
924 add_virtual_operand (fn
, stmt
, opf_def
| opf_use
);
928 if (gimple_debug_bind_p (stmt
)
929 && gimple_debug_bind_has_value_p (stmt
))
930 get_expr_operands (fn
, stmt
, gimple_debug_bind_get_value_ptr (stmt
),
931 opf_use
| opf_no_vops
);
935 append_vuse (gimple_vop (fn
));
939 /* Add call-clobbered operands, if needed. */
940 maybe_add_call_vops (fn
, stmt
);
944 get_expr_operands (fn
, stmt
, gimple_op_ptr (stmt
, 0), opf_def
);
950 n
= gimple_num_ops (stmt
);
951 for (i
= start
; i
< n
; i
++)
952 get_expr_operands (fn
, stmt
, gimple_op_ptr (stmt
, i
), opf_use
);
958 /* Create an operands cache for STMT. */
961 build_ssa_operands (struct function
*fn
, gimple stmt
)
963 /* Initially assume that the statement has no volatile operands. */
964 gimple_set_has_volatile_ops (stmt
, false);
966 start_ssa_stmt_operands ();
967 parse_ssa_operands (fn
, stmt
);
968 finalize_ssa_stmt_operands (fn
, stmt
);
971 /* Verifies SSA statement operands. */
974 verify_ssa_operands (struct function
*fn
, gimple stmt
)
981 bool volatile_p
= gimple_has_volatile_ops (stmt
);
983 /* build_ssa_operands w/o finalizing them. */
984 gimple_set_has_volatile_ops (stmt
, false);
985 start_ssa_stmt_operands ();
986 parse_ssa_operands (fn
, stmt
);
988 /* Now verify the built operands are the same as present in STMT. */
989 def
= gimple_vdef (stmt
);
991 && TREE_CODE (def
) == SSA_NAME
)
992 def
= SSA_NAME_VAR (def
);
993 if (build_vdef
!= def
)
995 error ("virtual definition of statement not up-to-date");
998 if (gimple_vdef (stmt
)
999 && ((def_p
= gimple_vdef_op (stmt
)) == NULL_DEF_OPERAND_P
1000 || DEF_FROM_PTR (def_p
) != gimple_vdef (stmt
)))
1002 error ("virtual def operand missing for stmt");
1006 use
= gimple_vuse (stmt
);
1008 && TREE_CODE (use
) == SSA_NAME
)
1009 use
= SSA_NAME_VAR (use
);
1010 if (build_vuse
!= use
)
1012 error ("virtual use of statement not up-to-date");
1015 if (gimple_vuse (stmt
)
1016 && ((use_p
= gimple_vuse_op (stmt
)) == NULL_USE_OPERAND_P
1017 || USE_FROM_PTR (use_p
) != gimple_vuse (stmt
)))
1019 error ("virtual use operand missing for stmt");
1023 FOR_EACH_SSA_USE_OPERAND (use_p
, stmt
, iter
, SSA_OP_USE
)
1025 FOR_EACH_VEC_ELT (build_uses
, i
, use
)
1027 if (use_p
->use
== (tree
*)use
)
1029 build_uses
[i
] = NULL_TREE
;
1033 if (i
== build_uses
.length ())
1035 error ("excess use operand for stmt");
1036 debug_generic_expr (USE_FROM_PTR (use_p
));
1040 FOR_EACH_VEC_ELT (build_uses
, i
, use
)
1041 if (use
!= NULL_TREE
)
1043 error ("use operand missing for stmt");
1044 debug_generic_expr (*(tree
*)use
);
1048 if (gimple_has_volatile_ops (stmt
) != volatile_p
)
1050 error ("stmt volatile flag not up-to-date");
1054 cleanup_build_arrays ();
1059 /* Releases the operands of STMT back to their freelists, and clears
1060 the stmt operand lists. */
1063 free_stmt_operands (struct function
*fn
, gimple stmt
)
1065 use_optype_p uses
= gimple_use_ops (stmt
), last_use
;
1069 for (last_use
= uses
; last_use
->next
; last_use
= last_use
->next
)
1070 delink_imm_use (USE_OP_PTR (last_use
));
1071 delink_imm_use (USE_OP_PTR (last_use
));
1072 last_use
->next
= gimple_ssa_operands (fn
)->free_uses
;
1073 gimple_ssa_operands (fn
)->free_uses
= uses
;
1074 gimple_set_use_ops (stmt
, NULL
);
1077 if (gimple_has_mem_ops (stmt
))
1079 gimple_set_vuse (stmt
, NULL_TREE
);
1080 gimple_set_vdef (stmt
, NULL_TREE
);
1085 /* Get the operands of statement STMT. */
1088 update_stmt_operands (struct function
*fn
, gimple stmt
)
1090 /* If update_stmt_operands is called before SSA is initialized, do
1092 if (!ssa_operands_active (fn
))
1095 timevar_push (TV_TREE_OPS
);
1097 gcc_assert (gimple_modified_p (stmt
));
1098 build_ssa_operands (fn
, stmt
);
1099 gimple_set_modified (stmt
, false);
1101 timevar_pop (TV_TREE_OPS
);
1105 /* Swap operands EXP0 and EXP1 in statement STMT. No attempt is done
1106 to test the validity of the swap operation. */
1109 swap_ssa_operands (gimple stmt
, tree
*exp0
, tree
*exp1
)
1117 /* Attempt to preserve the relative positions of these two operands in
1118 their * respective immediate use lists by adjusting their use pointer
1119 to point to the new operand position. */
1120 use_optype_p use0
, use1
, ptr
;
1123 /* Find the 2 operands in the cache, if they are there. */
1124 for (ptr
= gimple_use_ops (stmt
); ptr
; ptr
= ptr
->next
)
1125 if (USE_OP_PTR (ptr
)->use
== exp0
)
1131 for (ptr
= gimple_use_ops (stmt
); ptr
; ptr
= ptr
->next
)
1132 if (USE_OP_PTR (ptr
)->use
== exp1
)
1138 /* And adjust their location to point to the new position of the
1141 USE_OP_PTR (use0
)->use
= exp1
;
1143 USE_OP_PTR (use1
)->use
= exp0
;
1145 /* Now swap the data. */
1152 /* Scan the immediate_use list for VAR making sure its linked properly.
1153 Return TRUE if there is a problem and emit an error message to F. */
1156 verify_imm_links (FILE *f
, tree var
)
1158 use_operand_p ptr
, prev
, list
;
1161 gcc_assert (TREE_CODE (var
) == SSA_NAME
);
1163 list
= &(SSA_NAME_IMM_USE_NODE (var
));
1164 gcc_assert (list
->use
== NULL
);
1166 if (list
->prev
== NULL
)
1168 gcc_assert (list
->next
== NULL
);
1174 for (ptr
= list
->next
; ptr
!= list
; )
1176 if (prev
!= ptr
->prev
)
1179 if (ptr
->use
== NULL
)
1180 goto error
; /* 2 roots, or SAFE guard node. */
1181 else if (*(ptr
->use
) != var
)
1187 /* Avoid infinite loops. 50,000,000 uses probably indicates a
1189 if (count
++ > 50000000)
1193 /* Verify list in the other direction. */
1195 for (ptr
= list
->prev
; ptr
!= list
; )
1197 if (prev
!= ptr
->next
)
1211 if (ptr
->loc
.stmt
&& gimple_modified_p (ptr
->loc
.stmt
))
1213 fprintf (f
, " STMT MODIFIED. - <%p> ", (void *)ptr
->loc
.stmt
);
1214 print_gimple_stmt (f
, ptr
->loc
.stmt
, 0, TDF_SLIM
);
1216 fprintf (f
, " IMM ERROR : (use_p : tree - %p:%p)", (void *)ptr
,
1218 print_generic_expr (f
, USE_FROM_PTR (ptr
), TDF_SLIM
);
1224 /* Dump all the immediate uses to FILE. */
1227 dump_immediate_uses_for (FILE *file
, tree var
)
1229 imm_use_iterator iter
;
1230 use_operand_p use_p
;
1232 gcc_assert (var
&& TREE_CODE (var
) == SSA_NAME
);
1234 print_generic_expr (file
, var
, TDF_SLIM
);
1235 fprintf (file
, " : -->");
1236 if (has_zero_uses (var
))
1237 fprintf (file
, " no uses.\n");
1239 if (has_single_use (var
))
1240 fprintf (file
, " single use.\n");
1242 fprintf (file
, "%d uses.\n", num_imm_uses (var
));
1244 FOR_EACH_IMM_USE_FAST (use_p
, iter
, var
)
1246 if (use_p
->loc
.stmt
== NULL
&& use_p
->use
== NULL
)
1247 fprintf (file
, "***end of stmt iterator marker***\n");
1249 if (!is_gimple_reg (USE_FROM_PTR (use_p
)))
1250 print_gimple_stmt (file
, USE_STMT (use_p
), 0, TDF_VOPS
|TDF_MEMSYMS
);
1252 print_gimple_stmt (file
, USE_STMT (use_p
), 0, TDF_SLIM
);
1254 fprintf (file
, "\n");
1258 /* Dump all the immediate uses to FILE. */
1261 dump_immediate_uses (FILE *file
)
1266 fprintf (file
, "Immediate_uses: \n\n");
1267 for (x
= 1; x
< num_ssa_names
; x
++)
1272 dump_immediate_uses_for (file
, var
);
1277 /* Dump def-use edges on stderr. */
1280 debug_immediate_uses (void)
1282 dump_immediate_uses (stderr
);
1286 /* Dump def-use edges on stderr. */
1289 debug_immediate_uses_for (tree var
)
1291 dump_immediate_uses_for (stderr
, var
);
1295 /* Unlink STMTs virtual definition from the IL by propagating its use. */
1298 unlink_stmt_vdef (gimple stmt
)
1300 use_operand_p use_p
;
1301 imm_use_iterator iter
;
1303 tree vdef
= gimple_vdef (stmt
);
1304 tree vuse
= gimple_vuse (stmt
);
1307 || TREE_CODE (vdef
) != SSA_NAME
)
1310 FOR_EACH_IMM_USE_STMT (use_stmt
, iter
, vdef
)
1312 FOR_EACH_IMM_USE_ON_STMT (use_p
, iter
)
1313 SET_USE (use_p
, vuse
);
1316 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vdef
))
1317 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vuse
) = 1;
1321 /* Return true if the var whose chain of uses starts at PTR has no
1324 has_zero_uses_1 (const ssa_use_operand_t
*head
)
1326 const ssa_use_operand_t
*ptr
;
1328 for (ptr
= head
->next
; ptr
!= head
; ptr
= ptr
->next
)
1329 if (!is_gimple_debug (USE_STMT (ptr
)))
1336 /* Return true if the var whose chain of uses starts at PTR has a
1337 single nondebug use. Set USE_P and STMT to that single nondebug
1338 use, if so, or to NULL otherwise. */
1340 single_imm_use_1 (const ssa_use_operand_t
*head
,
1341 use_operand_p
*use_p
, gimple
*stmt
)
1343 ssa_use_operand_t
*ptr
, *single_use
= 0;
1345 for (ptr
= head
->next
; ptr
!= head
; ptr
= ptr
->next
)
1346 if (!is_gimple_debug (USE_STMT (ptr
)))
1357 *use_p
= single_use
;
1360 *stmt
= single_use
? single_use
->loc
.stmt
: NULL
;