OSDN Git Service

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