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