]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-ssa-operands.c
tree-core.h: Include symtab.h.
[thirdparty/gcc.git] / gcc / tree-ssa-operands.c
1 /* SSA operands management for trees.
2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
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)
9 any later version.
10
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.
15
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/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "tree.h"
25 #include "gimple.h"
26 #include "hard-reg-set.h"
27 #include "ssa.h"
28 #include "alias.h"
29 #include "fold-const.h"
30 #include "stmt.h"
31 #include "print-tree.h"
32 #include "flags.h"
33 #include "gimple-pretty-print.h"
34 #include "internal-fn.h"
35 #include "tree-inline.h"
36 #include "timevar.h"
37 #include "dumpfile.h"
38 #include "timevar.h"
39 #include "langhooks.h"
40 #include "diagnostic-core.h"
41
42
43 /* This file contains the code required to manage the operands cache of the
44 SSA optimizer. For every stmt, we maintain an operand cache in the stmt
45 annotation. This cache contains operands that will be of interest to
46 optimizers and other passes wishing to manipulate the IL.
47
48 The operand type are broken up into REAL and VIRTUAL operands. The real
49 operands are represented as pointers into the stmt's operand tree. Thus
50 any manipulation of the real operands will be reflected in the actual tree.
51 Virtual operands are represented solely in the cache, although the base
52 variable for the SSA_NAME may, or may not occur in the stmt's tree.
53 Manipulation of the virtual operands will not be reflected in the stmt tree.
54
55 The routines in this file are concerned with creating this operand cache
56 from a stmt tree.
57
58 The operand tree is the parsed by the various get_* routines which look
59 through the stmt tree for the occurrence of operands which may be of
60 interest, and calls are made to the append_* routines whenever one is
61 found. There are 4 of these routines, each representing one of the
62 4 types of operands. Defs, Uses, Virtual Uses, and Virtual May Defs.
63
64 The append_* routines check for duplication, and simply keep a list of
65 unique objects for each operand type in the build_* extendable vectors.
66
67 Once the stmt tree is completely parsed, the finalize_ssa_operands()
68 routine is called, which proceeds to perform the finalization routine
69 on each of the 4 operand vectors which have been built up.
70
71 If the stmt had a previous operand cache, the finalization routines
72 attempt to match up the new operands with the old ones. If it's a perfect
73 match, the old vector is simply reused. If it isn't a perfect match, then
74 a new vector is created and the new operands are placed there. For
75 virtual operands, if the previous cache had SSA_NAME version of a
76 variable, and that same variable occurs in the same operands cache, then
77 the new cache vector will also get the same SSA_NAME.
78
79 i.e., if a stmt had a VUSE of 'a_5', and 'a' occurs in the new
80 operand vector for VUSE, then the new vector will also be modified
81 such that it contains 'a_5' rather than 'a'. */
82
83
84 /* Flags to describe operand properties in helpers. */
85
86 /* By default, operands are loaded. */
87 #define opf_use 0
88
89 /* Operand is the target of an assignment expression or a
90 call-clobbered variable. */
91 #define opf_def (1 << 0)
92
93 /* No virtual operands should be created in the expression. This is used
94 when traversing ADDR_EXPR nodes which have different semantics than
95 other expressions. Inside an ADDR_EXPR node, the only operands that we
96 need to consider are indices into arrays. For instance, &a.b[i] should
97 generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
98 VUSE for 'b'. */
99 #define opf_no_vops (1 << 1)
100
101 /* Operand is in a place where address-taken does not imply addressable. */
102 #define opf_non_addressable (1 << 3)
103
104 /* Operand is in a place where opf_non_addressable does not apply. */
105 #define opf_not_non_addressable (1 << 4)
106
107 /* Operand is having its address taken. */
108 #define opf_address_taken (1 << 5)
109
110 /* Array for building all the use operands. */
111 static vec<tree> build_uses;
112
113 /* The built VDEF operand. */
114 static tree build_vdef;
115
116 /* The built VUSE operand. */
117 static tree build_vuse;
118
119 /* Bitmap obstack for our datastructures that needs to survive across
120 compilations of multiple functions. */
121 static bitmap_obstack operands_bitmap_obstack;
122
123 static void get_expr_operands (struct function *, gimple, tree *, int);
124
125 /* Number of functions with initialized ssa_operands. */
126 static int n_initialized = 0;
127
128 /* Accessor to tree-ssa-operands.c caches. */
129 static inline struct ssa_operands *
130 gimple_ssa_operands (const struct function *fun)
131 {
132 return &fun->gimple_df->ssa_operands;
133 }
134
135
136 /* Return true if the SSA operands cache is active. */
137
138 bool
139 ssa_operands_active (struct function *fun)
140 {
141 if (fun == NULL)
142 return false;
143
144 return fun->gimple_df && gimple_ssa_operands (fun)->ops_active;
145 }
146
147
148 /* Create the VOP variable, an artificial global variable to act as a
149 representative of all of the virtual operands FUD chain. */
150
151 static void
152 create_vop_var (struct function *fn)
153 {
154 tree global_var;
155
156 gcc_assert (fn->gimple_df->vop == NULL_TREE);
157
158 global_var = build_decl (BUILTINS_LOCATION, VAR_DECL,
159 get_identifier (".MEM"),
160 void_type_node);
161 DECL_ARTIFICIAL (global_var) = 1;
162 DECL_IGNORED_P (global_var) = 1;
163 TREE_READONLY (global_var) = 0;
164 DECL_EXTERNAL (global_var) = 1;
165 TREE_STATIC (global_var) = 1;
166 TREE_USED (global_var) = 1;
167 DECL_CONTEXT (global_var) = NULL_TREE;
168 TREE_THIS_VOLATILE (global_var) = 0;
169 TREE_ADDRESSABLE (global_var) = 0;
170 VAR_DECL_IS_VIRTUAL_OPERAND (global_var) = 1;
171
172 fn->gimple_df->vop = global_var;
173 }
174
175 /* These are the sizes of the operand memory buffer in bytes which gets
176 allocated each time more operands space is required. The final value is
177 the amount that is allocated every time after that.
178 In 1k we can fit 25 use operands (or 63 def operands) on a host with
179 8 byte pointers, that would be 10 statements each with 1 def and 2
180 uses. */
181
182 #define OP_SIZE_INIT 0
183 #define OP_SIZE_1 (1024 - sizeof (void *))
184 #define OP_SIZE_2 (1024 * 4 - sizeof (void *))
185 #define OP_SIZE_3 (1024 * 16 - sizeof (void *))
186
187 /* Initialize the operand cache routines. */
188
189 void
190 init_ssa_operands (struct function *fn)
191 {
192 if (!n_initialized++)
193 {
194 build_uses.create (10);
195 build_vuse = NULL_TREE;
196 build_vdef = NULL_TREE;
197 bitmap_obstack_initialize (&operands_bitmap_obstack);
198 }
199
200 gcc_assert (gimple_ssa_operands (fn)->operand_memory == NULL);
201 gimple_ssa_operands (fn)->operand_memory_index
202 = gimple_ssa_operands (fn)->ssa_operand_mem_size;
203 gimple_ssa_operands (fn)->ops_active = true;
204 gimple_ssa_operands (fn)->ssa_operand_mem_size = OP_SIZE_INIT;
205 create_vop_var (fn);
206 }
207
208
209 /* Dispose of anything required by the operand routines. */
210
211 void
212 fini_ssa_operands (struct function *fn)
213 {
214 struct ssa_operand_memory_d *ptr;
215
216 if (!--n_initialized)
217 {
218 build_uses.release ();
219 build_vdef = NULL_TREE;
220 build_vuse = NULL_TREE;
221 }
222
223 gimple_ssa_operands (fn)->free_uses = NULL;
224
225 while ((ptr = gimple_ssa_operands (fn)->operand_memory) != NULL)
226 {
227 gimple_ssa_operands (fn)->operand_memory
228 = gimple_ssa_operands (fn)->operand_memory->next;
229 ggc_free (ptr);
230 }
231
232 gimple_ssa_operands (fn)->ops_active = false;
233
234 if (!n_initialized)
235 bitmap_obstack_release (&operands_bitmap_obstack);
236
237 fn->gimple_df->vop = NULL_TREE;
238 }
239
240
241 /* Return memory for an operand of size SIZE. */
242
243 static inline void *
244 ssa_operand_alloc (struct function *fn, unsigned size)
245 {
246 char *ptr;
247
248 gcc_assert (size == sizeof (struct use_optype_d));
249
250 if (gimple_ssa_operands (fn)->operand_memory_index + size
251 >= gimple_ssa_operands (fn)->ssa_operand_mem_size)
252 {
253 struct ssa_operand_memory_d *ptr;
254
255 switch (gimple_ssa_operands (fn)->ssa_operand_mem_size)
256 {
257 case OP_SIZE_INIT:
258 gimple_ssa_operands (fn)->ssa_operand_mem_size = OP_SIZE_1;
259 break;
260 case OP_SIZE_1:
261 gimple_ssa_operands (fn)->ssa_operand_mem_size = OP_SIZE_2;
262 break;
263 case OP_SIZE_2:
264 case OP_SIZE_3:
265 gimple_ssa_operands (fn)->ssa_operand_mem_size = OP_SIZE_3;
266 break;
267 default:
268 gcc_unreachable ();
269 }
270
271
272 ptr = (ssa_operand_memory_d *) ggc_internal_alloc
273 (sizeof (void *) + gimple_ssa_operands (fn)->ssa_operand_mem_size);
274
275 ptr->next = gimple_ssa_operands (fn)->operand_memory;
276 gimple_ssa_operands (fn)->operand_memory = ptr;
277 gimple_ssa_operands (fn)->operand_memory_index = 0;
278 }
279
280 ptr = &(gimple_ssa_operands (fn)->operand_memory
281 ->mem[gimple_ssa_operands (fn)->operand_memory_index]);
282 gimple_ssa_operands (fn)->operand_memory_index += size;
283 return ptr;
284 }
285
286
287 /* Allocate a USE operand. */
288
289 static inline struct use_optype_d *
290 alloc_use (struct function *fn)
291 {
292 struct use_optype_d *ret;
293 if (gimple_ssa_operands (fn)->free_uses)
294 {
295 ret = gimple_ssa_operands (fn)->free_uses;
296 gimple_ssa_operands (fn)->free_uses
297 = gimple_ssa_operands (fn)->free_uses->next;
298 }
299 else
300 ret = (struct use_optype_d *)
301 ssa_operand_alloc (fn, sizeof (struct use_optype_d));
302 return ret;
303 }
304
305
306 /* Adds OP to the list of uses of statement STMT after LAST. */
307
308 static inline use_optype_p
309 add_use_op (struct function *fn, gimple stmt, tree *op, use_optype_p last)
310 {
311 use_optype_p new_use;
312
313 new_use = alloc_use (fn);
314 USE_OP_PTR (new_use)->use = op;
315 link_imm_use_stmt (USE_OP_PTR (new_use), *op, stmt);
316 last->next = new_use;
317 new_use->next = NULL;
318 return new_use;
319 }
320
321
322
323 /* Takes elements from build_defs and turns them into def operands of STMT.
324 TODO -- Make build_defs vec of tree *. */
325
326 static inline void
327 finalize_ssa_defs (struct function *fn, gimple stmt)
328 {
329 /* Pre-pend the vdef we may have built. */
330 if (build_vdef != NULL_TREE)
331 {
332 tree oldvdef = gimple_vdef (stmt);
333 if (oldvdef
334 && TREE_CODE (oldvdef) == SSA_NAME)
335 oldvdef = SSA_NAME_VAR (oldvdef);
336 if (oldvdef != build_vdef)
337 gimple_set_vdef (stmt, build_vdef);
338 }
339
340 /* Clear and unlink a no longer necessary VDEF. */
341 if (build_vdef == NULL_TREE
342 && gimple_vdef (stmt) != NULL_TREE)
343 {
344 if (TREE_CODE (gimple_vdef (stmt)) == SSA_NAME)
345 {
346 unlink_stmt_vdef (stmt);
347 release_ssa_name_fn (fn, gimple_vdef (stmt));
348 }
349 gimple_set_vdef (stmt, NULL_TREE);
350 }
351
352 /* If we have a non-SSA_NAME VDEF, mark it for renaming. */
353 if (gimple_vdef (stmt)
354 && TREE_CODE (gimple_vdef (stmt)) != SSA_NAME)
355 {
356 fn->gimple_df->rename_vops = 1;
357 fn->gimple_df->ssa_renaming_needed = 1;
358 }
359 }
360
361
362 /* Takes elements from build_uses and turns them into use operands of STMT.
363 TODO -- Make build_uses vec of tree *. */
364
365 static inline void
366 finalize_ssa_uses (struct function *fn, gimple stmt)
367 {
368 unsigned new_i;
369 struct use_optype_d new_list;
370 use_optype_p old_ops, ptr, last;
371
372 /* Pre-pend the VUSE we may have built. */
373 if (build_vuse != NULL_TREE)
374 {
375 tree oldvuse = gimple_vuse (stmt);
376 if (oldvuse
377 && TREE_CODE (oldvuse) == SSA_NAME)
378 oldvuse = SSA_NAME_VAR (oldvuse);
379 if (oldvuse != (build_vuse != NULL_TREE
380 ? build_vuse : build_vdef))
381 gimple_set_vuse (stmt, NULL_TREE);
382 build_uses.safe_insert (0, (tree)gimple_vuse_ptr (stmt));
383 }
384
385 new_list.next = NULL;
386 last = &new_list;
387
388 old_ops = gimple_use_ops (stmt);
389
390 /* Clear a no longer necessary VUSE. */
391 if (build_vuse == NULL_TREE
392 && gimple_vuse (stmt) != NULL_TREE)
393 gimple_set_vuse (stmt, NULL_TREE);
394
395 /* If there is anything in the old list, free it. */
396 if (old_ops)
397 {
398 for (ptr = old_ops; ptr->next; ptr = ptr->next)
399 delink_imm_use (USE_OP_PTR (ptr));
400 delink_imm_use (USE_OP_PTR (ptr));
401 ptr->next = gimple_ssa_operands (fn)->free_uses;
402 gimple_ssa_operands (fn)->free_uses = old_ops;
403 }
404
405 /* If we added a VUSE, make sure to set the operand if it is not already
406 present and mark it for renaming. */
407 if (build_vuse != NULL_TREE
408 && gimple_vuse (stmt) == NULL_TREE)
409 {
410 gimple_set_vuse (stmt, gimple_vop (fn));
411 fn->gimple_df->rename_vops = 1;
412 fn->gimple_df->ssa_renaming_needed = 1;
413 }
414
415 /* Now create nodes for all the new nodes. */
416 for (new_i = 0; new_i < build_uses.length (); new_i++)
417 {
418 tree *op = (tree *) build_uses[new_i];
419 last = add_use_op (fn, stmt, op, last);
420 }
421
422 /* Now set the stmt's operands. */
423 gimple_set_use_ops (stmt, new_list.next);
424 }
425
426
427 /* Clear the in_list bits and empty the build array for VDEFs and
428 VUSEs. */
429
430 static inline void
431 cleanup_build_arrays (void)
432 {
433 build_vdef = NULL_TREE;
434 build_vuse = NULL_TREE;
435 build_uses.truncate (0);
436 }
437
438
439 /* Finalize all the build vectors, fill the new ones into INFO. */
440
441 static inline void
442 finalize_ssa_stmt_operands (struct function *fn, gimple stmt)
443 {
444 finalize_ssa_defs (fn, stmt);
445 finalize_ssa_uses (fn, stmt);
446 cleanup_build_arrays ();
447 }
448
449
450 /* Start the process of building up operands vectors in INFO. */
451
452 static inline void
453 start_ssa_stmt_operands (void)
454 {
455 gcc_assert (build_uses.length () == 0);
456 gcc_assert (build_vuse == NULL_TREE);
457 gcc_assert (build_vdef == NULL_TREE);
458 }
459
460
461 /* Add USE_P to the list of pointers to operands. */
462
463 static inline void
464 append_use (tree *use_p)
465 {
466 build_uses.safe_push ((tree) use_p);
467 }
468
469
470 /* Add VAR to the set of variables that require a VDEF operator. */
471
472 static inline void
473 append_vdef (tree var)
474 {
475 gcc_assert ((build_vdef == NULL_TREE
476 || build_vdef == var)
477 && (build_vuse == NULL_TREE
478 || build_vuse == var));
479
480 build_vdef = var;
481 build_vuse = var;
482 }
483
484
485 /* Add VAR to the set of variables that require a VUSE operator. */
486
487 static inline void
488 append_vuse (tree var)
489 {
490 gcc_assert (build_vuse == NULL_TREE
491 || build_vuse == var);
492
493 build_vuse = var;
494 }
495
496 /* Add virtual operands for STMT. FLAGS is as in get_expr_operands. */
497
498 static void
499 add_virtual_operand (struct function *fn,
500 gimple stmt ATTRIBUTE_UNUSED, int flags)
501 {
502 /* Add virtual operands to the stmt, unless the caller has specifically
503 requested not to do that (used when adding operands inside an
504 ADDR_EXPR expression). */
505 if (flags & opf_no_vops)
506 return;
507
508 gcc_assert (!is_gimple_debug (stmt));
509
510 if (flags & opf_def)
511 append_vdef (gimple_vop (fn));
512 else
513 append_vuse (gimple_vop (fn));
514 }
515
516
517 /* Add *VAR_P to the appropriate operand array for statement STMT.
518 FLAGS is as in get_expr_operands. If *VAR_P is a GIMPLE register,
519 it will be added to the statement's real operands, otherwise it is
520 added to virtual operands. */
521
522 static void
523 add_stmt_operand (struct function *fn, tree *var_p, gimple stmt, int flags)
524 {
525 tree var = *var_p;
526
527 gcc_assert (SSA_VAR_P (*var_p));
528
529 if (is_gimple_reg (var))
530 {
531 /* The variable is a GIMPLE register. Add it to real operands. */
532 if (flags & opf_def)
533 ;
534 else
535 append_use (var_p);
536 if (DECL_P (*var_p))
537 fn->gimple_df->ssa_renaming_needed = 1;
538 }
539 else
540 {
541 /* Mark statements with volatile operands. */
542 if (!(flags & opf_no_vops)
543 && TREE_THIS_VOLATILE (var))
544 gimple_set_has_volatile_ops (stmt, true);
545
546 /* The variable is a memory access. Add virtual operands. */
547 add_virtual_operand (fn, stmt, flags);
548 }
549 }
550
551 /* Mark the base address of REF as having its address taken.
552 REF may be a single variable whose address has been taken or any
553 other valid GIMPLE memory reference (structure reference, array,
554 etc). */
555
556 static void
557 mark_address_taken (tree ref)
558 {
559 tree var;
560
561 /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF
562 as the only thing we take the address of. If VAR is a structure,
563 taking the address of a field means that the whole structure may
564 be referenced using pointer arithmetic. See PR 21407 and the
565 ensuing mailing list discussion. */
566 var = get_base_address (ref);
567 if (var)
568 {
569 if (DECL_P (var))
570 TREE_ADDRESSABLE (var) = 1;
571 else if (TREE_CODE (var) == MEM_REF
572 && TREE_CODE (TREE_OPERAND (var, 0)) == ADDR_EXPR
573 && DECL_P (TREE_OPERAND (TREE_OPERAND (var, 0), 0)))
574 TREE_ADDRESSABLE (TREE_OPERAND (TREE_OPERAND (var, 0), 0)) = 1;
575 }
576 }
577
578
579 /* A subroutine of get_expr_operands to handle MEM_REF.
580
581 STMT is the statement being processed, EXPR is the MEM_REF
582 that got us here.
583
584 FLAGS is as in get_expr_operands. */
585
586 static void
587 get_mem_ref_operands (struct function *fn,
588 gimple stmt, tree expr, int flags)
589 {
590 tree *pptr = &TREE_OPERAND (expr, 0);
591
592 if (!(flags & opf_no_vops)
593 && TREE_THIS_VOLATILE (expr))
594 gimple_set_has_volatile_ops (stmt, true);
595
596 /* Add the VOP. */
597 add_virtual_operand (fn, stmt, flags);
598
599 /* If requested, add a USE operand for the base pointer. */
600 get_expr_operands (fn, stmt, pptr,
601 opf_non_addressable | opf_use
602 | (flags & (opf_no_vops|opf_not_non_addressable)));
603 }
604
605
606 /* A subroutine of get_expr_operands to handle TARGET_MEM_REF. */
607
608 static void
609 get_tmr_operands (struct function *fn, gimple stmt, tree expr, int flags)
610 {
611 if (!(flags & opf_no_vops)
612 && TREE_THIS_VOLATILE (expr))
613 gimple_set_has_volatile_ops (stmt, true);
614
615 /* First record the real operands. */
616 get_expr_operands (fn, stmt,
617 &TMR_BASE (expr), opf_use | (flags & opf_no_vops));
618 get_expr_operands (fn, stmt,
619 &TMR_INDEX (expr), opf_use | (flags & opf_no_vops));
620 get_expr_operands (fn, stmt,
621 &TMR_INDEX2 (expr), opf_use | (flags & opf_no_vops));
622
623 add_virtual_operand (fn, stmt, flags);
624 }
625
626
627 /* If STMT is a call that may clobber globals and other symbols that
628 escape, add them to the VDEF/VUSE lists for it. */
629
630 static void
631 maybe_add_call_vops (struct function *fn, gcall *stmt)
632 {
633 int call_flags = gimple_call_flags (stmt);
634
635 /* If aliases have been computed already, add VDEF or VUSE
636 operands for all the symbols that have been found to be
637 call-clobbered. */
638 if (!(call_flags & ECF_NOVOPS))
639 {
640 /* A 'pure' or a 'const' function never call-clobbers anything. */
641 if (!(call_flags & (ECF_PURE | ECF_CONST)))
642 add_virtual_operand (fn, stmt, opf_def);
643 else if (!(call_flags & ECF_CONST))
644 add_virtual_operand (fn, stmt, opf_use);
645 }
646 }
647
648
649 /* Scan operands in the ASM_EXPR stmt referred to in INFO. */
650
651 static void
652 get_asm_stmt_operands (struct function *fn, gasm *stmt)
653 {
654 size_t i, noutputs;
655 const char **oconstraints;
656 const char *constraint;
657 bool allows_mem, allows_reg, is_inout;
658
659 noutputs = gimple_asm_noutputs (stmt);
660 oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
661
662 /* Gather all output operands. */
663 for (i = 0; i < gimple_asm_noutputs (stmt); i++)
664 {
665 tree link = gimple_asm_output_op (stmt, i);
666 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
667 oconstraints[i] = constraint;
668 parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
669 &allows_reg, &is_inout);
670
671 /* This should have been split in gimplify_asm_expr. */
672 gcc_assert (!allows_reg || !is_inout);
673
674 /* Memory operands are addressable. Note that STMT needs the
675 address of this operand. */
676 if (!allows_reg && allows_mem)
677 mark_address_taken (TREE_VALUE (link));
678
679 get_expr_operands (fn, stmt,
680 &TREE_VALUE (link), opf_def | opf_not_non_addressable);
681 }
682
683 /* Gather all input operands. */
684 for (i = 0; i < gimple_asm_ninputs (stmt); i++)
685 {
686 tree link = gimple_asm_input_op (stmt, i);
687 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
688 parse_input_constraint (&constraint, 0, 0, noutputs, 0, oconstraints,
689 &allows_mem, &allows_reg);
690
691 /* Memory operands are addressable. Note that STMT needs the
692 address of this operand. */
693 if (!allows_reg && allows_mem)
694 mark_address_taken (TREE_VALUE (link));
695
696 get_expr_operands (fn, stmt, &TREE_VALUE (link), opf_not_non_addressable);
697 }
698
699 /* Clobber all memory and addressable symbols for asm ("" : : : "memory"); */
700 if (gimple_asm_clobbers_memory_p (stmt))
701 add_virtual_operand (fn, stmt, opf_def);
702 }
703
704
705 /* Recursively scan the expression pointed to by EXPR_P in statement
706 STMT. FLAGS is one of the OPF_* constants modifying how to
707 interpret the operands found. */
708
709 static void
710 get_expr_operands (struct function *fn, gimple stmt, tree *expr_p, int flags)
711 {
712 enum tree_code code;
713 enum tree_code_class codeclass;
714 tree expr = *expr_p;
715 int uflags = opf_use;
716
717 if (expr == NULL)
718 return;
719
720 if (is_gimple_debug (stmt))
721 uflags |= (flags & opf_no_vops);
722
723 code = TREE_CODE (expr);
724 codeclass = TREE_CODE_CLASS (code);
725
726 switch (code)
727 {
728 case ADDR_EXPR:
729 /* Taking the address of a variable does not represent a
730 reference to it, but the fact that the statement takes its
731 address will be of interest to some passes (e.g. alias
732 resolution). */
733 if ((!(flags & opf_non_addressable)
734 || (flags & opf_not_non_addressable))
735 && !is_gimple_debug (stmt))
736 mark_address_taken (TREE_OPERAND (expr, 0));
737
738 /* Otherwise, there may be variables referenced inside but there
739 should be no VUSEs created, since the referenced objects are
740 not really accessed. The only operands that we should find
741 here are ARRAY_REF indices which will always be real operands
742 (GIMPLE does not allow non-registers as array indices). */
743 flags |= opf_no_vops;
744 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 0),
745 flags | opf_not_non_addressable | opf_address_taken);
746 return;
747
748 case SSA_NAME:
749 case VAR_DECL:
750 case PARM_DECL:
751 case RESULT_DECL:
752 if (!(flags & opf_address_taken))
753 add_stmt_operand (fn, expr_p, stmt, flags);
754 return;
755
756 case DEBUG_EXPR_DECL:
757 gcc_assert (gimple_debug_bind_p (stmt));
758 return;
759
760 case MEM_REF:
761 get_mem_ref_operands (fn, stmt, expr, flags);
762 return;
763
764 case TARGET_MEM_REF:
765 get_tmr_operands (fn, stmt, expr, flags);
766 return;
767
768 case ARRAY_REF:
769 case ARRAY_RANGE_REF:
770 case COMPONENT_REF:
771 case REALPART_EXPR:
772 case IMAGPART_EXPR:
773 {
774 if (!(flags & opf_no_vops)
775 && TREE_THIS_VOLATILE (expr))
776 gimple_set_has_volatile_ops (stmt, true);
777
778 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 0), flags);
779
780 if (code == COMPONENT_REF)
781 {
782 if (!(flags & opf_no_vops)
783 && TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1)))
784 gimple_set_has_volatile_ops (stmt, true);
785 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 2), uflags);
786 }
787 else if (code == ARRAY_REF || code == ARRAY_RANGE_REF)
788 {
789 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 1), uflags);
790 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 2), uflags);
791 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 3), uflags);
792 }
793
794 return;
795 }
796
797 case WITH_SIZE_EXPR:
798 /* WITH_SIZE_EXPR is a pass-through reference to its first argument,
799 and an rvalue reference to its second argument. */
800 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 1), uflags);
801 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 0), flags);
802 return;
803
804 case COND_EXPR:
805 case VEC_COND_EXPR:
806 case VEC_PERM_EXPR:
807 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 0), uflags);
808 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 1), uflags);
809 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 2), uflags);
810 return;
811
812 case CONSTRUCTOR:
813 {
814 /* General aggregate CONSTRUCTORs have been decomposed, but they
815 are still in use as the COMPLEX_EXPR equivalent for vectors. */
816 constructor_elt *ce;
817 unsigned HOST_WIDE_INT idx;
818
819 /* A volatile constructor is actually TREE_CLOBBER_P, transfer
820 the volatility to the statement, don't use TREE_CLOBBER_P for
821 mirroring the other uses of THIS_VOLATILE in this file. */
822 if (!(flags & opf_no_vops)
823 && TREE_THIS_VOLATILE (expr))
824 gimple_set_has_volatile_ops (stmt, true);
825
826 for (idx = 0;
827 vec_safe_iterate (CONSTRUCTOR_ELTS (expr), idx, &ce);
828 idx++)
829 get_expr_operands (fn, stmt, &ce->value, uflags);
830
831 return;
832 }
833
834 case BIT_FIELD_REF:
835 if (!(flags & opf_no_vops)
836 && TREE_THIS_VOLATILE (expr))
837 gimple_set_has_volatile_ops (stmt, true);
838 /* FALLTHRU */
839
840 case VIEW_CONVERT_EXPR:
841 do_unary:
842 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 0), flags);
843 return;
844
845 case COMPOUND_EXPR:
846 case OBJ_TYPE_REF:
847 case ASSERT_EXPR:
848 do_binary:
849 {
850 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 0), flags);
851 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 1), flags);
852 return;
853 }
854
855 case DOT_PROD_EXPR:
856 case SAD_EXPR:
857 case REALIGN_LOAD_EXPR:
858 case WIDEN_MULT_PLUS_EXPR:
859 case WIDEN_MULT_MINUS_EXPR:
860 case FMA_EXPR:
861 {
862 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 0), flags);
863 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 1), flags);
864 get_expr_operands (fn, stmt, &TREE_OPERAND (expr, 2), flags);
865 return;
866 }
867
868 case FUNCTION_DECL:
869 case LABEL_DECL:
870 case CONST_DECL:
871 case CASE_LABEL_EXPR:
872 /* Expressions that make no memory references. */
873 return;
874
875 default:
876 if (codeclass == tcc_unary)
877 goto do_unary;
878 if (codeclass == tcc_binary || codeclass == tcc_comparison)
879 goto do_binary;
880 if (codeclass == tcc_constant || codeclass == tcc_type)
881 return;
882 }
883
884 /* If we get here, something has gone wrong. */
885 #ifdef ENABLE_CHECKING
886 fprintf (stderr, "unhandled expression in get_expr_operands():\n");
887 debug_tree (expr);
888 fputs ("\n", stderr);
889 #endif
890 gcc_unreachable ();
891 }
892
893
894 /* Parse STMT looking for operands. When finished, the various
895 build_* operand vectors will have potential operands in them. */
896
897 static void
898 parse_ssa_operands (struct function *fn, gimple stmt)
899 {
900 enum gimple_code code = gimple_code (stmt);
901 size_t i, n, start = 0;
902
903 switch (code)
904 {
905 case GIMPLE_ASM:
906 get_asm_stmt_operands (fn, as_a <gasm *> (stmt));
907 break;
908
909 case GIMPLE_TRANSACTION:
910 /* The start of a transaction is a memory barrier. */
911 add_virtual_operand (fn, stmt, opf_def | opf_use);
912 break;
913
914 case GIMPLE_DEBUG:
915 if (gimple_debug_bind_p (stmt)
916 && gimple_debug_bind_has_value_p (stmt))
917 get_expr_operands (fn, stmt, gimple_debug_bind_get_value_ptr (stmt),
918 opf_use | opf_no_vops);
919 break;
920
921 case GIMPLE_RETURN:
922 append_vuse (gimple_vop (fn));
923 goto do_default;
924
925 case GIMPLE_CALL:
926 /* Add call-clobbered operands, if needed. */
927 maybe_add_call_vops (fn, as_a <gcall *> (stmt));
928 /* FALLTHRU */
929
930 case GIMPLE_ASSIGN:
931 get_expr_operands (fn, stmt, gimple_op_ptr (stmt, 0), opf_def);
932 start = 1;
933 /* FALLTHRU */
934
935 default:
936 do_default:
937 n = gimple_num_ops (stmt);
938 for (i = start; i < n; i++)
939 get_expr_operands (fn, stmt, gimple_op_ptr (stmt, i), opf_use);
940 break;
941 }
942 }
943
944
945 /* Create an operands cache for STMT. */
946
947 static void
948 build_ssa_operands (struct function *fn, gimple stmt)
949 {
950 /* Initially assume that the statement has no volatile operands. */
951 gimple_set_has_volatile_ops (stmt, false);
952
953 start_ssa_stmt_operands ();
954 parse_ssa_operands (fn, stmt);
955 finalize_ssa_stmt_operands (fn, stmt);
956 }
957
958 /* Verifies SSA statement operands. */
959
960 DEBUG_FUNCTION bool
961 verify_ssa_operands (struct function *fn, gimple stmt)
962 {
963 use_operand_p use_p;
964 def_operand_p def_p;
965 ssa_op_iter iter;
966 unsigned i;
967 tree use, def;
968 bool volatile_p = gimple_has_volatile_ops (stmt);
969
970 /* build_ssa_operands w/o finalizing them. */
971 gimple_set_has_volatile_ops (stmt, false);
972 start_ssa_stmt_operands ();
973 parse_ssa_operands (fn, stmt);
974
975 /* Now verify the built operands are the same as present in STMT. */
976 def = gimple_vdef (stmt);
977 if (def
978 && TREE_CODE (def) == SSA_NAME)
979 def = SSA_NAME_VAR (def);
980 if (build_vdef != def)
981 {
982 error ("virtual definition of statement not up-to-date");
983 return true;
984 }
985 if (gimple_vdef (stmt)
986 && ((def_p = gimple_vdef_op (stmt)) == NULL_DEF_OPERAND_P
987 || DEF_FROM_PTR (def_p) != gimple_vdef (stmt)))
988 {
989 error ("virtual def operand missing for stmt");
990 return true;
991 }
992
993 use = gimple_vuse (stmt);
994 if (use
995 && TREE_CODE (use) == SSA_NAME)
996 use = SSA_NAME_VAR (use);
997 if (build_vuse != use)
998 {
999 error ("virtual use of statement not up-to-date");
1000 return true;
1001 }
1002 if (gimple_vuse (stmt)
1003 && ((use_p = gimple_vuse_op (stmt)) == NULL_USE_OPERAND_P
1004 || USE_FROM_PTR (use_p) != gimple_vuse (stmt)))
1005 {
1006 error ("virtual use operand missing for stmt");
1007 return true;
1008 }
1009
1010 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
1011 {
1012 FOR_EACH_VEC_ELT (build_uses, i, use)
1013 {
1014 if (use_p->use == (tree *)use)
1015 {
1016 build_uses[i] = NULL_TREE;
1017 break;
1018 }
1019 }
1020 if (i == build_uses.length ())
1021 {
1022 error ("excess use operand for stmt");
1023 debug_generic_expr (USE_FROM_PTR (use_p));
1024 return true;
1025 }
1026 }
1027 FOR_EACH_VEC_ELT (build_uses, i, use)
1028 if (use != NULL_TREE)
1029 {
1030 error ("use operand missing for stmt");
1031 debug_generic_expr (*(tree *)use);
1032 return true;
1033 }
1034
1035 if (gimple_has_volatile_ops (stmt) != volatile_p)
1036 {
1037 error ("stmt volatile flag not up-to-date");
1038 return true;
1039 }
1040
1041 cleanup_build_arrays ();
1042 return false;
1043 }
1044
1045
1046 /* Releases the operands of STMT back to their freelists, and clears
1047 the stmt operand lists. */
1048
1049 void
1050 free_stmt_operands (struct function *fn, gimple stmt)
1051 {
1052 use_optype_p uses = gimple_use_ops (stmt), last_use;
1053
1054 if (uses)
1055 {
1056 for (last_use = uses; last_use->next; last_use = last_use->next)
1057 delink_imm_use (USE_OP_PTR (last_use));
1058 delink_imm_use (USE_OP_PTR (last_use));
1059 last_use->next = gimple_ssa_operands (fn)->free_uses;
1060 gimple_ssa_operands (fn)->free_uses = uses;
1061 gimple_set_use_ops (stmt, NULL);
1062 }
1063
1064 if (gimple_has_mem_ops (stmt))
1065 {
1066 gimple_set_vuse (stmt, NULL_TREE);
1067 gimple_set_vdef (stmt, NULL_TREE);
1068 }
1069 }
1070
1071
1072 /* Get the operands of statement STMT. */
1073
1074 void
1075 update_stmt_operands (struct function *fn, gimple stmt)
1076 {
1077 /* If update_stmt_operands is called before SSA is initialized, do
1078 nothing. */
1079 if (!ssa_operands_active (fn))
1080 return;
1081
1082 timevar_push (TV_TREE_OPS);
1083
1084 gcc_assert (gimple_modified_p (stmt));
1085 build_ssa_operands (fn, stmt);
1086 gimple_set_modified (stmt, false);
1087
1088 timevar_pop (TV_TREE_OPS);
1089 }
1090
1091
1092 /* Swap operands EXP0 and EXP1 in statement STMT. No attempt is done
1093 to test the validity of the swap operation. */
1094
1095 void
1096 swap_ssa_operands (gimple stmt, tree *exp0, tree *exp1)
1097 {
1098 tree op0, op1;
1099 op0 = *exp0;
1100 op1 = *exp1;
1101
1102 if (op0 != op1)
1103 {
1104 /* Attempt to preserve the relative positions of these two operands in
1105 their * respective immediate use lists by adjusting their use pointer
1106 to point to the new operand position. */
1107 use_optype_p use0, use1, ptr;
1108 use0 = use1 = NULL;
1109
1110 /* Find the 2 operands in the cache, if they are there. */
1111 for (ptr = gimple_use_ops (stmt); ptr; ptr = ptr->next)
1112 if (USE_OP_PTR (ptr)->use == exp0)
1113 {
1114 use0 = ptr;
1115 break;
1116 }
1117
1118 for (ptr = gimple_use_ops (stmt); ptr; ptr = ptr->next)
1119 if (USE_OP_PTR (ptr)->use == exp1)
1120 {
1121 use1 = ptr;
1122 break;
1123 }
1124
1125 /* And adjust their location to point to the new position of the
1126 operand. */
1127 if (use0)
1128 USE_OP_PTR (use0)->use = exp1;
1129 if (use1)
1130 USE_OP_PTR (use1)->use = exp0;
1131
1132 /* Now swap the data. */
1133 *exp0 = op1;
1134 *exp1 = op0;
1135 }
1136 }
1137
1138
1139 /* Scan the immediate_use list for VAR making sure its linked properly.
1140 Return TRUE if there is a problem and emit an error message to F. */
1141
1142 DEBUG_FUNCTION bool
1143 verify_imm_links (FILE *f, tree var)
1144 {
1145 use_operand_p ptr, prev, list;
1146 int count;
1147
1148 gcc_assert (TREE_CODE (var) == SSA_NAME);
1149
1150 list = &(SSA_NAME_IMM_USE_NODE (var));
1151 gcc_assert (list->use == NULL);
1152
1153 if (list->prev == NULL)
1154 {
1155 gcc_assert (list->next == NULL);
1156 return false;
1157 }
1158
1159 prev = list;
1160 count = 0;
1161 for (ptr = list->next; ptr != list; )
1162 {
1163 if (prev != ptr->prev)
1164 goto error;
1165
1166 if (ptr->use == NULL)
1167 goto error; /* 2 roots, or SAFE guard node. */
1168 else if (*(ptr->use) != var)
1169 goto error;
1170
1171 prev = ptr;
1172 ptr = ptr->next;
1173
1174 /* Avoid infinite loops. 50,000,000 uses probably indicates a
1175 problem. */
1176 if (count++ > 50000000)
1177 goto error;
1178 }
1179
1180 /* Verify list in the other direction. */
1181 prev = list;
1182 for (ptr = list->prev; ptr != list; )
1183 {
1184 if (prev != ptr->next)
1185 goto error;
1186 prev = ptr;
1187 ptr = ptr->prev;
1188 if (count-- < 0)
1189 goto error;
1190 }
1191
1192 if (count != 0)
1193 goto error;
1194
1195 return false;
1196
1197 error:
1198 if (ptr->loc.stmt && gimple_modified_p (ptr->loc.stmt))
1199 {
1200 fprintf (f, " STMT MODIFIED. - <%p> ", (void *)ptr->loc.stmt);
1201 print_gimple_stmt (f, ptr->loc.stmt, 0, TDF_SLIM);
1202 }
1203 fprintf (f, " IMM ERROR : (use_p : tree - %p:%p)", (void *)ptr,
1204 (void *)ptr->use);
1205 print_generic_expr (f, USE_FROM_PTR (ptr), TDF_SLIM);
1206 fprintf (f, "\n");
1207 return true;
1208 }
1209
1210
1211 /* Dump all the immediate uses to FILE. */
1212
1213 void
1214 dump_immediate_uses_for (FILE *file, tree var)
1215 {
1216 imm_use_iterator iter;
1217 use_operand_p use_p;
1218
1219 gcc_assert (var && TREE_CODE (var) == SSA_NAME);
1220
1221 print_generic_expr (file, var, TDF_SLIM);
1222 fprintf (file, " : -->");
1223 if (has_zero_uses (var))
1224 fprintf (file, " no uses.\n");
1225 else
1226 if (has_single_use (var))
1227 fprintf (file, " single use.\n");
1228 else
1229 fprintf (file, "%d uses.\n", num_imm_uses (var));
1230
1231 FOR_EACH_IMM_USE_FAST (use_p, iter, var)
1232 {
1233 if (use_p->loc.stmt == NULL && use_p->use == NULL)
1234 fprintf (file, "***end of stmt iterator marker***\n");
1235 else
1236 if (!is_gimple_reg (USE_FROM_PTR (use_p)))
1237 print_gimple_stmt (file, USE_STMT (use_p), 0, TDF_VOPS|TDF_MEMSYMS);
1238 else
1239 print_gimple_stmt (file, USE_STMT (use_p), 0, TDF_SLIM);
1240 }
1241 fprintf (file, "\n");
1242 }
1243
1244
1245 /* Dump all the immediate uses to FILE. */
1246
1247 void
1248 dump_immediate_uses (FILE *file)
1249 {
1250 tree var;
1251 unsigned int x;
1252
1253 fprintf (file, "Immediate_uses: \n\n");
1254 for (x = 1; x < num_ssa_names; x++)
1255 {
1256 var = ssa_name (x);
1257 if (!var)
1258 continue;
1259 dump_immediate_uses_for (file, var);
1260 }
1261 }
1262
1263
1264 /* Dump def-use edges on stderr. */
1265
1266 DEBUG_FUNCTION void
1267 debug_immediate_uses (void)
1268 {
1269 dump_immediate_uses (stderr);
1270 }
1271
1272
1273 /* Dump def-use edges on stderr. */
1274
1275 DEBUG_FUNCTION void
1276 debug_immediate_uses_for (tree var)
1277 {
1278 dump_immediate_uses_for (stderr, var);
1279 }
1280
1281
1282 /* Unlink STMTs virtual definition from the IL by propagating its use. */
1283
1284 void
1285 unlink_stmt_vdef (gimple stmt)
1286 {
1287 use_operand_p use_p;
1288 imm_use_iterator iter;
1289 gimple use_stmt;
1290 tree vdef = gimple_vdef (stmt);
1291 tree vuse = gimple_vuse (stmt);
1292
1293 if (!vdef
1294 || TREE_CODE (vdef) != SSA_NAME)
1295 return;
1296
1297 FOR_EACH_IMM_USE_STMT (use_stmt, iter, vdef)
1298 {
1299 FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
1300 SET_USE (use_p, vuse);
1301 }
1302
1303 if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vdef))
1304 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (vuse) = 1;
1305 }
1306
1307
1308 /* Return true if the var whose chain of uses starts at PTR has no
1309 nondebug uses. */
1310 bool
1311 has_zero_uses_1 (const ssa_use_operand_t *head)
1312 {
1313 const ssa_use_operand_t *ptr;
1314
1315 for (ptr = head->next; ptr != head; ptr = ptr->next)
1316 if (!is_gimple_debug (USE_STMT (ptr)))
1317 return false;
1318
1319 return true;
1320 }
1321
1322
1323 /* Return true if the var whose chain of uses starts at PTR has a
1324 single nondebug use. Set USE_P and STMT to that single nondebug
1325 use, if so, or to NULL otherwise. */
1326 bool
1327 single_imm_use_1 (const ssa_use_operand_t *head,
1328 use_operand_p *use_p, gimple *stmt)
1329 {
1330 ssa_use_operand_t *ptr, *single_use = 0;
1331
1332 for (ptr = head->next; ptr != head; ptr = ptr->next)
1333 if (!is_gimple_debug (USE_STMT (ptr)))
1334 {
1335 if (single_use)
1336 {
1337 single_use = NULL;
1338 break;
1339 }
1340 single_use = ptr;
1341 }
1342
1343 if (use_p)
1344 *use_p = single_use;
1345
1346 if (stmt)
1347 *stmt = single_use ? single_use->loc.stmt : NULL;
1348
1349 return single_use;
1350 }