OSDN Git Service

* cgraph.h (varpool_empty_needed_queue): Declare.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-operands.c
1 /* SSA operands management for trees.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007 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 "tm.h"
24 #include "tree.h"
25 #include "flags.h"
26 #include "function.h"
27 #include "diagnostic.h"
28 #include "tree-flow.h"
29 #include "tree-inline.h"
30 #include "tree-pass.h"
31 #include "ggc.h"
32 #include "timevar.h"
33 #include "toplev.h"
34 #include "langhooks.h"
35 #include "ipa-reference.h"
36
37 /* This file contains the code required to manage the operands cache of the 
38    SSA optimizer.  For every stmt, we maintain an operand cache in the stmt 
39    annotation.  This cache contains operands that will be of interest to 
40    optimizers and other passes wishing to manipulate the IL. 
41
42    The operand type are broken up into REAL and VIRTUAL operands.  The real 
43    operands are represented as pointers into the stmt's operand tree.  Thus 
44    any manipulation of the real operands will be reflected in the actual tree.
45    Virtual operands are represented solely in the cache, although the base 
46    variable for the SSA_NAME may, or may not occur in the stmt's tree.  
47    Manipulation of the virtual operands will not be reflected in the stmt tree.
48
49    The routines in this file are concerned with creating this operand cache 
50    from a stmt tree.
51
52    The operand tree is the parsed by the various get_* routines which look 
53    through the stmt tree for the occurrence of operands which may be of 
54    interest, and calls are made to the append_* routines whenever one is 
55    found.  There are 4 of these routines, each representing one of the 
56    4 types of operands. Defs, Uses, Virtual Uses, and Virtual May Defs.
57
58    The append_* routines check for duplication, and simply keep a list of 
59    unique objects for each operand type in the build_* extendable vectors.
60
61    Once the stmt tree is completely parsed, the finalize_ssa_operands() 
62    routine is called, which proceeds to perform the finalization routine 
63    on each of the 4 operand vectors which have been built up.
64
65    If the stmt had a previous operand cache, the finalization routines 
66    attempt to match up the new operands with the old ones.  If it's a perfect 
67    match, the old vector is simply reused.  If it isn't a perfect match, then 
68    a new vector is created and the new operands are placed there.  For 
69    virtual operands, if the previous cache had SSA_NAME version of a 
70    variable, and that same variable occurs in the same operands cache, then 
71    the new cache vector will also get the same SSA_NAME.
72
73    i.e., if a stmt had a VUSE of 'a_5', and 'a' occurs in the new
74    operand vector for VUSE, then the new vector will also be modified
75    such that it contains 'a_5' rather than 'a'.  */
76
77
78 /* Structure storing statistics on how many call clobbers we have, and
79    how many where avoided.  */
80
81 static struct 
82 {
83   /* Number of call-clobbered ops we attempt to add to calls in
84      add_call_clobbered_mem_symbols.  */
85   unsigned int clobbered_vars;
86
87   /* Number of write-clobbers (VDEFs) avoided by using
88      not_written information.  */
89   unsigned int static_write_clobbers_avoided;
90
91   /* Number of reads (VUSEs) avoided by using not_read information.  */
92   unsigned int static_read_clobbers_avoided;
93   
94   /* Number of write-clobbers avoided because the variable can't escape to
95      this call.  */
96   unsigned int unescapable_clobbers_avoided;
97
98   /* Number of read-only uses we attempt to add to calls in
99      add_call_read_mem_symbols.  */
100   unsigned int readonly_clobbers;
101
102   /* Number of read-only uses we avoid using not_read information.  */
103   unsigned int static_readonly_clobbers_avoided;
104 } clobber_stats;
105
106
107 /* Flags to describe operand properties in helpers.  */
108
109 /* By default, operands are loaded.  */
110 #define opf_use         0
111
112 /* Operand is the target of an assignment expression or a 
113    call-clobbered variable.  */
114 #define opf_def         (1 << 0)
115
116 /* No virtual operands should be created in the expression.  This is used
117    when traversing ADDR_EXPR nodes which have different semantics than
118    other expressions.  Inside an ADDR_EXPR node, the only operands that we
119    need to consider are indices into arrays.  For instance, &a.b[i] should
120    generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
121    VUSE for 'b'.  */
122 #define opf_no_vops     (1 << 1)
123
124 /* Operand is an implicit reference.  This is used to distinguish
125    explicit assignments in the form of GIMPLE_MODIFY_STMT from
126    clobbering sites like function calls or ASM_EXPRs.  */
127 #define opf_implicit    (1 << 2)
128
129 /* Array for building all the def operands.  */
130 static VEC(tree,heap) *build_defs;
131
132 /* Array for building all the use operands.  */
133 static VEC(tree,heap) *build_uses;
134
135 /* Set for building all the VDEF operands.  */
136 static VEC(tree,heap) *build_vdefs;
137
138 /* Set for building all the VUSE operands.  */
139 static VEC(tree,heap) *build_vuses;
140
141 /* Bitmap obstack for our datastructures that needs to survive across   
142    compilations of multiple functions.  */
143 static bitmap_obstack operands_bitmap_obstack;
144
145 /* Set for building all the loaded symbols.  */
146 static bitmap build_loads;
147
148 /* Set for building all the stored symbols.  */
149 static bitmap build_stores;
150
151 static void get_expr_operands (tree, tree *, int);
152
153 /* Number of functions with initialized ssa_operands.  */
154 static int n_initialized = 0;
155
156 /* Statement change buffer.  Data structure used to record state
157    information for statements.  This is used to determine what needs
158    to be done in order to update the SSA web after a statement is
159    modified by a pass.  If STMT is a statement that has just been
160    created, or needs to be folded via fold_stmt, or anything that
161    changes its physical structure then the pass should:
162
163    1- Call push_stmt_changes (&stmt) to record the current state of
164       STMT before any modifications are made.
165
166    2- Make all appropriate modifications to the statement.
167
168    3- Call pop_stmt_changes (&stmt) to find new symbols that
169       need to be put in SSA form, SSA name mappings for names that
170       have disappeared, recompute invariantness for address
171       expressions, cleanup EH information, etc.
172
173    If it is possible to determine that the statement was not modified,
174    instead of calling pop_stmt_changes it is quicker to call
175    discard_stmt_changes to avoid the expensive and unnecessary operand
176    re-scan and change comparison.  */
177
178 struct scb_d
179 {
180   /* Pointer to the statement being modified.  */
181   tree *stmt_p;
182
183   /* If the statement references memory these are the sets of symbols
184      loaded and stored by the statement.  */
185   bitmap loads;
186   bitmap stores;
187 };
188
189 typedef struct scb_d *scb_t;
190 DEF_VEC_P(scb_t);
191 DEF_VEC_ALLOC_P(scb_t,heap);
192
193 /* Stack of statement change buffers (SCB).  Every call to
194    push_stmt_changes pushes a new buffer onto the stack.  Calls to
195    pop_stmt_changes pop a buffer off of the stack and compute the set
196    of changes for the popped statement.  */
197 static VEC(scb_t,heap) *scb_stack;
198
199 /* Return the DECL_UID of the base variable of T.  */
200
201 static inline unsigned
202 get_name_decl (const_tree t)
203 {
204   if (TREE_CODE (t) != SSA_NAME)
205     return DECL_UID (t);
206   else
207     return DECL_UID (SSA_NAME_VAR (t));
208 }
209
210
211 /* Comparison function for qsort used in operand_build_sort_virtual.  */
212
213 int
214 operand_build_cmp (const void *p, const void *q)
215 {
216   const_tree const e1 = *((const_tree const *)p);
217   const_tree const e2 = *((const_tree const *)q);
218   const unsigned int u1 = get_name_decl (e1);
219   const unsigned int u2 = get_name_decl (e2);
220
221   /* We want to sort in ascending order.  They can never be equal.  */
222 #ifdef ENABLE_CHECKING
223   gcc_assert (u1 != u2);
224 #endif
225   return (u1 > u2 ? 1 : -1);
226 }
227
228
229 /* Sort the virtual operands in LIST from lowest DECL_UID to highest.  */
230
231 static inline void
232 operand_build_sort_virtual (VEC(tree,heap) *list)
233 {
234   int num = VEC_length (tree, list);
235
236   if (num < 2)
237     return;
238
239   if (num == 2)
240     {
241       if (get_name_decl (VEC_index (tree, list, 0)) 
242           > get_name_decl (VEC_index (tree, list, 1)))
243         {  
244           /* Swap elements if in the wrong order.  */
245           tree tmp = VEC_index (tree, list, 0);
246           VEC_replace (tree, list, 0, VEC_index (tree, list, 1));
247           VEC_replace (tree, list, 1, tmp);
248         }
249       return;
250     }
251
252   /* There are 3 or more elements, call qsort.  */
253   qsort (VEC_address (tree, list), 
254          VEC_length (tree, list), 
255          sizeof (tree),
256          operand_build_cmp);
257 }
258
259
260 /*  Return true if the SSA operands cache is active.  */
261
262 bool
263 ssa_operands_active (void)
264 {
265   return cfun->gimple_df && gimple_ssa_operands (cfun)->ops_active;
266 }
267
268
269 /* VOPs are of variable sized, so the free list maps "free buckets" to the 
270    following table:  
271     bucket   # operands
272     ------   ----------
273         0       1
274         1       2
275           ...
276         15      16
277         16      17-24
278         17      25-32
279         18      31-40
280           ...
281         29      121-128
282    Any VOPs larger than this are simply added to the largest bucket when they
283    are freed.  */
284
285
286 /* Return the number of operands used in bucket BUCKET.  */
287
288 static inline int
289 vop_free_bucket_size (int bucket)
290 {
291 #ifdef ENABLE_CHECKING
292   gcc_assert (bucket >= 0 && bucket < NUM_VOP_FREE_BUCKETS);
293 #endif
294   if (bucket < 16)
295     return bucket + 1;
296   return (bucket - 13) * 8;
297 }
298
299
300 /* For a vop of NUM operands, return the bucket NUM belongs to.  If NUM is 
301    beyond the end of the bucket table, return -1.  */
302
303 static inline int 
304 vop_free_bucket_index (int num)
305 {
306   gcc_assert (num > 0 && NUM_VOP_FREE_BUCKETS > 16);
307
308   /* Sizes 1 through 16 use buckets 0-15.  */
309   if (num <= 16)
310     return num - 1;
311   /* Buckets 16 - NUM_VOP_FREE_BUCKETS represent 8 unit chunks.  */
312   num = 14 + (num - 1) / 8;
313   if (num >= NUM_VOP_FREE_BUCKETS)
314     return -1;
315   else
316     return num;
317 }
318
319
320 /* Initialize the VOP free buckets.  */
321
322 static inline void
323 init_vop_buckets (void)
324 {
325   int x;
326
327   for (x = 0; x < NUM_VOP_FREE_BUCKETS; x++)
328     gimple_ssa_operands (cfun)->vop_free_buckets[x] = NULL;
329 }
330
331
332 /* Add PTR to the appropriate VOP bucket.  */
333
334 static inline void
335 add_vop_to_freelist (voptype_p ptr)
336 {
337   int bucket = vop_free_bucket_index (VUSE_VECT_NUM_ELEM (ptr->usev));
338
339   /* Too large, use the largest bucket so its not a complete throw away.  */
340   if (bucket == -1)
341     bucket = NUM_VOP_FREE_BUCKETS - 1;
342
343   ptr->next = gimple_ssa_operands (cfun)->vop_free_buckets[bucket];
344   gimple_ssa_operands (cfun)->vop_free_buckets[bucket] = ptr;
345 }
346  
347
348 /* These are the sizes of the operand memory  buffer which gets allocated each 
349    time more operands space is required.  The final value is the amount that is
350    allocated every time after that.  */
351   
352 #define OP_SIZE_INIT    0
353 #define OP_SIZE_1       30
354 #define OP_SIZE_2       110
355 #define OP_SIZE_3       511
356
357 /* Initialize the operand cache routines.  */
358
359 void
360 init_ssa_operands (void)
361 {
362   if (!n_initialized++)
363     {
364       build_defs = VEC_alloc (tree, heap, 5);
365       build_uses = VEC_alloc (tree, heap, 10);
366       build_vuses = VEC_alloc (tree, heap, 25);
367       build_vdefs = VEC_alloc (tree, heap, 25);
368       bitmap_obstack_initialize (&operands_bitmap_obstack);
369       build_loads = BITMAP_ALLOC (&operands_bitmap_obstack);
370       build_stores = BITMAP_ALLOC (&operands_bitmap_obstack);
371       scb_stack = VEC_alloc (scb_t, heap, 20);
372     }
373
374   gcc_assert (gimple_ssa_operands (cfun)->operand_memory == NULL);
375   gcc_assert (gimple_ssa_operands (cfun)->mpt_table == NULL);
376   gimple_ssa_operands (cfun)->operand_memory_index
377      = gimple_ssa_operands (cfun)->ssa_operand_mem_size;
378   gimple_ssa_operands (cfun)->ops_active = true;
379   memset (&clobber_stats, 0, sizeof (clobber_stats));
380   init_vop_buckets ();
381   gimple_ssa_operands (cfun)->ssa_operand_mem_size = OP_SIZE_INIT;
382 }
383
384
385 /* Dispose of anything required by the operand routines.  */
386
387 void
388 fini_ssa_operands (void)
389 {
390   struct ssa_operand_memory_d *ptr;
391   unsigned ix;
392   tree mpt;
393
394   if (!--n_initialized)
395     {
396       VEC_free (tree, heap, build_defs);
397       VEC_free (tree, heap, build_uses);
398       VEC_free (tree, heap, build_vdefs);
399       VEC_free (tree, heap, build_vuses);
400       BITMAP_FREE (build_loads);
401       BITMAP_FREE (build_stores);
402
403       /* The change buffer stack had better be empty.  */
404       gcc_assert (VEC_length (scb_t, scb_stack) == 0);
405       VEC_free (scb_t, heap, scb_stack);
406       scb_stack = NULL;
407     }
408
409   gimple_ssa_operands (cfun)->free_defs = NULL;
410   gimple_ssa_operands (cfun)->free_uses = NULL;
411
412   while ((ptr = gimple_ssa_operands (cfun)->operand_memory) != NULL)
413     {
414       gimple_ssa_operands (cfun)->operand_memory
415         = gimple_ssa_operands (cfun)->operand_memory->next;
416       ggc_free (ptr);
417     }
418
419   for (ix = 0;
420        VEC_iterate (tree, gimple_ssa_operands (cfun)->mpt_table, ix, mpt);
421        ix++)
422     {
423       if (mpt)
424         BITMAP_FREE (MPT_SYMBOLS (mpt));
425     }
426
427   VEC_free (tree, heap, gimple_ssa_operands (cfun)->mpt_table);
428
429   gimple_ssa_operands (cfun)->ops_active = false;
430
431   if (!n_initialized)
432     bitmap_obstack_release (&operands_bitmap_obstack);
433   if (dump_file && (dump_flags & TDF_STATS))
434     {
435       fprintf (dump_file, "Original clobbered vars:           %d\n",
436                clobber_stats.clobbered_vars);
437       fprintf (dump_file, "Static write clobbers avoided:     %d\n",
438                clobber_stats.static_write_clobbers_avoided);
439       fprintf (dump_file, "Static read clobbers avoided:      %d\n",
440                clobber_stats.static_read_clobbers_avoided);
441       fprintf (dump_file, "Unescapable clobbers avoided:      %d\n",
442                clobber_stats.unescapable_clobbers_avoided);
443       fprintf (dump_file, "Original read-only clobbers:       %d\n",
444                clobber_stats.readonly_clobbers);
445       fprintf (dump_file, "Static read-only clobbers avoided: %d\n",
446                clobber_stats.static_readonly_clobbers_avoided);
447     }
448 }
449
450
451 /* Return memory for operands of SIZE chunks.  */
452                                                                               
453 static inline void *
454 ssa_operand_alloc (unsigned size)
455 {
456   char *ptr;
457
458   if (gimple_ssa_operands (cfun)->operand_memory_index + size
459       >= gimple_ssa_operands (cfun)->ssa_operand_mem_size)
460     {
461       struct ssa_operand_memory_d *ptr;
462
463       if (gimple_ssa_operands (cfun)->ssa_operand_mem_size == OP_SIZE_INIT)
464         gimple_ssa_operands (cfun)->ssa_operand_mem_size
465            = OP_SIZE_1 * sizeof (struct voptype_d);
466       else
467         if (gimple_ssa_operands (cfun)->ssa_operand_mem_size
468             == OP_SIZE_1 * sizeof (struct voptype_d))
469           gimple_ssa_operands (cfun)->ssa_operand_mem_size
470              = OP_SIZE_2 * sizeof (struct voptype_d);
471         else
472           gimple_ssa_operands (cfun)->ssa_operand_mem_size
473              = OP_SIZE_3 * sizeof (struct voptype_d);
474
475       /* Go right to the maximum size if the request is too large.  */
476       if (size > gimple_ssa_operands (cfun)->ssa_operand_mem_size)
477         gimple_ssa_operands (cfun)->ssa_operand_mem_size
478           = OP_SIZE_3 * sizeof (struct voptype_d);
479
480       /* We can reliably trigger the case that we need arbitrary many
481          operands (see PR34093), so allocate a buffer just for this request.  */
482       if (size > gimple_ssa_operands (cfun)->ssa_operand_mem_size)
483         gimple_ssa_operands (cfun)->ssa_operand_mem_size = size;
484
485       ptr = (struct ssa_operand_memory_d *) 
486               ggc_alloc (sizeof (struct ssa_operand_memory_d) 
487                          + gimple_ssa_operands (cfun)->ssa_operand_mem_size - 1);
488       ptr->next = gimple_ssa_operands (cfun)->operand_memory;
489       gimple_ssa_operands (cfun)->operand_memory = ptr;
490       gimple_ssa_operands (cfun)->operand_memory_index = 0;
491     }
492   ptr = &(gimple_ssa_operands (cfun)->operand_memory
493           ->mem[gimple_ssa_operands (cfun)->operand_memory_index]);
494   gimple_ssa_operands (cfun)->operand_memory_index += size;
495   return ptr;
496 }
497
498
499 /* Allocate a DEF operand.  */
500
501 static inline struct def_optype_d *
502 alloc_def (void)
503 {
504   struct def_optype_d *ret;
505   if (gimple_ssa_operands (cfun)->free_defs)
506     {
507       ret = gimple_ssa_operands (cfun)->free_defs;
508       gimple_ssa_operands (cfun)->free_defs
509         = gimple_ssa_operands (cfun)->free_defs->next;
510     }
511   else
512     ret = (struct def_optype_d *)
513           ssa_operand_alloc (sizeof (struct def_optype_d));
514   return ret;
515 }
516
517
518 /* Allocate a USE operand.  */
519
520 static inline struct use_optype_d *
521 alloc_use (void)
522 {
523   struct use_optype_d *ret;
524   if (gimple_ssa_operands (cfun)->free_uses)
525     {
526       ret = gimple_ssa_operands (cfun)->free_uses;
527       gimple_ssa_operands (cfun)->free_uses
528         = gimple_ssa_operands (cfun)->free_uses->next;
529     }
530   else
531     ret = (struct use_optype_d *)
532           ssa_operand_alloc (sizeof (struct use_optype_d));
533   return ret;
534 }
535
536
537 /* Allocate a vop with NUM elements.  */
538
539 static inline struct voptype_d *
540 alloc_vop (int num)
541 {
542   struct voptype_d *ret = NULL;
543   int alloc_size = 0;
544
545   int bucket = vop_free_bucket_index (num);
546   if (bucket != -1)
547     {
548       /* If there is a free operand, use it.  */
549       if (gimple_ssa_operands (cfun)->vop_free_buckets[bucket] != NULL)
550         {
551           ret = gimple_ssa_operands (cfun)->vop_free_buckets[bucket];
552           gimple_ssa_operands (cfun)->vop_free_buckets[bucket] = 
553                   gimple_ssa_operands (cfun)->vop_free_buckets[bucket]->next;
554         }
555       else
556         alloc_size = vop_free_bucket_size(bucket);
557     }
558   else
559     alloc_size = num;
560
561   if (alloc_size > 0)
562     ret = (struct voptype_d *)ssa_operand_alloc (
563         sizeof (struct voptype_d) + (alloc_size - 1) * sizeof (vuse_element_t));
564
565   VUSE_VECT_NUM_ELEM (ret->usev) = num;
566   return ret;
567 }
568
569
570 /* This routine makes sure that PTR is in an immediate use list, and makes
571    sure the stmt pointer is set to the current stmt.  */
572
573 static inline void
574 set_virtual_use_link (use_operand_p ptr, tree stmt)
575 {
576   /*  fold_stmt may have changed the stmt pointers.  */
577   if (ptr->stmt != stmt)
578     ptr->stmt = stmt;
579
580   /* If this use isn't in a list, add it to the correct list.  */
581   if (!ptr->prev)
582     link_imm_use (ptr, *(ptr->use));
583 }
584
585
586 /* Adds OP to the list of defs after LAST.  */
587
588 static inline def_optype_p 
589 add_def_op (tree *op, def_optype_p last)
590 {
591   def_optype_p new_def;
592
593   new_def = alloc_def ();
594   DEF_OP_PTR (new_def) = op;
595   last->next = new_def;
596   new_def->next = NULL;
597   return new_def;
598 }
599
600
601 /* Adds OP to the list of uses of statement STMT after LAST.  */
602
603 static inline use_optype_p
604 add_use_op (tree stmt, tree *op, use_optype_p last)
605 {
606   use_optype_p new_use;
607
608   new_use = alloc_use ();
609   USE_OP_PTR (new_use)->use = op;
610   link_imm_use_stmt (USE_OP_PTR (new_use), *op, stmt);
611   last->next = new_use;
612   new_use->next = NULL;
613   return new_use;
614 }
615
616
617 /* Return a virtual op pointer with NUM elements which are all
618    initialized to OP and are linked into the immediate uses for STMT.
619    The new vop is appended after PREV.  */
620
621 static inline voptype_p
622 add_vop (tree stmt, tree op, int num, voptype_p prev)
623 {
624   voptype_p new_vop;
625   int x;
626
627   new_vop = alloc_vop (num);
628   for (x = 0; x < num; x++)
629     {
630       VUSE_OP_PTR (new_vop, x)->prev = NULL;
631       SET_VUSE_OP (new_vop, x, op);
632       VUSE_OP_PTR (new_vop, x)->use = &new_vop->usev.uses[x].use_var;
633       link_imm_use_stmt (VUSE_OP_PTR (new_vop, x),
634                          new_vop->usev.uses[x].use_var, stmt);
635     }
636
637   if (prev)
638     prev->next = new_vop;
639   new_vop->next = NULL;
640   return new_vop;
641 }
642
643
644 /* Adds OP to the list of vuses of statement STMT after LAST, and moves
645    LAST to the new element.  */
646
647 static inline voptype_p
648 add_vuse_op (tree stmt, tree op, int num, voptype_p last)
649 {
650   voptype_p new_vop = add_vop (stmt, op, num, last);
651   VDEF_RESULT (new_vop) = NULL_TREE;
652   return new_vop;
653 }
654
655
656 /* Adds OP to the list of vdefs of statement STMT after LAST, and moves
657    LAST to the new element.  */
658
659 static inline voptype_p
660 add_vdef_op (tree stmt, tree op, int num, voptype_p last)
661 {
662   voptype_p new_vop = add_vop (stmt, op, num, last);
663   VDEF_RESULT (new_vop) = op;
664   return new_vop;
665 }
666   
667
668 /* Takes elements from build_defs and turns them into def operands of STMT.
669    TODO -- Make build_defs VEC of tree *.  */
670
671 static inline void
672 finalize_ssa_defs (tree stmt)
673 {
674   unsigned new_i;
675   struct def_optype_d new_list;
676   def_optype_p old_ops, last;
677   unsigned int num = VEC_length (tree, build_defs);
678
679   /* There should only be a single real definition per assignment.  */
680   gcc_assert ((stmt && TREE_CODE (stmt) != GIMPLE_MODIFY_STMT) || num <= 1);
681
682   new_list.next = NULL;
683   last = &new_list;
684
685   old_ops = DEF_OPS (stmt);
686
687   new_i = 0;
688
689   /* Check for the common case of 1 def that hasn't changed.  */
690   if (old_ops && old_ops->next == NULL && num == 1
691       && (tree *) VEC_index (tree, build_defs, 0) == DEF_OP_PTR (old_ops))
692     return;
693
694   /* If there is anything in the old list, free it.  */
695   if (old_ops)
696     {
697       old_ops->next = gimple_ssa_operands (cfun)->free_defs;
698       gimple_ssa_operands (cfun)->free_defs = old_ops;
699     }
700
701   /* If there is anything remaining in the build_defs list, simply emit it.  */
702   for ( ; new_i < num; new_i++)
703     last = add_def_op ((tree *) VEC_index (tree, build_defs, new_i), last);
704
705   /* Now set the stmt's operands.  */
706   DEF_OPS (stmt) = new_list.next;
707
708 #ifdef ENABLE_CHECKING
709   {
710     def_optype_p ptr;
711     unsigned x = 0;
712     for (ptr = DEF_OPS (stmt); ptr; ptr = ptr->next)
713       x++;
714
715     gcc_assert (x == num);
716   }
717 #endif
718 }
719
720
721 /* Takes elements from build_uses and turns them into use operands of STMT.
722    TODO -- Make build_uses VEC of tree *.  */
723
724 static inline void
725 finalize_ssa_uses (tree stmt)
726 {
727   unsigned new_i;
728   struct use_optype_d new_list;
729   use_optype_p old_ops, ptr, last;
730
731 #ifdef ENABLE_CHECKING
732   {
733     unsigned x;
734     unsigned num = VEC_length (tree, build_uses);
735
736     /* If the pointer to the operand is the statement itself, something is
737        wrong.  It means that we are pointing to a local variable (the 
738        initial call to update_stmt_operands does not pass a pointer to a 
739        statement).  */
740     for (x = 0; x < num; x++)
741       gcc_assert (*((tree *)VEC_index (tree, build_uses, x)) != stmt);
742   }
743 #endif
744
745   new_list.next = NULL;
746   last = &new_list;
747
748   old_ops = USE_OPS (stmt);
749
750   /* If there is anything in the old list, free it.  */
751   if (old_ops)
752     {
753       for (ptr = old_ops; ptr; ptr = ptr->next)
754         delink_imm_use (USE_OP_PTR (ptr));
755       old_ops->next = gimple_ssa_operands (cfun)->free_uses;
756       gimple_ssa_operands (cfun)->free_uses = old_ops;
757     }
758
759   /* Now create nodes for all the new nodes.  */
760   for (new_i = 0; new_i < VEC_length (tree, build_uses); new_i++)
761     last = add_use_op (stmt, 
762                        (tree *) VEC_index (tree, build_uses, new_i), 
763                        last);
764
765   /* Now set the stmt's operands.  */
766   USE_OPS (stmt) = new_list.next;
767
768 #ifdef ENABLE_CHECKING
769   {
770     unsigned x = 0;
771     for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
772       x++;
773
774     gcc_assert (x == VEC_length (tree, build_uses));
775   }
776 #endif
777 }
778
779
780 /* Takes elements from BUILD_VDEFS and turns them into vdef operands of
781    STMT.  FIXME, for now VDEF operators should have a single operand
782    in their RHS.  */
783
784 static inline void
785 finalize_ssa_vdefs (tree stmt)
786 {
787   unsigned new_i;
788   struct voptype_d new_list;
789   voptype_p old_ops, ptr, last;
790   stmt_ann_t ann = stmt_ann (stmt);
791
792   /* Set the symbols referenced by STMT.  */
793   if (!bitmap_empty_p (build_stores))
794     {
795       if (ann->operands.stores == NULL)
796         ann->operands.stores = BITMAP_ALLOC (&operands_bitmap_obstack);
797
798       bitmap_copy (ann->operands.stores, build_stores);
799     }
800   else
801     BITMAP_FREE (ann->operands.stores);
802
803   /* If aliases have not been computed, do not instantiate a virtual
804      operator on STMT.  Initially, we only compute the SSA form on
805      GIMPLE registers.  The virtual SSA form is only computed after
806      alias analysis, so virtual operators will remain unrenamed and
807      the verifier will complain.  However, alias analysis needs to
808      access symbol load/store information, so we need to compute
809      those.  */
810   if (!gimple_aliases_computed_p (cfun))
811     return;
812
813   new_list.next = NULL;
814   last = &new_list;
815
816   old_ops = VDEF_OPS (stmt);
817   new_i = 0;
818   while (old_ops && new_i < VEC_length (tree, build_vdefs))
819     {
820       tree op = VEC_index (tree, build_vdefs, new_i);
821       unsigned new_uid = get_name_decl (op);
822       unsigned old_uid = get_name_decl (VDEF_RESULT (old_ops));
823
824       /* FIXME, for now each VDEF operator should have at most one
825          operand in their RHS.  */
826       gcc_assert (VDEF_NUM (old_ops) == 1);
827
828       if (old_uid == new_uid)
829         {
830           /* If the symbols are the same, reuse the existing operand.  */
831           last->next = old_ops;
832           last = old_ops;
833           old_ops = old_ops->next;
834           last->next = NULL;
835           set_virtual_use_link (VDEF_OP_PTR (last, 0), stmt);
836           new_i++;
837         }
838       else if (old_uid < new_uid)
839         {
840           /* If old is less than new, old goes to the free list.  */
841           voptype_p next;
842           delink_imm_use (VDEF_OP_PTR (old_ops, 0));
843           next = old_ops->next;
844           add_vop_to_freelist (old_ops);
845           old_ops = next;
846         }
847       else
848         {
849           /* This is a new operand.  */
850           last = add_vdef_op (stmt, op, 1, last);
851           new_i++;
852         }
853     }
854
855   /* If there is anything remaining in BUILD_VDEFS, simply emit it.  */
856   for ( ; new_i < VEC_length (tree, build_vdefs); new_i++)
857     last = add_vdef_op (stmt, VEC_index (tree, build_vdefs, new_i), 1, last);
858
859   /* If there is anything in the old list, free it.  */
860   if (old_ops)
861     {
862       for (ptr = old_ops; ptr; ptr = last)
863         {
864           last = ptr->next;
865           delink_imm_use (VDEF_OP_PTR (ptr, 0));
866           add_vop_to_freelist (ptr);
867         }
868     }
869
870   /* Now set STMT's operands.  */
871   VDEF_OPS (stmt) = new_list.next;
872
873 #ifdef ENABLE_CHECKING
874   {
875     unsigned x = 0;
876     for (ptr = VDEF_OPS (stmt); ptr; ptr = ptr->next)
877       x++;
878
879     gcc_assert (x == VEC_length (tree, build_vdefs));
880   }
881 #endif
882 }
883
884
885 /* Takes elements from BUILD_VUSES and turns them into VUSE operands of
886    STMT.  */
887
888 static inline void
889 finalize_ssa_vuse_ops (tree stmt)
890 {
891   unsigned new_i, old_i;
892   voptype_p old_ops, last;
893   VEC(tree,heap) *new_ops;
894   stmt_ann_t ann;
895
896   /* Set the symbols referenced by STMT.  */
897   ann = stmt_ann (stmt);
898   if (!bitmap_empty_p (build_loads))
899     {
900       if (ann->operands.loads == NULL)
901         ann->operands.loads = BITMAP_ALLOC (&operands_bitmap_obstack);
902
903       bitmap_copy (ann->operands.loads, build_loads);
904     }
905   else
906     BITMAP_FREE (ann->operands.loads);
907
908   /* If aliases have not been computed, do not instantiate a virtual
909      operator on STMT.  Initially, we only compute the SSA form on
910      GIMPLE registers.  The virtual SSA form is only computed after
911      alias analysis, so virtual operators will remain unrenamed and
912      the verifier will complain.  However, alias analysis needs to
913      access symbol load/store information, so we need to compute
914      those.  */
915   if (!gimple_aliases_computed_p (cfun))
916     return;
917
918   /* STMT should have at most one VUSE operator.  */
919   old_ops = VUSE_OPS (stmt);
920   gcc_assert (old_ops == NULL || old_ops->next == NULL);
921
922   new_ops = NULL;
923   new_i = old_i = 0;
924   while (old_ops
925          && old_i < VUSE_NUM (old_ops)
926          && new_i < VEC_length (tree, build_vuses))
927     {
928       tree new_op = VEC_index (tree, build_vuses, new_i);
929       tree old_op = VUSE_OP (old_ops, old_i);
930       unsigned new_uid = get_name_decl (new_op);
931       unsigned old_uid = get_name_decl (old_op);
932
933       if (old_uid == new_uid)
934         {
935           /* If the symbols are the same, reuse the existing operand.  */
936           VEC_safe_push (tree, heap, new_ops, old_op);
937           new_i++;
938           old_i++;
939         }
940       else if (old_uid < new_uid)
941         {
942           /* If OLD_UID is less than NEW_UID, the old operand has
943              disappeared, skip to the next old operand.  */
944           old_i++;
945         }
946       else
947         {
948           /* This is a new operand.  */
949           VEC_safe_push (tree, heap, new_ops, new_op);
950           new_i++;
951         }
952     }
953
954   /* If there is anything remaining in the build_vuses list, simply emit it.  */
955   for ( ; new_i < VEC_length (tree, build_vuses); new_i++)
956     VEC_safe_push (tree, heap, new_ops, VEC_index (tree, build_vuses, new_i));
957
958   /* If there is anything in the old list, free it.  */
959   if (old_ops)
960     {
961       for (old_i = 0; old_i < VUSE_NUM (old_ops); old_i++)
962         delink_imm_use (VUSE_OP_PTR (old_ops, old_i));
963       add_vop_to_freelist (old_ops);
964       VUSE_OPS (stmt) = NULL;
965     }
966
967   /* If there are any operands, instantiate a VUSE operator for STMT.  */
968   if (new_ops)
969     {
970       tree op;
971       unsigned i;
972
973       last = add_vuse_op (stmt, NULL, VEC_length (tree, new_ops), NULL);
974
975       for (i = 0; VEC_iterate (tree, new_ops, i, op); i++)
976         SET_USE (VUSE_OP_PTR (last, (int) i), op);
977
978       VUSE_OPS (stmt) = last;
979       VEC_free (tree, heap, new_ops);
980     }
981
982 #ifdef ENABLE_CHECKING
983   {
984     unsigned x;
985     
986     if (VUSE_OPS (stmt))
987       {
988         gcc_assert (VUSE_OPS (stmt)->next == NULL);
989         x = VUSE_NUM (VUSE_OPS (stmt));
990       }
991     else
992       x = 0;
993
994     gcc_assert (x == VEC_length (tree, build_vuses));
995   }
996 #endif
997 }
998
999 /* Return a new VUSE operand vector for STMT.  */
1000                                                                               
1001 static void
1002 finalize_ssa_vuses (tree stmt)
1003 {
1004   unsigned num, num_vdefs;
1005   unsigned vuse_index;
1006
1007   /* Remove superfluous VUSE operands.  If the statement already has a
1008      VDEF operator for a variable 'a', then a VUSE for 'a' is not
1009      needed because VDEFs imply a VUSE of the variable.  For instance,
1010      suppose that variable 'a' is pointed-to by p and q:
1011
1012               # VUSE <a_2>
1013               # a_3 = VDEF <a_2>
1014               *p = *q;
1015
1016      The VUSE <a_2> is superfluous because it is implied by the
1017      VDEF operator.  */
1018   num = VEC_length (tree, build_vuses);
1019   num_vdefs = VEC_length (tree, build_vdefs);
1020
1021   if (num > 0 && num_vdefs > 0)
1022     for (vuse_index = 0; vuse_index < VEC_length (tree, build_vuses); )
1023       {
1024         tree vuse;
1025         vuse = VEC_index (tree, build_vuses, vuse_index);
1026         if (TREE_CODE (vuse) != SSA_NAME)
1027           {
1028             var_ann_t ann = var_ann (vuse);
1029             ann->in_vuse_list = 0;
1030             if (ann->in_vdef_list)
1031               {
1032                 VEC_ordered_remove (tree, build_vuses, vuse_index);
1033                 continue;
1034               }
1035           }
1036         vuse_index++;
1037       }
1038
1039   finalize_ssa_vuse_ops (stmt);
1040 }
1041
1042
1043 /* Clear the in_list bits and empty the build array for VDEFs and
1044    VUSEs.  */
1045
1046 static inline void
1047 cleanup_build_arrays (void)
1048 {
1049   unsigned i;
1050   tree t;
1051
1052   for (i = 0; VEC_iterate (tree, build_vdefs, i, t); i++)
1053     if (TREE_CODE (t) != SSA_NAME)
1054       var_ann (t)->in_vdef_list = false;
1055
1056   for (i = 0; VEC_iterate (tree, build_vuses, i, t); i++)
1057     if (TREE_CODE (t) != SSA_NAME)
1058       var_ann (t)->in_vuse_list = false;
1059
1060   VEC_truncate (tree, build_vdefs, 0);
1061   VEC_truncate (tree, build_vuses, 0);
1062   VEC_truncate (tree, build_defs, 0);
1063   VEC_truncate (tree, build_uses, 0);
1064   bitmap_clear (build_loads);
1065   bitmap_clear (build_stores);
1066 }
1067
1068
1069 /* Finalize all the build vectors, fill the new ones into INFO.  */
1070                                                                               
1071 static inline void
1072 finalize_ssa_stmt_operands (tree stmt)
1073 {
1074   finalize_ssa_defs (stmt);
1075   finalize_ssa_uses (stmt);
1076   finalize_ssa_vdefs (stmt);
1077   finalize_ssa_vuses (stmt);
1078   cleanup_build_arrays ();
1079 }
1080
1081
1082 /* Start the process of building up operands vectors in INFO.  */
1083
1084 static inline void
1085 start_ssa_stmt_operands (void)
1086 {
1087   gcc_assert (VEC_length (tree, build_defs) == 0);
1088   gcc_assert (VEC_length (tree, build_uses) == 0);
1089   gcc_assert (VEC_length (tree, build_vuses) == 0);
1090   gcc_assert (VEC_length (tree, build_vdefs) == 0);
1091   gcc_assert (bitmap_empty_p (build_loads));
1092   gcc_assert (bitmap_empty_p (build_stores));
1093 }
1094
1095
1096 /* Add DEF_P to the list of pointers to operands.  */
1097
1098 static inline void
1099 append_def (tree *def_p)
1100 {
1101   VEC_safe_push (tree, heap, build_defs, (tree) def_p);
1102 }
1103
1104
1105 /* Add USE_P to the list of pointers to operands.  */
1106
1107 static inline void
1108 append_use (tree *use_p)
1109 {
1110   VEC_safe_push (tree, heap, build_uses, (tree) use_p);
1111 }
1112
1113
1114 /* Add VAR to the set of variables that require a VDEF operator.  */
1115
1116 static inline void
1117 append_vdef (tree var)
1118 {
1119   tree sym;
1120
1121   if (TREE_CODE (var) != SSA_NAME)
1122     {
1123       tree mpt;
1124       var_ann_t ann;
1125
1126       /* If VAR belongs to a memory partition, use it instead of VAR.  */
1127       mpt = memory_partition (var);
1128       if (mpt)
1129         var = mpt;
1130
1131       /* Don't allow duplicate entries.  */
1132       ann = get_var_ann (var);
1133       if (ann->in_vdef_list)
1134         return;
1135
1136       ann->in_vdef_list = true;
1137       sym = var;
1138     }
1139   else
1140     sym = SSA_NAME_VAR (var);
1141
1142   VEC_safe_push (tree, heap, build_vdefs, var);
1143   bitmap_set_bit (build_stores, DECL_UID (sym));
1144 }
1145
1146
1147 /* Add VAR to the set of variables that require a VUSE operator.  */
1148
1149 static inline void
1150 append_vuse (tree var)
1151 {
1152   tree sym;
1153
1154   if (TREE_CODE (var) != SSA_NAME)
1155     {
1156       tree mpt;
1157       var_ann_t ann;
1158
1159       /* If VAR belongs to a memory partition, use it instead of VAR.  */
1160       mpt = memory_partition (var);
1161       if (mpt)
1162         var = mpt;
1163
1164       /* Don't allow duplicate entries.  */
1165       ann = get_var_ann (var);
1166       if (ann->in_vuse_list)
1167         return;
1168       else if (ann->in_vdef_list)
1169        {
1170          /* We don't want a vuse if we already have a vdef, but we must
1171             still put this in build_loads.  */
1172          bitmap_set_bit (build_loads, DECL_UID (var));
1173          return;
1174        }
1175
1176       ann->in_vuse_list = true;
1177       sym = var;
1178     }
1179   else
1180     sym = SSA_NAME_VAR (var);
1181
1182   VEC_safe_push (tree, heap, build_vuses, var);
1183   bitmap_set_bit (build_loads, DECL_UID (sym));
1184 }
1185
1186
1187 /* REF is a tree that contains the entire pointer dereference
1188    expression, if available, or NULL otherwise.  ALIAS is the variable
1189    we are asking if REF can access.  OFFSET and SIZE come from the
1190    memory access expression that generated this virtual operand.
1191
1192    XXX: We should handle the NO_ALIAS attributes here.  */
1193
1194 static bool
1195 access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
1196                            HOST_WIDE_INT size)
1197 {
1198   bool offsetgtz = offset > 0;
1199   unsigned HOST_WIDE_INT uoffset = (unsigned HOST_WIDE_INT) offset;
1200   tree base = ref ? get_base_address (ref) : NULL;
1201
1202   /* If ALIAS is .GLOBAL_VAR then the memory reference REF must be
1203      using a call-clobbered memory tag.  By definition, call-clobbered
1204      memory tags can always touch .GLOBAL_VAR.  */
1205   if (alias == gimple_global_var (cfun))
1206     return true;
1207
1208   /* If ref is a TARGET_MEM_REF, just return true, as we can't really
1209      disambiguate them right now.  */
1210   if (ref && TREE_CODE (ref) == TARGET_MEM_REF)
1211     return true;
1212   
1213   /* Without strict aliasing, it is impossible for a component access
1214      through a pointer to touch a random variable, unless that
1215      variable *is* a structure or a pointer.
1216
1217      That is, given p->c, and some random global variable b,
1218      there is no legal way that p->c could be an access to b.
1219      
1220      Without strict aliasing on, we consider it legal to do something
1221      like:
1222
1223      struct foos { int l; };
1224      int foo;
1225      static struct foos *getfoo(void);
1226      int main (void)
1227      {
1228        struct foos *f = getfoo();
1229        f->l = 1;
1230        foo = 2;
1231        if (f->l == 1)
1232          abort();
1233        exit(0);
1234      }
1235      static struct foos *getfoo(void)     
1236      { return (struct foos *)&foo; }
1237      
1238      (taken from 20000623-1.c)
1239
1240      The docs also say/imply that access through union pointers
1241      is legal (but *not* if you take the address of the union member,
1242      i.e. the inverse), such that you can do
1243
1244      typedef union {
1245        int d;
1246      } U;
1247
1248      int rv;
1249      void breakme()
1250      {
1251        U *rv0;
1252        U *pretmp = (U*)&rv;
1253        rv0 = pretmp;
1254        rv0->d = 42;    
1255      }
1256      To implement this, we just punt on accesses through union
1257      pointers entirely.
1258
1259      Another case we have to allow is accessing a variable
1260      through an array access at offset zero.  This happens from
1261      code generated by the fortran frontend like
1262
1263      char[1:1] & my_char_ref;
1264      char my_char;
1265      my_char_ref_1 = (char[1:1] &) &my_char;
1266      D.874_2 = (*my_char_ref_1)[1]{lb: 1 sz: 1};
1267   */
1268   if (ref 
1269            && flag_strict_aliasing
1270            && TREE_CODE (ref) != INDIRECT_REF
1271            && !MTAG_P (alias)
1272            && base
1273            && (TREE_CODE (base) != INDIRECT_REF
1274                || TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
1275            && (TREE_CODE (base) != INDIRECT_REF
1276                || TREE_CODE (ref) != ARRAY_REF
1277                || offset != 0
1278                || (DECL_SIZE (alias)
1279                    && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
1280                    && size != -1
1281                    && (unsigned HOST_WIDE_INT)size
1282                       != TREE_INT_CST_LOW (DECL_SIZE (alias))))
1283            && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
1284            && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
1285            && !var_ann (alias)->is_heapvar
1286            /* When the struct has may_alias attached to it, we need not to
1287               return true.  */
1288            && get_alias_set (base))
1289     {
1290 #ifdef ACCESS_DEBUGGING
1291       fprintf (stderr, "Access to ");
1292       print_generic_expr (stderr, ref, 0);
1293       fprintf (stderr, " may not touch ");
1294       print_generic_expr (stderr, alias, 0);
1295       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1296 #endif
1297       return false;
1298     }
1299
1300   /* If the offset of the access is greater than the size of one of
1301      the possible aliases, it can't be touching that alias, because it
1302      would be past the end of the structure.  */
1303   else if (ref
1304            && flag_strict_aliasing
1305            && TREE_CODE (ref) != INDIRECT_REF
1306            && !MTAG_P (alias)
1307            && !POINTER_TYPE_P (TREE_TYPE (alias))
1308            && offsetgtz
1309            && DECL_SIZE (alias)
1310            && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
1311            && uoffset > TREE_INT_CST_LOW (DECL_SIZE (alias)))
1312     {
1313 #ifdef ACCESS_DEBUGGING
1314       fprintf (stderr, "Access to ");
1315       print_generic_expr (stderr, ref, 0);
1316       fprintf (stderr, " may not touch ");
1317       print_generic_expr (stderr, alias, 0);
1318       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1319 #endif
1320       return false;
1321     }      
1322
1323   return true;
1324 }
1325
1326 /* Add VAR to the virtual operands array.  FLAGS is as in
1327    get_expr_operands.  FULL_REF is a tree that contains the entire
1328    pointer dereference expression, if available, or NULL otherwise.
1329    OFFSET and SIZE come from the memory access expression that
1330    generated this virtual operand.  IS_CALL_SITE is true if the
1331    affected statement is a call site.  */
1332
1333 static void
1334 add_virtual_operand (tree var, stmt_ann_t s_ann, int flags,
1335                      tree full_ref, HOST_WIDE_INT offset,
1336                      HOST_WIDE_INT size, bool is_call_site)
1337 {
1338   bitmap aliases = NULL;
1339   tree sym;
1340   var_ann_t v_ann;
1341   
1342   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1343   v_ann = var_ann (sym);
1344   
1345   /* Mark the statement as having memory operands.  */
1346   s_ann->references_memory = true;
1347
1348   /* If the variable cannot be modified and this is a VDEF change
1349      it into a VUSE.  This happens when read-only variables are marked
1350      call-clobbered and/or aliased to writable variables.  So we only
1351      check that this only happens on non-specific stores.
1352
1353      Note that if this is a specific store, i.e. associated with a
1354      GIMPLE_MODIFY_STMT, then we can't suppress the VDEF, lest we run
1355      into validation problems.
1356
1357      This can happen when programs cast away const, leaving us with a
1358      store to read-only memory.  If the statement is actually executed
1359      at runtime, then the program is ill formed.  If the statement is
1360      not executed then all is well.  At the very least, we cannot ICE.  */
1361   if ((flags & opf_implicit) && unmodifiable_var_p (var))
1362     flags &= ~opf_def;
1363   
1364   /* The variable is not a GIMPLE register.  Add it (or its aliases) to
1365      virtual operands, unless the caller has specifically requested
1366      not to add virtual operands (used when adding operands inside an
1367      ADDR_EXPR expression).  */
1368   if (flags & opf_no_vops)
1369     return;
1370   
1371   if (MTAG_P (var))
1372     aliases = MTAG_ALIASES (var);
1373
1374   if (aliases == NULL)
1375     {
1376       if (!gimple_aliases_computed_p (cfun)
1377           && (flags & opf_def))
1378         s_ann->has_volatile_ops = true;
1379
1380       /* The variable is not aliased or it is an alias tag.  */
1381       if (flags & opf_def)
1382         append_vdef (var);
1383       else
1384         append_vuse (var);
1385     }
1386   else
1387     {
1388       bitmap_iterator bi;
1389       unsigned int i;
1390       bool none_added = true;
1391       
1392       /* The variable is aliased.  Add its aliases to the virtual
1393          operands.  */
1394       gcc_assert (!bitmap_empty_p (aliases));
1395
1396       EXECUTE_IF_SET_IN_BITMAP (aliases, 0, i, bi)
1397         {
1398           tree al = referenced_var (i);
1399
1400           /* Call-clobbered tags may have non-call-clobbered
1401              symbols in their alias sets.  Ignore them if we are
1402              adding VOPs for a call site.  */
1403           if (is_call_site && !is_call_clobbered (al))
1404             continue;
1405
1406           /* If we do not know the full reference tree or if the access is
1407              unspecified [0, -1], we cannot prune it.  Otherwise try doing
1408              so using access_can_touch_variable.  */
1409           if (full_ref
1410               && !access_can_touch_variable (full_ref, al, offset, size))
1411             continue;
1412
1413           if (flags & opf_def)
1414             append_vdef (al);
1415           else
1416             append_vuse (al);
1417           none_added = false;
1418         }
1419
1420       if (flags & opf_def)
1421         {
1422           /* If the variable is also an alias tag, add a virtual
1423              operand for it, otherwise we will miss representing
1424              references to the members of the variable's alias set.          
1425              This fixes the bug in gcc.c-torture/execute/20020503-1.c.
1426              
1427              It is also necessary to add bare defs on clobbers for
1428              SMT's, so that bare SMT uses caused by pruning all the
1429              aliases will link up properly with calls.   In order to
1430              keep the number of these bare defs we add down to the
1431              minimum necessary, we keep track of which SMT's were used
1432              alone in statement vdefs or VUSEs.  */
1433           if (none_added
1434               || (TREE_CODE (var) == SYMBOL_MEMORY_TAG
1435                   && is_call_site))
1436             append_vdef (var);
1437         }
1438       else
1439         {
1440           /* Even if no aliases have been added, we still need to
1441              establish def-use and use-def chains, lest
1442              transformations think that this is not a memory
1443              reference.  For an example of this scenario, see
1444              testsuite/g++.dg/opt/cleanup1.C.  */
1445           if (none_added)
1446             append_vuse (var);
1447         }
1448     }
1449 }
1450
1451
1452 /* Add *VAR_P to the appropriate operand array for S_ANN.  FLAGS is as in
1453    get_expr_operands.  If *VAR_P is a GIMPLE register, it will be added to
1454    the statement's real operands, otherwise it is added to virtual
1455    operands.  */
1456
1457 static void
1458 add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
1459 {
1460   tree var, sym;
1461   var_ann_t v_ann;
1462
1463   gcc_assert (SSA_VAR_P (*var_p) && s_ann);
1464
1465   var = *var_p;
1466   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1467   v_ann = var_ann (sym);
1468
1469   /* Mark statements with volatile operands.  */
1470   if (TREE_THIS_VOLATILE (sym))
1471     s_ann->has_volatile_ops = true;
1472
1473   if (is_gimple_reg (sym))
1474     {
1475       /* The variable is a GIMPLE register.  Add it to real operands.  */
1476       if (flags & opf_def)
1477         append_def (var_p);
1478       else
1479         append_use (var_p);
1480     }
1481   else
1482     add_virtual_operand (var, s_ann, flags, NULL_TREE, 0, -1, false);
1483 }
1484
1485 /* Subroutine of get_indirect_ref_operands.  ADDR is the address
1486    that is dereferenced, the meaning of the rest of the arguments
1487    is the same as in get_indirect_ref_operands.  */
1488
1489 static void
1490 get_addr_dereference_operands (tree stmt, tree *addr, int flags, tree full_ref,
1491                                HOST_WIDE_INT offset, HOST_WIDE_INT size,
1492                                bool recurse_on_base)
1493 {
1494   tree ptr = *addr;
1495   stmt_ann_t s_ann = stmt_ann (stmt);
1496
1497   s_ann->references_memory = true;
1498
1499   if (SSA_VAR_P (ptr))
1500     {
1501       struct ptr_info_def *pi = NULL;
1502
1503       /* If PTR has flow-sensitive points-to information, use it.  */
1504       if (TREE_CODE (ptr) == SSA_NAME
1505           && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
1506           && pi->name_mem_tag)
1507         {
1508           /* PTR has its own memory tag.  Use it.  */
1509           add_virtual_operand (pi->name_mem_tag, s_ann, flags,
1510                                full_ref, offset, size, false);
1511         }
1512       else
1513         {
1514           /* If PTR is not an SSA_NAME or it doesn't have a name
1515              tag, use its symbol memory tag.  */
1516           var_ann_t v_ann;
1517
1518           /* If we are emitting debugging dumps, display a warning if
1519              PTR is an SSA_NAME with no flow-sensitive alias
1520              information.  That means that we may need to compute
1521              aliasing again or that a propagation pass forgot to
1522              update the alias information on the pointers.  */
1523           if (dump_file
1524               && TREE_CODE (ptr) == SSA_NAME
1525               && (pi == NULL
1526                   || (pi->name_mem_tag == NULL_TREE
1527                       && !pi->pt_anything)))
1528             {
1529               fprintf (dump_file,
1530                   "NOTE: no flow-sensitive alias info for ");
1531               print_generic_expr (dump_file, ptr, dump_flags);
1532               fprintf (dump_file, " in ");
1533               print_generic_stmt (dump_file, stmt, 0);
1534             }
1535
1536           if (TREE_CODE (ptr) == SSA_NAME)
1537             ptr = SSA_NAME_VAR (ptr);
1538           v_ann = var_ann (ptr);
1539
1540           /* If we don't know what this pointer points to then we have
1541              to make sure to not prune virtual operands based on offset
1542              and size.  */
1543           if (v_ann->symbol_mem_tag)
1544             {
1545               add_virtual_operand (v_ann->symbol_mem_tag, s_ann, flags,
1546                                    full_ref, 0, -1, false);
1547               /* Make sure we add the SMT itself.  */
1548               if (!(flags & opf_no_vops))
1549                 {
1550                   if (flags & opf_def)
1551                     append_vdef (v_ann->symbol_mem_tag);
1552                   else
1553                     append_vuse (v_ann->symbol_mem_tag);
1554                 }
1555             }
1556
1557           /* Aliasing information is missing; mark statement as
1558              volatile so we won't optimize it out too actively.  */
1559           else if (!gimple_aliases_computed_p (cfun)
1560                    && (flags & opf_def))
1561             s_ann->has_volatile_ops = true;
1562         }
1563     }
1564   else if (TREE_CODE (ptr) == INTEGER_CST)
1565     {
1566       /* If a constant is used as a pointer, we can't generate a real
1567          operand for it but we mark the statement volatile to prevent
1568          optimizations from messing things up.  */
1569       s_ann->has_volatile_ops = true;
1570       return;
1571     }
1572   else
1573     {
1574       /* Ok, this isn't even is_gimple_min_invariant.  Something's broke.  */
1575       gcc_unreachable ();
1576     }
1577
1578   /* If requested, add a USE operand for the base pointer.  */
1579   if (recurse_on_base)
1580     get_expr_operands (stmt, addr, opf_use);
1581 }
1582
1583
1584 /* A subroutine of get_expr_operands to handle INDIRECT_REF,
1585    ALIGN_INDIRECT_REF and MISALIGNED_INDIRECT_REF.  
1586
1587    STMT is the statement being processed, EXPR is the INDIRECT_REF
1588       that got us here.
1589    
1590    FLAGS is as in get_expr_operands.
1591
1592    FULL_REF contains the full pointer dereference expression, if we
1593       have it, or NULL otherwise.
1594
1595    OFFSET and SIZE are the location of the access inside the
1596       dereferenced pointer, if known.
1597
1598    RECURSE_ON_BASE should be set to true if we want to continue
1599       calling get_expr_operands on the base pointer, and false if
1600       something else will do it for us.  */
1601
1602 static void
1603 get_indirect_ref_operands (tree stmt, tree expr, int flags, tree full_ref,
1604                            HOST_WIDE_INT offset, HOST_WIDE_INT size,
1605                            bool recurse_on_base)
1606 {
1607   tree *pptr = &TREE_OPERAND (expr, 0);
1608   stmt_ann_t s_ann = stmt_ann (stmt);
1609
1610   if (TREE_THIS_VOLATILE (expr))
1611     s_ann->has_volatile_ops = true; 
1612
1613   get_addr_dereference_operands (stmt, pptr, flags, full_ref, offset, size,
1614                                  recurse_on_base);
1615 }
1616
1617
1618 /* A subroutine of get_expr_operands to handle TARGET_MEM_REF.  */
1619
1620 static void
1621 get_tmr_operands (tree stmt, tree expr, int flags)
1622 {
1623   tree tag;
1624   stmt_ann_t s_ann = stmt_ann (stmt);
1625
1626   /* This statement references memory.  */
1627   s_ann->references_memory = 1;
1628
1629   /* First record the real operands.  */
1630   get_expr_operands (stmt, &TMR_BASE (expr), opf_use);
1631   get_expr_operands (stmt, &TMR_INDEX (expr), opf_use);
1632
1633   if (TMR_SYMBOL (expr))
1634     add_to_addressable_set (TMR_SYMBOL (expr), &s_ann->addresses_taken);
1635
1636   tag = TMR_TAG (expr);
1637   if (!tag)
1638     {
1639       /* Something weird, so ensure that we will be careful.  */
1640       s_ann->has_volatile_ops = true;
1641       return;
1642     }
1643   if (!MTAG_P (tag))
1644     {
1645       get_expr_operands (stmt, &tag, flags);
1646       return;
1647     }
1648
1649   add_virtual_operand (tag, s_ann, flags, expr, 0, -1, false);
1650 }
1651
1652
1653 /* Add clobbering definitions for .GLOBAL_VAR or for each of the call
1654    clobbered variables in the function.  */
1655
1656 static void
1657 add_call_clobber_ops (tree stmt, tree callee)
1658 {
1659   unsigned u;
1660   bitmap_iterator bi;
1661   stmt_ann_t s_ann = stmt_ann (stmt);
1662   bitmap not_read_b, not_written_b;
1663   tree call = get_call_expr_in (stmt);
1664
1665   gcc_assert (!(call_expr_flags (call) & (ECF_PURE | ECF_CONST)));
1666
1667   /* If we created .GLOBAL_VAR earlier, just use it.  */
1668   if (gimple_global_var (cfun))
1669     {
1670       tree var = gimple_global_var (cfun);
1671       add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1, true);
1672       return;
1673     }
1674
1675   /* Get info for local and module level statics.  There is a bit
1676      set for each static if the call being processed does not read
1677      or write that variable.  */
1678   not_read_b = callee ? ipa_reference_get_not_read_global (callee) : NULL; 
1679   not_written_b = callee ? ipa_reference_get_not_written_global (callee) : NULL; 
1680   /* Add a VDEF operand for every call clobbered variable.  */
1681   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, u, bi)
1682     {
1683       tree var = referenced_var_lookup (u);
1684       tree real_var = var;
1685       bool not_read;
1686       bool not_written;
1687
1688       not_read = not_read_b
1689                  ? bitmap_bit_p (not_read_b, DECL_UID (real_var))
1690                  : false;
1691
1692       not_written = not_written_b
1693                     ? bitmap_bit_p (not_written_b, DECL_UID (real_var))
1694                     : false;
1695       gcc_assert (!unmodifiable_var_p (var));
1696       
1697       clobber_stats.clobbered_vars++;
1698
1699       /* See if this variable is really clobbered by this function.  */
1700
1701       if (not_written)
1702         {
1703           clobber_stats.static_write_clobbers_avoided++;
1704           if (!not_read)
1705             add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1706           else
1707             clobber_stats.static_read_clobbers_avoided++;
1708         }
1709       else
1710         add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1, true);
1711     }
1712 }
1713
1714
1715 /* Add VUSE operands for .GLOBAL_VAR or all call clobbered variables in the
1716    function.  */
1717
1718 static void
1719 add_call_read_ops (tree stmt, tree callee)
1720 {
1721   unsigned u;
1722   bitmap_iterator bi;
1723   stmt_ann_t s_ann = stmt_ann (stmt);
1724   bitmap not_read_b;
1725   tree call = get_call_expr_in (stmt);
1726
1727   /* Const functions do not reference memory.  */
1728   if (call_expr_flags (call) & ECF_CONST)
1729     return;
1730
1731   not_read_b = callee ? ipa_reference_get_not_read_global (callee) : NULL;
1732
1733   /* For pure functions we compute non-escaped uses separately.  */
1734   if (call_expr_flags (call) & ECF_PURE)
1735     EXECUTE_IF_SET_IN_BITMAP (gimple_call_used_vars (cfun), 0, u, bi)
1736       {
1737         tree var = referenced_var_lookup (u);
1738         tree real_var = var;
1739         bool not_read;
1740
1741         if (unmodifiable_var_p (var))
1742           continue;
1743
1744         not_read = not_read_b
1745             ? bitmap_bit_p (not_read_b, DECL_UID (real_var))
1746             : false;
1747
1748         clobber_stats.readonly_clobbers++;
1749
1750         /* See if this variable is really used by this function.  */
1751         if (!not_read)
1752           add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1753         else
1754           clobber_stats.static_readonly_clobbers_avoided++;
1755       }
1756
1757   /* Add a VUSE for .GLOBAL_VAR if it has been created.  See
1758      add_referenced_var for the heuristic used to decide whether to
1759      create .GLOBAL_VAR.  */
1760   if (gimple_global_var (cfun))
1761     {
1762       tree var = gimple_global_var (cfun);
1763       add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1764       return;
1765     }
1766
1767   /* Add a VUSE for each call-clobbered variable.  */
1768   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, u, bi)
1769     {
1770       tree var = referenced_var (u);
1771       tree real_var = var;
1772       bool not_read;
1773       
1774       clobber_stats.readonly_clobbers++;
1775
1776       not_read = not_read_b ? bitmap_bit_p (not_read_b, DECL_UID (real_var))
1777                             : false;
1778       
1779       if (not_read)
1780         {
1781           clobber_stats.static_readonly_clobbers_avoided++;
1782           continue;
1783         }
1784             
1785       add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1786     }
1787 }
1788
1789
1790 /* A subroutine of get_expr_operands to handle CALL_EXPR.  */
1791
1792 static void
1793 get_call_expr_operands (tree stmt, tree expr)
1794 {
1795   int call_flags = call_expr_flags (expr);
1796   int i, nargs;
1797   stmt_ann_t ann = stmt_ann (stmt);
1798
1799   ann->references_memory = true;
1800
1801   /* If aliases have been computed already, add VDEF or VUSE
1802      operands for all the symbols that have been found to be
1803      call-clobbered.  */
1804   if (gimple_aliases_computed_p (cfun)
1805       && !(call_flags & ECF_NOVOPS))
1806     {
1807       /* A 'pure' or a 'const' function never call-clobbers anything. 
1808          A 'noreturn' function might, but since we don't return anyway 
1809          there is no point in recording that.  */ 
1810       if (TREE_SIDE_EFFECTS (expr)
1811           && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
1812         add_call_clobber_ops (stmt, get_callee_fndecl (expr));
1813       else if (!(call_flags & ECF_CONST))
1814         add_call_read_ops (stmt, get_callee_fndecl (expr));
1815     }
1816
1817   /* Find uses in the called function.  */
1818   get_expr_operands (stmt, &CALL_EXPR_FN (expr), opf_use);
1819   nargs = call_expr_nargs (expr);
1820   for (i = 0; i < nargs; i++)
1821     get_expr_operands (stmt, &CALL_EXPR_ARG (expr, i), opf_use);
1822
1823   get_expr_operands (stmt, &CALL_EXPR_STATIC_CHAIN (expr), opf_use);
1824 }
1825
1826
1827 /* Scan operands in the ASM_EXPR stmt referred to in INFO.  */
1828
1829 static void
1830 get_asm_expr_operands (tree stmt)
1831 {
1832   stmt_ann_t s_ann;
1833   int i, noutputs;
1834   const char **oconstraints;
1835   const char *constraint;
1836   bool allows_mem, allows_reg, is_inout;
1837   tree link;
1838
1839   s_ann = stmt_ann (stmt);
1840   noutputs = list_length (ASM_OUTPUTS (stmt));
1841   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
1842
1843   /* Gather all output operands.  */
1844   for (i = 0, link = ASM_OUTPUTS (stmt); link; i++, link = TREE_CHAIN (link))
1845     {
1846       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1847       oconstraints[i] = constraint;
1848       parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
1849                                &allows_reg, &is_inout);
1850
1851       /* This should have been split in gimplify_asm_expr.  */
1852       gcc_assert (!allows_reg || !is_inout);
1853
1854       /* Memory operands are addressable.  Note that STMT needs the
1855          address of this operand.  */
1856       if (!allows_reg && allows_mem)
1857         {
1858           tree t = get_base_address (TREE_VALUE (link));
1859           if (t && DECL_P (t) && s_ann)
1860             add_to_addressable_set (t, &s_ann->addresses_taken);
1861         }
1862
1863       get_expr_operands (stmt, &TREE_VALUE (link), opf_def);
1864     }
1865
1866   /* Gather all input operands.  */
1867   for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
1868     {
1869       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1870       parse_input_constraint (&constraint, 0, 0, noutputs, 0, oconstraints,
1871                               &allows_mem, &allows_reg);
1872
1873       /* Memory operands are addressable.  Note that STMT needs the
1874          address of this operand.  */
1875       if (!allows_reg && allows_mem)
1876         {
1877           tree t = get_base_address (TREE_VALUE (link));
1878           if (t && DECL_P (t) && s_ann)
1879             add_to_addressable_set (t, &s_ann->addresses_taken);
1880         }
1881
1882       get_expr_operands (stmt, &TREE_VALUE (link), 0);
1883     }
1884
1885   /* Clobber all memory and addressable symbols for asm ("" : : : "memory");  */
1886   for (link = ASM_CLOBBERS (stmt); link; link = TREE_CHAIN (link))
1887     if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
1888       {
1889         unsigned i;
1890         bitmap_iterator bi;
1891
1892         s_ann->references_memory = true;
1893
1894         EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, i, bi)
1895           {
1896             tree var = referenced_var (i);
1897             add_stmt_operand (&var, s_ann, opf_def | opf_implicit);
1898           }
1899
1900         EXECUTE_IF_SET_IN_BITMAP (gimple_addressable_vars (cfun), 0, i, bi)
1901           {
1902             tree var = referenced_var (i);
1903             add_stmt_operand (&var, s_ann, opf_def | opf_implicit);
1904           }
1905         break;
1906       }
1907 }
1908
1909
1910 /* Scan operands for the assignment expression EXPR in statement STMT.  */
1911
1912 static void
1913 get_modify_stmt_operands (tree stmt, tree expr)
1914 {
1915   /* First get operands from the RHS.  */
1916   get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (expr, 1), opf_use);
1917
1918   /* For the LHS, use a regular definition (opf_def) for GIMPLE
1919      registers.  If the LHS is a store to memory, we will need
1920      a preserving definition (VDEF).
1921
1922      Preserving definitions are those that modify a part of an
1923      aggregate object. Stores through a pointer are also represented
1924      with VDEF operators.
1925
1926      We used to distinguish between preserving and killing definitions.
1927      We always emit preserving definitions now.  */
1928   get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (expr, 0), opf_def);
1929 }
1930
1931
1932 /* Recursively scan the expression pointed to by EXPR_P in statement
1933    STMT.  FLAGS is one of the OPF_* constants modifying how to
1934    interpret the operands found.  */
1935
1936 static void
1937 get_expr_operands (tree stmt, tree *expr_p, int flags)
1938 {
1939   enum tree_code code;
1940   enum tree_code_class codeclass;
1941   tree expr = *expr_p;
1942   stmt_ann_t s_ann = stmt_ann (stmt);
1943
1944   if (expr == NULL)
1945     return;
1946
1947   code = TREE_CODE (expr);
1948   codeclass = TREE_CODE_CLASS (code);
1949
1950   switch (code)
1951     {
1952     case ADDR_EXPR:
1953       /* Taking the address of a variable does not represent a
1954          reference to it, but the fact that the statement takes its
1955          address will be of interest to some passes (e.g. alias
1956          resolution).  */
1957       add_to_addressable_set (TREE_OPERAND (expr, 0), &s_ann->addresses_taken);
1958
1959       /* If the address is invariant, there may be no interesting
1960          variable references inside.  */
1961       if (is_gimple_min_invariant (expr))
1962         return;
1963
1964       /* Otherwise, there may be variables referenced inside but there
1965          should be no VUSEs created, since the referenced objects are
1966          not really accessed.  The only operands that we should find
1967          here are ARRAY_REF indices which will always be real operands
1968          (GIMPLE does not allow non-registers as array indices).  */
1969       flags |= opf_no_vops;
1970       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1971       return;
1972
1973     case SSA_NAME:
1974     case SYMBOL_MEMORY_TAG:
1975     case NAME_MEMORY_TAG:
1976      add_stmt_operand (expr_p, s_ann, flags);
1977      return;
1978
1979     case VAR_DECL:
1980     case PARM_DECL:
1981     case RESULT_DECL:
1982       add_stmt_operand (expr_p, s_ann, flags);
1983       return;
1984
1985     case MISALIGNED_INDIRECT_REF:
1986       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
1987       /* fall through */
1988
1989     case ALIGN_INDIRECT_REF:
1990     case INDIRECT_REF:
1991       get_indirect_ref_operands (stmt, expr, flags, expr, 0, -1, true);
1992       return;
1993
1994     case TARGET_MEM_REF:
1995       get_tmr_operands (stmt, expr, flags);
1996       return;
1997
1998     case ARRAY_REF:
1999     case ARRAY_RANGE_REF:
2000     case COMPONENT_REF:
2001     case REALPART_EXPR:
2002     case IMAGPART_EXPR:
2003       {
2004         tree ref;
2005         HOST_WIDE_INT offset, size, maxsize;
2006
2007         if (TREE_THIS_VOLATILE (expr))
2008           s_ann->has_volatile_ops = true;
2009
2010         ref = get_ref_base_and_extent (expr, &offset, &size, &maxsize);
2011         if (TREE_CODE (ref) == INDIRECT_REF)
2012           {
2013             get_indirect_ref_operands (stmt, ref, flags, expr, offset,
2014                                        maxsize, false);
2015             flags |= opf_no_vops;
2016           }
2017
2018         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2019         
2020         if (code == COMPONENT_REF)
2021           {
2022             if (TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1)))
2023               s_ann->has_volatile_ops = true; 
2024             get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_use);
2025           }
2026         else if (code == ARRAY_REF || code == ARRAY_RANGE_REF)
2027           {
2028             get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_use);
2029             get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_use);
2030             get_expr_operands (stmt, &TREE_OPERAND (expr, 3), opf_use);
2031           }
2032
2033         return;
2034       }
2035
2036     case WITH_SIZE_EXPR:
2037       /* WITH_SIZE_EXPR is a pass-through reference to its first argument,
2038          and an rvalue reference to its second argument.  */
2039       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_use);
2040       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2041       return;
2042
2043     case CALL_EXPR:
2044       get_call_expr_operands (stmt, expr);
2045       return;
2046
2047     case COND_EXPR:
2048     case VEC_COND_EXPR:
2049       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_use);
2050       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_use);
2051       get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_use);
2052       return;
2053
2054     case GIMPLE_MODIFY_STMT:
2055       get_modify_stmt_operands (stmt, expr);
2056       return;
2057
2058     case CONSTRUCTOR:
2059       {
2060         /* General aggregate CONSTRUCTORs have been decomposed, but they
2061            are still in use as the COMPLEX_EXPR equivalent for vectors.  */
2062         constructor_elt *ce;
2063         unsigned HOST_WIDE_INT idx;
2064
2065         for (idx = 0;
2066              VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (expr), idx, ce);
2067              idx++)
2068           get_expr_operands (stmt, &ce->value, opf_use);
2069
2070         return;
2071       }
2072
2073     case BIT_FIELD_REF:
2074     case TRUTH_NOT_EXPR:
2075     case VIEW_CONVERT_EXPR:
2076     do_unary:
2077       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2078       return;
2079
2080     case TRUTH_AND_EXPR:
2081     case TRUTH_OR_EXPR:
2082     case TRUTH_XOR_EXPR:
2083     case COMPOUND_EXPR:
2084     case OBJ_TYPE_REF:
2085     case ASSERT_EXPR:
2086     do_binary:
2087       {
2088         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2089         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
2090         return;
2091       }
2092
2093     case DOT_PROD_EXPR:
2094     case REALIGN_LOAD_EXPR:
2095       {
2096         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2097         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
2098         get_expr_operands (stmt, &TREE_OPERAND (expr, 2), flags);
2099         return;
2100       }
2101
2102     case CHANGE_DYNAMIC_TYPE_EXPR:
2103       get_expr_operands (stmt, &CHANGE_DYNAMIC_TYPE_LOCATION (expr), opf_use);
2104       return;
2105
2106     case OMP_FOR:
2107       {
2108         tree c, clauses = OMP_FOR_CLAUSES (stmt);
2109         int i;
2110
2111         for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (expr)); i++)
2112           {
2113             tree init = TREE_VEC_ELT (OMP_FOR_INIT (expr), i);
2114             tree cond = TREE_VEC_ELT (OMP_FOR_COND (expr), i);
2115             tree incr = TREE_VEC_ELT (OMP_FOR_INCR (expr), i);
2116
2117             get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (init, 0), opf_def);
2118             get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (init, 1), opf_use);
2119             get_expr_operands (stmt, &TREE_OPERAND (cond, 1), opf_use);
2120             get_expr_operands (stmt,
2121                                &TREE_OPERAND (GIMPLE_STMT_OPERAND (incr, 1),
2122                                               1), opf_use);
2123           }
2124
2125         c = find_omp_clause (clauses, OMP_CLAUSE_SCHEDULE);
2126         if (c)
2127           get_expr_operands (stmt, &OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c),
2128                              opf_use);
2129         return;
2130       }
2131
2132     case OMP_CONTINUE:
2133       {
2134         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_def);
2135         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_use);
2136         return;
2137       }
2138
2139     case OMP_PARALLEL:
2140       {
2141         tree c, clauses = OMP_PARALLEL_CLAUSES (stmt);
2142
2143         if (OMP_PARALLEL_DATA_ARG (stmt))
2144           {
2145             get_expr_operands (stmt, &OMP_PARALLEL_DATA_ARG (stmt), opf_use);
2146             add_to_addressable_set (OMP_PARALLEL_DATA_ARG (stmt),
2147                                     &s_ann->addresses_taken);
2148           }
2149
2150         c = find_omp_clause (clauses, OMP_CLAUSE_IF);
2151         if (c)
2152           get_expr_operands (stmt, &OMP_CLAUSE_IF_EXPR (c), opf_use);
2153         c = find_omp_clause (clauses, OMP_CLAUSE_NUM_THREADS);
2154         if (c)
2155           get_expr_operands (stmt, &OMP_CLAUSE_NUM_THREADS_EXPR (c), opf_use);
2156         return;
2157       }
2158
2159     case OMP_SECTIONS:
2160       {
2161         get_expr_operands (stmt, &OMP_SECTIONS_CONTROL (expr), opf_def);
2162         return;
2163       }
2164
2165     case OMP_ATOMIC_LOAD:
2166       {
2167         tree *addr = &TREE_OPERAND (expr, 1);
2168         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_def);
2169
2170         if (TREE_CODE (*addr) == ADDR_EXPR)
2171           get_expr_operands (stmt, &TREE_OPERAND (*addr, 0), opf_def);
2172         else
2173           get_addr_dereference_operands (stmt, addr, opf_def,
2174                                          NULL_TREE, 0, -1, true);
2175         return;
2176       }
2177
2178     case OMP_ATOMIC_STORE:
2179       {
2180         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_use);
2181         return;
2182       }
2183
2184     case BLOCK:
2185     case FUNCTION_DECL:
2186     case EXC_PTR_EXPR:
2187     case FILTER_EXPR:
2188     case LABEL_DECL:
2189     case CONST_DECL:
2190     case OMP_SINGLE:
2191     case OMP_MASTER:
2192     case OMP_ORDERED:
2193     case OMP_CRITICAL:
2194     case OMP_RETURN:
2195     case OMP_SECTION:
2196     case OMP_SECTIONS_SWITCH:
2197     case PREDICT_EXPR:
2198       /* Expressions that make no memory references.  */
2199       return;
2200
2201     default:
2202       if (codeclass == tcc_unary)
2203         goto do_unary;
2204       if (codeclass == tcc_binary || codeclass == tcc_comparison)
2205         goto do_binary;
2206       if (codeclass == tcc_constant || codeclass == tcc_type)
2207         return;
2208     }
2209
2210   /* If we get here, something has gone wrong.  */
2211 #ifdef ENABLE_CHECKING
2212   fprintf (stderr, "unhandled expression in get_expr_operands():\n");
2213   debug_tree (expr);
2214   fputs ("\n", stderr);
2215 #endif
2216   gcc_unreachable ();
2217 }
2218
2219
2220 /* Parse STMT looking for operands.  When finished, the various
2221    build_* operand vectors will have potential operands in them.  */
2222
2223 static void
2224 parse_ssa_operands (tree stmt)
2225 {
2226   enum tree_code code;
2227
2228   code = TREE_CODE (stmt);
2229   switch (code)
2230     {
2231     case GIMPLE_MODIFY_STMT:
2232       get_modify_stmt_operands (stmt, stmt);
2233       break;
2234
2235     case COND_EXPR:
2236       get_expr_operands (stmt, &COND_EXPR_COND (stmt), opf_use);
2237       break;
2238
2239     case SWITCH_EXPR:
2240       get_expr_operands (stmt, &SWITCH_COND (stmt), opf_use);
2241       break;
2242
2243     case ASM_EXPR:
2244       get_asm_expr_operands (stmt);
2245       break;
2246
2247     case RETURN_EXPR:
2248       get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), opf_use);
2249       break;
2250
2251     case GOTO_EXPR:
2252       get_expr_operands (stmt, &GOTO_DESTINATION (stmt), opf_use);
2253       break;
2254
2255     case LABEL_EXPR:
2256       get_expr_operands (stmt, &LABEL_EXPR_LABEL (stmt), opf_use);
2257       break;
2258
2259     case BIND_EXPR:
2260     case CASE_LABEL_EXPR:
2261     case TRY_CATCH_EXPR:
2262     case TRY_FINALLY_EXPR:
2263     case EH_FILTER_EXPR:
2264     case CATCH_EXPR:
2265     case RESX_EXPR:
2266       /* These nodes contain no variable references.  */
2267      break;
2268
2269     default:
2270       /* Notice that if get_expr_operands tries to use &STMT as the
2271          operand pointer (which may only happen for USE operands), we
2272          will fail in add_stmt_operand.  This default will handle
2273          statements like empty statements, or CALL_EXPRs that may
2274          appear on the RHS of a statement or as statements themselves.  */
2275       get_expr_operands (stmt, &stmt, opf_use);
2276       break;
2277     }
2278 }
2279
2280
2281 /* Create an operands cache for STMT.  */
2282
2283 static void
2284 build_ssa_operands (tree stmt)
2285 {
2286   stmt_ann_t ann = get_stmt_ann (stmt);
2287   
2288   /* Initially assume that the statement has no volatile operands and
2289      makes no memory references.  */
2290   ann->has_volatile_ops = false;
2291   ann->references_memory = false;
2292   /* Just clear the bitmap so we don't end up reallocating it over and over.  */
2293   if (ann->addresses_taken)
2294     bitmap_clear (ann->addresses_taken);
2295
2296   start_ssa_stmt_operands ();
2297   parse_ssa_operands (stmt);
2298   operand_build_sort_virtual (build_vuses);
2299   operand_build_sort_virtual (build_vdefs);
2300   finalize_ssa_stmt_operands (stmt);
2301
2302   if (ann->addresses_taken && bitmap_empty_p (ann->addresses_taken))
2303     ann->addresses_taken = NULL;
2304
2305   /* For added safety, assume that statements with volatile operands
2306      also reference memory.  */
2307   if (ann->has_volatile_ops)
2308     ann->references_memory = true;
2309 }
2310
2311
2312 /* Releases the operands of STMT back to their freelists, and clears
2313    the stmt operand lists.  */
2314
2315 void
2316 free_stmt_operands (tree stmt)
2317 {
2318   def_optype_p defs = DEF_OPS (stmt), last_def;
2319   use_optype_p uses = USE_OPS (stmt), last_use;
2320   voptype_p vuses = VUSE_OPS (stmt);
2321   voptype_p vdefs = VDEF_OPS (stmt), vdef, next_vdef;
2322   unsigned i;
2323
2324   if (defs)
2325     {
2326       for (last_def = defs; last_def->next; last_def = last_def->next)
2327         continue;
2328       last_def->next = gimple_ssa_operands (cfun)->free_defs;
2329       gimple_ssa_operands (cfun)->free_defs = defs;
2330       DEF_OPS (stmt) = NULL;
2331     }
2332
2333   if (uses)
2334     {
2335       for (last_use = uses; last_use->next; last_use = last_use->next)
2336         delink_imm_use (USE_OP_PTR (last_use));
2337       delink_imm_use (USE_OP_PTR (last_use));
2338       last_use->next = gimple_ssa_operands (cfun)->free_uses;
2339       gimple_ssa_operands (cfun)->free_uses = uses;
2340       USE_OPS (stmt) = NULL;
2341     }
2342
2343   if (vuses)
2344     {
2345       for (i = 0; i < VUSE_NUM (vuses); i++)
2346         delink_imm_use (VUSE_OP_PTR (vuses, i));
2347       add_vop_to_freelist (vuses);
2348       VUSE_OPS (stmt) = NULL;
2349     }
2350
2351   if (vdefs)
2352     {
2353       for (vdef = vdefs; vdef; vdef = next_vdef)
2354         {
2355           next_vdef = vdef->next;
2356           delink_imm_use (VDEF_OP_PTR (vdef, 0));
2357           add_vop_to_freelist (vdef);
2358         }
2359       VDEF_OPS (stmt) = NULL;
2360     }
2361 }
2362
2363
2364 /* Free any operands vectors in OPS.  */
2365
2366 void 
2367 free_ssa_operands (stmt_operands_p ops)
2368 {
2369   ops->def_ops = NULL;
2370   ops->use_ops = NULL;
2371   ops->vdef_ops = NULL;
2372   ops->vuse_ops = NULL;
2373   BITMAP_FREE (ops->loads);
2374   BITMAP_FREE (ops->stores);
2375 }
2376
2377
2378 /* Get the operands of statement STMT.  */
2379
2380 void
2381 update_stmt_operands (tree stmt)
2382 {
2383   stmt_ann_t ann = get_stmt_ann (stmt);
2384
2385   /* If update_stmt_operands is called before SSA is initialized, do
2386      nothing.  */
2387   if (!ssa_operands_active ())
2388     return;
2389
2390   /* The optimizers cannot handle statements that are nothing but a
2391      _DECL.  This indicates a bug in the gimplifier.  */
2392   gcc_assert (!SSA_VAR_P (stmt));
2393
2394   timevar_push (TV_TREE_OPS);
2395
2396   gcc_assert (ann->modified);
2397   build_ssa_operands (stmt);
2398   ann->modified = 0;
2399
2400   timevar_pop (TV_TREE_OPS);
2401 }
2402
2403
2404 /* Copies virtual operands from SRC to DST.  */
2405
2406 void
2407 copy_virtual_operands (tree dest, tree src)
2408 {
2409   unsigned int i, n;
2410   voptype_p src_vuses, dest_vuses;
2411   voptype_p src_vdefs, dest_vdefs;
2412   struct voptype_d vuse;
2413   struct voptype_d vdef;
2414   stmt_ann_t dest_ann;
2415
2416   VDEF_OPS (dest) = NULL;
2417   VUSE_OPS (dest) = NULL;
2418
2419   dest_ann = get_stmt_ann (dest);
2420   BITMAP_FREE (dest_ann->operands.loads);
2421   BITMAP_FREE (dest_ann->operands.stores);
2422
2423   if (LOADED_SYMS (src))
2424     {
2425       dest_ann->operands.loads = BITMAP_ALLOC (&operands_bitmap_obstack);
2426       bitmap_copy (dest_ann->operands.loads, LOADED_SYMS (src));
2427     }
2428
2429   if (STORED_SYMS (src))
2430     {
2431       dest_ann->operands.stores = BITMAP_ALLOC (&operands_bitmap_obstack);
2432       bitmap_copy (dest_ann->operands.stores, STORED_SYMS (src));
2433     }
2434
2435   /* Copy all the VUSE operators and corresponding operands.  */
2436   dest_vuses = &vuse;
2437   for (src_vuses = VUSE_OPS (src); src_vuses; src_vuses = src_vuses->next)
2438     {
2439       n = VUSE_NUM (src_vuses);
2440       dest_vuses = add_vuse_op (dest, NULL_TREE, n, dest_vuses);
2441       for (i = 0; i < n; i++)
2442         SET_USE (VUSE_OP_PTR (dest_vuses, i), VUSE_OP (src_vuses, i));
2443
2444       if (VUSE_OPS (dest) == NULL)
2445         VUSE_OPS (dest) = vuse.next;
2446     }
2447
2448   /* Copy all the VDEF operators and corresponding operands.  */
2449   dest_vdefs = &vdef;
2450   for (src_vdefs = VDEF_OPS (src); src_vdefs; src_vdefs = src_vdefs->next)
2451     {
2452       n = VUSE_NUM (src_vdefs);
2453       dest_vdefs = add_vdef_op (dest, NULL_TREE, n, dest_vdefs);
2454       VDEF_RESULT (dest_vdefs) = VDEF_RESULT (src_vdefs);
2455       for (i = 0; i < n; i++)
2456         SET_USE (VUSE_OP_PTR (dest_vdefs, i), VUSE_OP (src_vdefs, i));
2457
2458       if (VDEF_OPS (dest) == NULL)
2459         VDEF_OPS (dest) = vdef.next;
2460     }
2461 }
2462
2463
2464 /* Specifically for use in DOM's expression analysis.  Given a store, we
2465    create an artificial stmt which looks like a load from the store, this can
2466    be used to eliminate redundant loads.  OLD_OPS are the operands from the 
2467    store stmt, and NEW_STMT is the new load which represents a load of the
2468    values stored.  If DELINK_IMM_USES_P is specified, the immediate
2469    uses of this stmt will be de-linked.  */
2470
2471 void
2472 create_ssa_artificial_load_stmt (tree new_stmt, tree old_stmt,
2473                                  bool delink_imm_uses_p)
2474 {
2475   tree op;
2476   ssa_op_iter iter;
2477   use_operand_p use_p;
2478   unsigned i;
2479   stmt_ann_t ann;
2480
2481   /* Create the stmt annotation but make sure to not mark the stmt
2482      as modified as we will build operands ourselves.  */
2483   ann = get_stmt_ann (new_stmt);
2484   ann->modified = 0;
2485
2486   /* Process NEW_STMT looking for operands.  */
2487   start_ssa_stmt_operands ();
2488   parse_ssa_operands (new_stmt);
2489
2490   for (i = 0; VEC_iterate (tree, build_vuses, i, op); i++)
2491     if (TREE_CODE (op) != SSA_NAME)
2492       var_ann (op)->in_vuse_list = false;
2493    
2494   for (i = 0; VEC_iterate (tree, build_vdefs, i, op); i++)
2495     if (TREE_CODE (op) != SSA_NAME)
2496       var_ann (op)->in_vdef_list = false;
2497
2498   /* Remove any virtual operands that were found.  */
2499   VEC_truncate (tree, build_vdefs, 0);
2500   VEC_truncate (tree, build_vuses, 0);
2501
2502   /* Clear the loads and stores bitmaps.  */
2503   bitmap_clear (build_loads);
2504   bitmap_clear (build_stores);
2505
2506   /* For each VDEF on the original statement, we want to create a
2507      VUSE of the VDEF result operand on the new statement.  */
2508   FOR_EACH_SSA_TREE_OPERAND (op, old_stmt, iter, SSA_OP_VDEF)
2509     append_vuse (op);
2510
2511   finalize_ssa_stmt_operands (new_stmt);
2512
2513   /* All uses in this fake stmt must not be in the immediate use lists.  */
2514   if (delink_imm_uses_p)
2515     FOR_EACH_SSA_USE_OPERAND (use_p, new_stmt, iter, SSA_OP_ALL_USES)
2516       delink_imm_use (use_p);
2517 }
2518
2519
2520 /* Swap operands EXP0 and EXP1 in statement STMT.  No attempt is done
2521    to test the validity of the swap operation.  */
2522
2523 void
2524 swap_tree_operands (tree stmt, tree *exp0, tree *exp1)
2525 {
2526   tree op0, op1;
2527   op0 = *exp0;
2528   op1 = *exp1;
2529
2530   /* If the operand cache is active, attempt to preserve the relative
2531      positions of these two operands in their respective immediate use
2532      lists.  */
2533   if (ssa_operands_active () && op0 != op1)
2534     {
2535       use_optype_p use0, use1, ptr;
2536       use0 = use1 = NULL;
2537
2538       /* Find the 2 operands in the cache, if they are there.  */
2539       for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
2540         if (USE_OP_PTR (ptr)->use == exp0)
2541           {
2542             use0 = ptr;
2543             break;
2544           }
2545
2546       for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
2547         if (USE_OP_PTR (ptr)->use == exp1)
2548           {
2549             use1 = ptr;
2550             break;
2551           }
2552
2553       /* If both uses don't have operand entries, there isn't much we can do
2554          at this point.  Presumably we don't need to worry about it.  */
2555       if (use0 && use1)
2556         {
2557           tree *tmp = USE_OP_PTR (use1)->use;
2558           USE_OP_PTR (use1)->use = USE_OP_PTR (use0)->use;
2559           USE_OP_PTR (use0)->use = tmp;
2560         }
2561     }
2562
2563   /* Now swap the data.  */
2564   *exp0 = op1;
2565   *exp1 = op0;
2566 }
2567
2568
2569 /* Add the base address of REF to the set *ADDRESSES_TAKEN.  If
2570    *ADDRESSES_TAKEN is NULL, a new set is created.  REF may be
2571    a single variable whose address has been taken or any other valid
2572    GIMPLE memory reference (structure reference, array, etc).  */
2573
2574 void
2575 add_to_addressable_set (tree ref, bitmap *addresses_taken)
2576 {
2577   tree var;
2578
2579   gcc_assert (addresses_taken);
2580
2581   /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF
2582      as the only thing we take the address of.  If VAR is a structure,
2583      taking the address of a field means that the whole structure may
2584      be referenced using pointer arithmetic.  See PR 21407 and the
2585      ensuing mailing list discussion.  */
2586   var = get_base_address (ref);
2587   if (var && SSA_VAR_P (var))
2588     {
2589       if (*addresses_taken == NULL)
2590         *addresses_taken = BITMAP_GGC_ALLOC ();      
2591       bitmap_set_bit (*addresses_taken, DECL_UID (var));
2592       TREE_ADDRESSABLE (var) = 1;
2593     }
2594 }
2595
2596
2597 /* Scan the immediate_use list for VAR making sure its linked properly.
2598    Return TRUE if there is a problem and emit an error message to F.  */
2599
2600 bool
2601 verify_imm_links (FILE *f, tree var)
2602 {
2603   use_operand_p ptr, prev, list;
2604   int count;
2605
2606   gcc_assert (TREE_CODE (var) == SSA_NAME);
2607
2608   list = &(SSA_NAME_IMM_USE_NODE (var));
2609   gcc_assert (list->use == NULL);
2610
2611   if (list->prev == NULL)
2612     {
2613       gcc_assert (list->next == NULL);
2614       return false;
2615     }
2616
2617   prev = list;
2618   count = 0;
2619   for (ptr = list->next; ptr != list; )
2620     {
2621       if (prev != ptr->prev)
2622         goto error;
2623       
2624       if (ptr->use == NULL)
2625         goto error; /* 2 roots, or SAFE guard node.  */
2626       else if (*(ptr->use) != var)
2627         goto error;
2628
2629       prev = ptr;
2630       ptr = ptr->next;
2631
2632       /* Avoid infinite loops.  50,000,000 uses probably indicates a
2633          problem.  */
2634       if (count++ > 50000000)
2635         goto error;
2636     }
2637
2638   /* Verify list in the other direction.  */
2639   prev = list;
2640   for (ptr = list->prev; ptr != list; )
2641     {
2642       if (prev != ptr->next)
2643         goto error;
2644       prev = ptr;
2645       ptr = ptr->prev;
2646       if (count-- < 0)
2647         goto error;
2648     }
2649
2650   if (count != 0)
2651     goto error;
2652
2653   return false;
2654
2655  error:
2656   if (ptr->stmt && stmt_modified_p (ptr->stmt))
2657     {
2658       fprintf (f, " STMT MODIFIED. - <%p> ", (void *)ptr->stmt);
2659       print_generic_stmt (f, ptr->stmt, TDF_SLIM);
2660     }
2661   fprintf (f, " IMM ERROR : (use_p : tree - %p:%p)", (void *)ptr, 
2662            (void *)ptr->use);
2663   print_generic_expr (f, USE_FROM_PTR (ptr), TDF_SLIM);
2664   fprintf(f, "\n");
2665   return true;
2666 }
2667
2668
2669 /* Dump all the immediate uses to FILE.  */
2670
2671 void
2672 dump_immediate_uses_for (FILE *file, tree var)
2673 {
2674   imm_use_iterator iter;
2675   use_operand_p use_p;
2676
2677   gcc_assert (var && TREE_CODE (var) == SSA_NAME);
2678
2679   print_generic_expr (file, var, TDF_SLIM);
2680   fprintf (file, " : -->");
2681   if (has_zero_uses (var))
2682     fprintf (file, " no uses.\n");
2683   else
2684     if (has_single_use (var))
2685       fprintf (file, " single use.\n");
2686     else
2687       fprintf (file, "%d uses.\n", num_imm_uses (var));
2688
2689   FOR_EACH_IMM_USE_FAST (use_p, iter, var)
2690     {
2691       if (use_p->stmt == NULL && use_p->use == NULL)
2692         fprintf (file, "***end of stmt iterator marker***\n");
2693       else
2694         if (!is_gimple_reg (USE_FROM_PTR (use_p)))
2695           print_generic_stmt (file, USE_STMT (use_p), TDF_VOPS|TDF_MEMSYMS);
2696         else
2697           print_generic_stmt (file, USE_STMT (use_p), TDF_SLIM);
2698     }
2699   fprintf(file, "\n");
2700 }
2701
2702
2703 /* Dump all the immediate uses to FILE.  */
2704
2705 void
2706 dump_immediate_uses (FILE *file)
2707 {
2708   tree var;
2709   unsigned int x;
2710
2711   fprintf (file, "Immediate_uses: \n\n");
2712   for (x = 1; x < num_ssa_names; x++)
2713     {
2714       var = ssa_name(x);
2715       if (!var)
2716         continue;
2717       dump_immediate_uses_for (file, var);
2718     }
2719 }
2720
2721
2722 /* Dump def-use edges on stderr.  */
2723
2724 void
2725 debug_immediate_uses (void)
2726 {
2727   dump_immediate_uses (stderr);
2728 }
2729
2730
2731 /* Dump def-use edges on stderr.  */
2732
2733 void
2734 debug_immediate_uses_for (tree var)
2735 {
2736   dump_immediate_uses_for (stderr, var);
2737 }
2738
2739
2740 /* Create a new change buffer for the statement pointed by STMT_P and
2741    push the buffer into SCB_STACK.  Each change buffer
2742    records state information needed to determine what changed in the
2743    statement.  Mainly, this keeps track of symbols that may need to be
2744    put into SSA form, SSA name replacements and other information
2745    needed to keep the SSA form up to date.  */
2746
2747 void
2748 push_stmt_changes (tree *stmt_p)
2749 {
2750   tree stmt;
2751   scb_t buf;
2752   
2753   stmt = *stmt_p;
2754
2755   /* It makes no sense to keep track of PHI nodes.  */
2756   if (TREE_CODE (stmt) == PHI_NODE)
2757     return;
2758
2759   buf = XNEW (struct scb_d);
2760   memset (buf, 0, sizeof *buf);
2761
2762   buf->stmt_p = stmt_p;
2763
2764   if (stmt_references_memory_p (stmt))
2765     {
2766       tree op;
2767       ssa_op_iter i;
2768
2769       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VUSE)
2770         {
2771           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2772           if (buf->loads == NULL)
2773             buf->loads = BITMAP_ALLOC (NULL);
2774           bitmap_set_bit (buf->loads, DECL_UID (sym));
2775         }
2776
2777       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VDEF)
2778         {
2779           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2780           if (buf->stores == NULL)
2781             buf->stores = BITMAP_ALLOC (NULL);
2782           bitmap_set_bit (buf->stores, DECL_UID (sym));
2783         }
2784     }
2785
2786   VEC_safe_push (scb_t, heap, scb_stack, buf);
2787 }
2788
2789
2790 /* Given two sets S1 and S2, mark the symbols that differ in S1 and S2
2791    for renaming.  The set to mark for renaming is (S1 & ~S2) | (S2 & ~S1).  */
2792
2793 static void
2794 mark_difference_for_renaming (bitmap s1, bitmap s2)
2795 {
2796   if (s1 == NULL && s2 == NULL)
2797     return;
2798
2799   if (s1 && s2 == NULL)
2800     mark_set_for_renaming (s1);
2801   else if (s1 == NULL && s2)
2802     mark_set_for_renaming (s2);
2803   else if (!bitmap_equal_p (s1, s2))
2804     {
2805       bitmap t1 = BITMAP_ALLOC (NULL);
2806       bitmap_xor (t1, s1, s2);
2807       mark_set_for_renaming (t1);
2808       BITMAP_FREE (t1);
2809     }
2810 }
2811
2812
2813 /* Pop the top SCB from SCB_STACK and act on the differences between
2814    what was recorded by push_stmt_changes and the current state of
2815    the statement.  */
2816
2817 void
2818 pop_stmt_changes (tree *stmt_p)
2819 {
2820   tree op, stmt;
2821   ssa_op_iter iter;
2822   bitmap loads, stores;
2823   scb_t buf;
2824
2825   stmt = *stmt_p;
2826
2827   /* It makes no sense to keep track of PHI nodes.  */
2828   if (TREE_CODE (stmt) == PHI_NODE)
2829     return;
2830
2831   buf = VEC_pop (scb_t, scb_stack);
2832   gcc_assert (stmt_p == buf->stmt_p);
2833
2834   /* Force an operand re-scan on the statement and mark any newly
2835      exposed variables.  */
2836   update_stmt (stmt);
2837
2838   /* Determine whether any memory symbols need to be renamed.  If the
2839      sets of loads and stores are different after the statement is
2840      modified, then the affected symbols need to be renamed.
2841      
2842      Note that it may be possible for the statement to not reference
2843      memory anymore, but we still need to act on the differences in
2844      the sets of symbols.  */
2845   loads = stores = NULL;
2846   if (stmt_references_memory_p (stmt))
2847     {
2848       tree op;
2849       ssa_op_iter i;
2850
2851       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VUSE)
2852         {
2853           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2854           if (loads == NULL)
2855             loads = BITMAP_ALLOC (NULL);
2856           bitmap_set_bit (loads, DECL_UID (sym));
2857         }
2858
2859       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VDEF)
2860         {
2861           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2862           if (stores == NULL)
2863             stores = BITMAP_ALLOC (NULL);
2864           bitmap_set_bit (stores, DECL_UID (sym));
2865         }
2866     }
2867
2868   /* If LOADS is different from BUF->LOADS, the affected
2869      symbols need to be marked for renaming.  */
2870   mark_difference_for_renaming (loads, buf->loads);
2871
2872   /* Similarly for STORES and BUF->STORES.  */
2873   mark_difference_for_renaming (stores, buf->stores);
2874
2875   /* Mark all the naked GIMPLE register operands for renaming.  */
2876   FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF|SSA_OP_USE)
2877     if (DECL_P (op))
2878       mark_sym_for_renaming (op);
2879
2880   /* FIXME, need to add more finalizers here.  Cleanup EH info,
2881      recompute invariants for address expressions, add
2882      SSA replacement mappings, etc.  For instance, given
2883      testsuite/gcc.c-torture/compile/pr16808.c, we fold a statement of
2884      the form:
2885
2886           # SMT.4_20 = VDEF <SMT.4_16>
2887           D.1576_11 = 1.0e+0;
2888
2889      So, the VDEF will disappear, but instead of marking SMT.4 for
2890      renaming it would be far more efficient to establish a
2891      replacement mapping that would replace every reference of
2892      SMT.4_20 with SMT.4_16.  */
2893
2894   /* Free memory used by the buffer.  */
2895   BITMAP_FREE (buf->loads);
2896   BITMAP_FREE (buf->stores);
2897   BITMAP_FREE (loads);
2898   BITMAP_FREE (stores);
2899   buf->stmt_p = NULL;
2900   free (buf);
2901 }
2902
2903
2904 /* Discard the topmost change buffer from SCB_STACK.  This is useful
2905    when the caller realized that it did not actually modified the
2906    statement.  It avoids the expensive operand re-scan.  */
2907
2908 void
2909 discard_stmt_changes (tree *stmt_p)
2910 {
2911   scb_t buf;
2912   tree stmt;
2913   
2914   /* It makes no sense to keep track of PHI nodes.  */
2915   stmt = *stmt_p;
2916   if (TREE_CODE (stmt) == PHI_NODE)
2917     return;
2918
2919   buf = VEC_pop (scb_t, scb_stack);
2920   gcc_assert (stmt_p == buf->stmt_p);
2921
2922   /* Free memory used by the buffer.  */
2923   BITMAP_FREE (buf->loads);
2924   BITMAP_FREE (buf->stores);
2925   buf->stmt_p = NULL;
2926   free (buf);
2927 }
2928
2929
2930 /* Returns true if statement STMT may access memory.  */
2931
2932 bool
2933 stmt_references_memory_p (tree stmt)
2934 {
2935   if (!gimple_ssa_operands (cfun)->ops_active || TREE_CODE (stmt) == PHI_NODE)
2936     return false;
2937
2938   return stmt_ann (stmt)->references_memory;
2939 }