OSDN Git Service

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