OSDN Git Service

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