OSDN Git Service

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