OSDN Git Service

* zh_CN.po: Update.
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-operands.c
1 /* SSA operands management for trees.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "flags.h"
27 #include "function.h"
28 #include "diagnostic.h"
29 #include "tree-flow.h"
30 #include "tree-inline.h"
31 #include "tree-pass.h"
32 #include "ggc.h"
33 #include "timevar.h"
34 #include "toplev.h"
35 #include "langhooks.h"
36 #include "ipa-reference.h"
37
38 /* This file contains the code required to manage the operands cache of the 
39    SSA optimizer.  For every stmt, we maintain an operand cache in the stmt 
40    annotation.  This cache contains operands that will be of interest to 
41    optimizers and other passes wishing to manipulate the IL. 
42
43    The operand type are broken up into REAL and VIRTUAL operands.  The real 
44    operands are represented as pointers into the stmt's operand tree.  Thus 
45    any manipulation of the real operands will be reflected in the actual tree.
46    Virtual operands are represented solely in the cache, although the base 
47    variable for the SSA_NAME may, or may not occur in the stmt's tree.  
48    Manipulation of the virtual operands will not be reflected in the stmt tree.
49
50    The routines in this file are concerned with creating this operand cache 
51    from a stmt tree.
52
53    The operand tree is the parsed by the various get_* routines which look 
54    through the stmt tree for the occurrence of operands which may be of 
55    interest, and calls are made to the append_* routines whenever one is 
56    found.  There are 4 of these routines, each representing one of the 
57    4 types of operands. Defs, Uses, Virtual Uses, and Virtual May Defs.
58
59    The append_* routines check for duplication, and simply keep a list of 
60    unique objects for each operand type in the build_* extendable vectors.
61
62    Once the stmt tree is completely parsed, the finalize_ssa_operands() 
63    routine is called, which proceeds to perform the finalization routine 
64    on each of the 4 operand vectors which have been built up.
65
66    If the stmt had a previous operand cache, the finalization routines 
67    attempt to match up the new operands with the old ones.  If it's a perfect 
68    match, the old vector is simply reused.  If it isn't a perfect match, then 
69    a new vector is created and the new operands are placed there.  For 
70    virtual operands, if the previous cache had SSA_NAME version of a 
71    variable, and that same variable occurs in the same operands cache, then 
72    the new cache vector will also get the same SSA_NAME.
73
74   i.e., if a stmt had a VUSE of 'a_5', and 'a' occurs in the new operand 
75   vector for VUSE, then the new vector will also be modified such that 
76   it contains 'a_5' rather than 'a'.  */
77
78
79 /* Structure storing statistics on how many call clobbers we have, and
80    how many where avoided.  */
81
82 static struct 
83 {
84   /* Number of call-clobbered ops we attempt to add to calls in
85      add_call_clobbered_mem_symbols.  */
86   unsigned int clobbered_vars;
87
88   /* Number of write-clobbers (VDEFs) avoided by using
89      not_written information.  */
90   unsigned int static_write_clobbers_avoided;
91
92   /* Number of reads (VUSEs) avoided by using not_read information.  */
93   unsigned int static_read_clobbers_avoided;
94   
95   /* Number of write-clobbers avoided because the variable can't escape to
96      this call.  */
97   unsigned int unescapable_clobbers_avoided;
98
99   /* Number of read-only uses we attempt to add to calls in
100      add_call_read_mem_symbols.  */
101   unsigned int readonly_clobbers;
102
103   /* Number of read-only uses we avoid using not_read information.  */
104   unsigned int static_readonly_clobbers_avoided;
105 } clobber_stats;
106
107
108 /* Flags to describe operand properties in helpers.  */
109
110 /* By default, operands are loaded.  */
111 #define opf_use         0
112
113 /* Operand is the target of an assignment expression or a 
114    call-clobbered variable.  */
115 #define opf_def         (1 << 0)
116
117 /* No virtual operands should be created in the expression.  This is used
118    when traversing ADDR_EXPR nodes which have different semantics than
119    other expressions.  Inside an ADDR_EXPR node, the only operands that we
120    need to consider are indices into arrays.  For instance, &a.b[i] should
121    generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
122    VUSE for 'b'.  */
123 #define opf_no_vops     (1 << 1)
124
125 /* Operand is an implicit reference.  This is used to distinguish
126    explicit assignments in the form of GIMPLE_MODIFY_STMT from
127    clobbering sites like function calls or ASM_EXPRs.  */
128 #define opf_implicit    (1 << 2)
129
130 /* Array for building all the def operands.  */
131 static VEC(tree,heap) *build_defs;
132
133 /* Array for building all the use operands.  */
134 static VEC(tree,heap) *build_uses;
135
136 /* Set for building all the VDEF operands.  */
137 static VEC(tree,heap) *build_vdefs;
138
139 /* Set for building all the VUSE operands.  */
140 static VEC(tree,heap) *build_vuses;
141
142 /* Bitmap obstack for our datastructures that needs to survive across   
143    compilations of multiple functions.  */
144 static bitmap_obstack operands_bitmap_obstack;
145
146 /* Set for building all the loaded symbols.  */
147 static bitmap build_loads;
148
149 /* Set for building all the stored symbols.  */
150 static bitmap build_stores;
151
152 static void get_expr_operands (tree, tree *, int);
153
154 /* Number of functions with initialized ssa_operands.  */
155 static int n_initialized = 0;
156
157 /* Statement change buffer.  Data structure used to record state
158    information for statements.  This is used to determine what needs
159    to be done in order to update the SSA web after a statement is
160    modified by a pass.  If STMT is a statement that has just been
161    created, or needs to be folded via fold_stmt, or anything that
162    changes its physical structure then the pass should:
163
164    1- Call push_stmt_changes (&stmt) to record the current state of
165       STMT before any modifications are made.
166
167    2- Make all appropriate modifications to the statement.
168
169    3- Call pop_stmt_changes (&stmt) to find new symbols that
170       need to be put in SSA form, SSA name mappings for names that
171       have disappeared, recompute invariantness for address
172       expressions, cleanup EH information, etc.
173
174    If it is possible to determine that the statement was not modified,
175    instead of calling pop_stmt_changes it is quicker to call
176    discard_stmt_changes to avoid the expensive and unnecessary operand
177    re-scan and change comparison.  */
178
179 struct scb_d
180 {
181   /* Pointer to the statement being modified.  */
182   tree *stmt_p;
183
184   /* If the statement references memory these are the sets of symbols
185      loaded and stored by the statement.  */
186   bitmap loads;
187   bitmap stores;
188 };
189
190 typedef struct scb_d *scb_t;
191 DEF_VEC_P(scb_t);
192 DEF_VEC_ALLOC_P(scb_t,heap);
193
194 /* Stack of statement change buffers (SCB).  Every call to
195    push_stmt_changes pushes a new buffer onto the stack.  Calls to
196    pop_stmt_changes pop a buffer off of the stack and compute the set
197    of changes for the popped statement.  */
198 static VEC(scb_t,heap) *scb_stack;
199
200 /* Return the DECL_UID of the base variable of T.  */
201
202 static inline unsigned
203 get_name_decl (tree t)
204 {
205   if (TREE_CODE (t) != SSA_NAME)
206     return DECL_UID (t);
207   else
208     return DECL_UID (SSA_NAME_VAR (t));
209 }
210
211
212 /* Comparison function for qsort used in operand_build_sort_virtual.  */
213
214 static int
215 operand_build_cmp (const void *p, const void *q)
216 {
217   tree e1 = *((const tree *)p);
218   tree e2 = *((const tree *)q);
219   unsigned int u1,u2;
220
221   u1 = get_name_decl (e1);
222   u2 = get_name_decl (e2);
223
224   /* We want to sort in ascending order.  They can never be equal.  */
225 #ifdef ENABLE_CHECKING
226   gcc_assert (u1 != u2);
227 #endif
228   return (u1 > u2 ? 1 : -1);
229 }
230
231
232 /* Sort the virtual operands in LIST from lowest DECL_UID to highest.  */
233
234 static inline void
235 operand_build_sort_virtual (VEC(tree,heap) *list)
236 {
237   int num = VEC_length (tree, list);
238
239   if (num < 2)
240     return;
241
242   if (num == 2)
243     {
244       if (get_name_decl (VEC_index (tree, list, 0)) 
245           > get_name_decl (VEC_index (tree, list, 1)))
246         {  
247           /* Swap elements if in the wrong order.  */
248           tree tmp = VEC_index (tree, list, 0);
249           VEC_replace (tree, list, 0, VEC_index (tree, list, 1));
250           VEC_replace (tree, list, 1, tmp);
251         }
252       return;
253     }
254
255   /* There are 3 or more elements, call qsort.  */
256   qsort (VEC_address (tree, list), 
257          VEC_length (tree, list), 
258          sizeof (tree),
259          operand_build_cmp);
260 }
261
262
263 /*  Return true if the SSA operands cache is active.  */
264
265 bool
266 ssa_operands_active (void)
267 {
268   return cfun->gimple_df && gimple_ssa_operands (cfun)->ops_active;
269 }
270
271
272 /* VOPs are of variable sized, so the free list maps "free buckets" to the 
273    following table:  
274     bucket   # operands
275     ------   ----------
276         0       1
277         1       2
278           ...
279         15      16
280         16      17-24
281         17      25-32
282         18      31-40
283           ...
284         29      121-128
285    Any VOPs larger than this are simply added to the largest bucket when they
286    are freed.  */
287
288
289 /* Return the number of operands used in bucket BUCKET.  */
290
291 static inline int
292 vop_free_bucket_size (int bucket)
293 {
294 #ifdef ENABLE_CHECKING
295   gcc_assert (bucket >= 0 && bucket < NUM_VOP_FREE_BUCKETS);
296 #endif
297   if (bucket < 16)
298     return bucket + 1;
299   return (bucket - 13) * 8;
300 }
301
302
303 /* For a vop of NUM operands, return the bucket NUM belongs to.  If NUM is 
304    beyond the end of the bucket table, return -1.  */
305
306 static inline int 
307 vop_free_bucket_index (int num)
308 {
309   gcc_assert (num > 0 && NUM_VOP_FREE_BUCKETS > 16);
310
311   /* Sizes 1 through 16 use buckets 0-15.  */
312   if (num <= 16)
313     return num - 1;
314   /* Buckets 16 - NUM_VOP_FREE_BUCKETS represent 8 unit chunks.  */
315   num = 14 + (num - 1) / 8;
316   if (num >= NUM_VOP_FREE_BUCKETS)
317     return -1;
318   else
319     return num;
320 }
321
322
323 /* Initialize the VOP free buckets.  */
324
325 static inline void
326 init_vop_buckets (void)
327 {
328   int x;
329
330   for (x = 0; x < NUM_VOP_FREE_BUCKETS; x++)
331     gimple_ssa_operands (cfun)->vop_free_buckets[x] = NULL;
332 }
333
334
335 /* Add PTR to the appropriate VOP bucket.  */
336
337 static inline void
338 add_vop_to_freelist (voptype_p ptr)
339 {
340   int bucket = vop_free_bucket_index (VUSE_VECT_NUM_ELEM (ptr->usev));
341
342   /* Too large, use the largest bucket so its not a complete throw away.  */
343   if (bucket == -1)
344     bucket = NUM_VOP_FREE_BUCKETS - 1;
345
346   ptr->next = gimple_ssa_operands (cfun)->vop_free_buckets[bucket];
347   gimple_ssa_operands (cfun)->vop_free_buckets[bucket] = ptr;
348 }
349  
350
351 /* These are the sizes of the operand memory  buffer which gets allocated each 
352    time more operands space is required.  The final value is the amount that is
353    allocated every time after that.  */
354   
355 #define OP_SIZE_INIT    0
356 #define OP_SIZE_1       30
357 #define OP_SIZE_2       110
358 #define OP_SIZE_3       511
359
360 /* Initialize the operand cache routines.  */
361
362 void
363 init_ssa_operands (void)
364 {
365   if (!n_initialized++)
366     {
367       build_defs = VEC_alloc (tree, heap, 5);
368       build_uses = VEC_alloc (tree, heap, 10);
369       build_vuses = VEC_alloc (tree, heap, 25);
370       build_vdefs = VEC_alloc (tree, heap, 25);
371       bitmap_obstack_initialize (&operands_bitmap_obstack);
372       build_loads = BITMAP_ALLOC (&operands_bitmap_obstack);
373       build_stores = BITMAP_ALLOC (&operands_bitmap_obstack);
374       scb_stack = VEC_alloc (scb_t, heap, 20);
375     }
376
377   gcc_assert (gimple_ssa_operands (cfun)->operand_memory == NULL);
378   gcc_assert (gimple_ssa_operands (cfun)->mpt_table == NULL);
379   gimple_ssa_operands (cfun)->operand_memory_index
380      = gimple_ssa_operands (cfun)->ssa_operand_mem_size;
381   gimple_ssa_operands (cfun)->ops_active = true;
382   memset (&clobber_stats, 0, sizeof (clobber_stats));
383   init_vop_buckets ();
384   gimple_ssa_operands (cfun)->ssa_operand_mem_size = OP_SIZE_INIT;
385 }
386
387
388 /* Dispose of anything required by the operand routines.  */
389
390 void
391 fini_ssa_operands (void)
392 {
393   struct ssa_operand_memory_d *ptr;
394   unsigned ix;
395   tree mpt;
396
397   if (!--n_initialized)
398     {
399       VEC_free (tree, heap, build_defs);
400       VEC_free (tree, heap, build_uses);
401       VEC_free (tree, heap, build_vdefs);
402       VEC_free (tree, heap, build_vuses);
403       BITMAP_FREE (build_loads);
404       BITMAP_FREE (build_stores);
405
406       /* The change buffer stack had better be empty.  */
407       gcc_assert (VEC_length (scb_t, scb_stack) == 0);
408       VEC_free (scb_t, heap, scb_stack);
409       scb_stack = NULL;
410     }
411
412   gimple_ssa_operands (cfun)->free_defs = NULL;
413   gimple_ssa_operands (cfun)->free_uses = NULL;
414
415   while ((ptr = gimple_ssa_operands (cfun)->operand_memory) != NULL)
416     {
417       gimple_ssa_operands (cfun)->operand_memory
418         = gimple_ssa_operands (cfun)->operand_memory->next;
419       ggc_free (ptr);
420     }
421
422   for (ix = 0;
423        VEC_iterate (tree, gimple_ssa_operands (cfun)->mpt_table, ix, mpt);
424        ix++)
425     {
426       if (mpt)
427         BITMAP_FREE (MPT_SYMBOLS (mpt));
428     }
429
430   VEC_free (tree, heap, gimple_ssa_operands (cfun)->mpt_table);
431
432   gimple_ssa_operands (cfun)->ops_active = false;
433
434   if (!n_initialized)
435     bitmap_obstack_release (&operands_bitmap_obstack);
436   if (dump_file && (dump_flags & TDF_STATS))
437     {
438       fprintf (dump_file, "Original clobbered vars:           %d\n",
439                clobber_stats.clobbered_vars);
440       fprintf (dump_file, "Static write clobbers avoided:     %d\n",
441                clobber_stats.static_write_clobbers_avoided);
442       fprintf (dump_file, "Static read clobbers avoided:      %d\n",
443                clobber_stats.static_read_clobbers_avoided);
444       fprintf (dump_file, "Unescapable clobbers avoided:      %d\n",
445                clobber_stats.unescapable_clobbers_avoided);
446       fprintf (dump_file, "Original read-only clobbers:       %d\n",
447                clobber_stats.readonly_clobbers);
448       fprintf (dump_file, "Static read-only clobbers avoided: %d\n",
449                clobber_stats.static_readonly_clobbers_avoided);
450     }
451 }
452
453
454 /* Return memory for operands of SIZE chunks.  */
455                                                                               
456 static inline void *
457 ssa_operand_alloc (unsigned size)
458 {
459   char *ptr;
460
461   if (gimple_ssa_operands (cfun)->operand_memory_index + size
462       >= gimple_ssa_operands (cfun)->ssa_operand_mem_size)
463     {
464       struct ssa_operand_memory_d *ptr;
465
466       if (gimple_ssa_operands (cfun)->ssa_operand_mem_size == OP_SIZE_INIT)
467         gimple_ssa_operands (cfun)->ssa_operand_mem_size
468            = OP_SIZE_1 * sizeof (struct voptype_d);
469       else
470         if (gimple_ssa_operands (cfun)->ssa_operand_mem_size
471             == OP_SIZE_1 * sizeof (struct voptype_d))
472           gimple_ssa_operands (cfun)->ssa_operand_mem_size
473              = OP_SIZE_2 * sizeof (struct voptype_d);
474         else
475           gimple_ssa_operands (cfun)->ssa_operand_mem_size
476              = OP_SIZE_3 * sizeof (struct voptype_d);
477
478       /* Go right to the maximum size if the request is too large.  */
479       if (size > gimple_ssa_operands (cfun)->ssa_operand_mem_size)
480         gimple_ssa_operands (cfun)->ssa_operand_mem_size
481           = OP_SIZE_3 * sizeof (struct voptype_d);
482
483       /* Fail if there is not enough space.  If there are this many operands
484          required, first make sure there isn't a different problem causing this
485          many operands.  If the decision is that this is OK, then we can 
486          specially allocate a buffer just for this request.  */
487       gcc_assert (size <= gimple_ssa_operands (cfun)->ssa_operand_mem_size);
488
489       ptr = (struct ssa_operand_memory_d *) 
490               ggc_alloc (sizeof (struct ssa_operand_memory_d) 
491                          + gimple_ssa_operands (cfun)->ssa_operand_mem_size - 1);
492       ptr->next = gimple_ssa_operands (cfun)->operand_memory;
493       gimple_ssa_operands (cfun)->operand_memory = ptr;
494       gimple_ssa_operands (cfun)->operand_memory_index = 0;
495     }
496   ptr = &(gimple_ssa_operands (cfun)->operand_memory
497           ->mem[gimple_ssa_operands (cfun)->operand_memory_index]);
498   gimple_ssa_operands (cfun)->operand_memory_index += size;
499   return ptr;
500 }
501
502
503 /* Allocate a DEF operand.  */
504
505 static inline struct def_optype_d *
506 alloc_def (void)
507 {
508   struct def_optype_d *ret;
509   if (gimple_ssa_operands (cfun)->free_defs)
510     {
511       ret = gimple_ssa_operands (cfun)->free_defs;
512       gimple_ssa_operands (cfun)->free_defs
513         = gimple_ssa_operands (cfun)->free_defs->next;
514     }
515   else
516     ret = (struct def_optype_d *)
517           ssa_operand_alloc (sizeof (struct def_optype_d));
518   return ret;
519 }
520
521
522 /* Allocate a USE operand.  */
523
524 static inline struct use_optype_d *
525 alloc_use (void)
526 {
527   struct use_optype_d *ret;
528   if (gimple_ssa_operands (cfun)->free_uses)
529     {
530       ret = gimple_ssa_operands (cfun)->free_uses;
531       gimple_ssa_operands (cfun)->free_uses
532         = gimple_ssa_operands (cfun)->free_uses->next;
533     }
534   else
535     ret = (struct use_optype_d *)
536           ssa_operand_alloc (sizeof (struct use_optype_d));
537   return ret;
538 }
539
540
541 /* Allocate a vop with NUM elements.  */
542
543 static inline struct voptype_d *
544 alloc_vop (int num)
545 {
546   struct voptype_d *ret = NULL;
547   int alloc_size = 0;
548
549   int bucket = vop_free_bucket_index (num);
550   if (bucket != -1)
551     {
552       /* If there is a free operand, use it.  */
553       if (gimple_ssa_operands (cfun)->vop_free_buckets[bucket] != NULL)
554         {
555           ret = gimple_ssa_operands (cfun)->vop_free_buckets[bucket];
556           gimple_ssa_operands (cfun)->vop_free_buckets[bucket] = 
557                   gimple_ssa_operands (cfun)->vop_free_buckets[bucket]->next;
558         }
559       else
560         alloc_size = vop_free_bucket_size(bucket);
561     }
562   else
563     alloc_size = num;
564
565   if (alloc_size > 0)
566     ret = (struct voptype_d *)ssa_operand_alloc (
567         sizeof (struct voptype_d) + (alloc_size - 1) * sizeof (vuse_element_t));
568
569   VUSE_VECT_NUM_ELEM (ret->usev) = num;
570   return ret;
571 }
572
573
574 /* This routine makes sure that PTR is in an immediate use list, and makes
575    sure the stmt pointer is set to the current stmt.  */
576
577 static inline void
578 set_virtual_use_link (use_operand_p ptr, tree stmt)
579 {
580   /*  fold_stmt may have changed the stmt pointers.  */
581   if (ptr->stmt != stmt)
582     ptr->stmt = stmt;
583
584   /* If this use isn't in a list, add it to the correct list.  */
585   if (!ptr->prev)
586     link_imm_use (ptr, *(ptr->use));
587 }
588
589
590 /* Adds OP to the list of defs after LAST.  */
591
592 static inline def_optype_p 
593 add_def_op (tree *op, def_optype_p last)
594 {
595   def_optype_p new_def;
596
597   new_def = alloc_def ();
598   DEF_OP_PTR (new_def) = op;
599   last->next = new_def;
600   new_def->next = NULL;
601   return new_def;
602 }
603
604
605 /* Adds OP to the list of uses of statement STMT after LAST.  */
606
607 static inline use_optype_p
608 add_use_op (tree stmt, tree *op, use_optype_p last)
609 {
610   use_optype_p new_use;
611
612   new_use = alloc_use ();
613   USE_OP_PTR (new_use)->use = op;
614   link_imm_use_stmt (USE_OP_PTR (new_use), *op, stmt);
615   last->next = new_use;
616   new_use->next = NULL;
617   return new_use;
618 }
619
620
621 /* Return a virtual op pointer with NUM elements which are all initialized to OP
622    and are linked into the immediate uses for STMT.  The new vop is appended
623    after PREV.  */
624
625 static inline voptype_p
626 add_vop (tree stmt, tree op, int num, voptype_p prev)
627 {
628   voptype_p new_vop;
629   int x;
630
631   new_vop = alloc_vop (num);
632   for (x = 0; x < num; x++)
633     {
634       VUSE_OP_PTR (new_vop, x)->prev = NULL;
635       SET_VUSE_OP (new_vop, x, op);
636       VUSE_OP_PTR (new_vop, x)->use = &new_vop->usev.uses[x].use_var;
637       link_imm_use_stmt (VUSE_OP_PTR (new_vop, x),
638                          new_vop->usev.uses[x].use_var, stmt);
639     }
640
641   if (prev)
642     prev->next = new_vop;
643   new_vop->next = NULL;
644   return new_vop;
645 }
646
647
648 /* Adds OP to the list of vuses of statement STMT after LAST, and moves
649    LAST to the new element.  */
650
651 static inline voptype_p
652 add_vuse_op (tree stmt, tree op, int num, voptype_p last)
653 {
654   voptype_p new_vop = add_vop (stmt, op, num, last);
655   VDEF_RESULT (new_vop) = NULL_TREE;
656   return new_vop;
657 }
658
659
660 /* Adds OP to the list of vdefs of statement STMT after LAST, and moves
661    LAST to the new element.  */
662
663 static inline voptype_p
664 add_vdef_op (tree stmt, tree op, int num, voptype_p last)
665 {
666   voptype_p new_vop = add_vop (stmt, op, num, last);
667   VDEF_RESULT (new_vop) = op;
668   return new_vop;
669 }
670   
671
672 /* 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         else if (TREE_CODE (ref) == INDIRECT_REF)
2083           {
2084             get_indirect_ref_operands (stmt, ref, flags, expr, offset,
2085                                        maxsize, false);
2086             flags |= opf_no_vops;
2087           }
2088
2089         /* Even if we found subvars above we need to ensure to see
2090            immediate uses for d in s.a[d].  In case of s.a having
2091            a subvar or we would miss it otherwise.  */
2092         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2093         
2094         if (code == COMPONENT_REF)
2095           {
2096             if (s_ann && TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1)))
2097               s_ann->has_volatile_ops = true; 
2098             get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_use);
2099           }
2100         else if (code == ARRAY_REF || code == ARRAY_RANGE_REF)
2101           {
2102             get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_use);
2103             get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_use);
2104             get_expr_operands (stmt, &TREE_OPERAND (expr, 3), opf_use);
2105           }
2106
2107         return;
2108       }
2109
2110     case WITH_SIZE_EXPR:
2111       /* WITH_SIZE_EXPR is a pass-through reference to its first argument,
2112          and an rvalue reference to its second argument.  */
2113       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_use);
2114       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2115       return;
2116
2117     case CALL_EXPR:
2118       get_call_expr_operands (stmt, expr);
2119       return;
2120
2121     case COND_EXPR:
2122     case VEC_COND_EXPR:
2123       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_use);
2124       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_use);
2125       get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_use);
2126       return;
2127
2128     case GIMPLE_MODIFY_STMT:
2129       get_modify_stmt_operands (stmt, expr);
2130       return;
2131
2132     case CONSTRUCTOR:
2133       {
2134         /* General aggregate CONSTRUCTORs have been decomposed, but they
2135            are still in use as the COMPLEX_EXPR equivalent for vectors.  */
2136         constructor_elt *ce;
2137         unsigned HOST_WIDE_INT idx;
2138
2139         for (idx = 0;
2140              VEC_iterate (constructor_elt, CONSTRUCTOR_ELTS (expr), idx, ce);
2141              idx++)
2142           get_expr_operands (stmt, &ce->value, opf_use);
2143
2144         return;
2145       }
2146
2147     case BIT_FIELD_REF:
2148     case TRUTH_NOT_EXPR:
2149     case VIEW_CONVERT_EXPR:
2150     do_unary:
2151       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2152       return;
2153
2154     case TRUTH_AND_EXPR:
2155     case TRUTH_OR_EXPR:
2156     case TRUTH_XOR_EXPR:
2157     case COMPOUND_EXPR:
2158     case OBJ_TYPE_REF:
2159     case ASSERT_EXPR:
2160     do_binary:
2161       {
2162         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2163         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
2164         return;
2165       }
2166
2167     case DOT_PROD_EXPR:
2168     case REALIGN_LOAD_EXPR:
2169       {
2170         get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
2171         get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
2172         get_expr_operands (stmt, &TREE_OPERAND (expr, 2), flags);
2173         return;
2174       }
2175
2176     case CHANGE_DYNAMIC_TYPE_EXPR:
2177       get_expr_operands (stmt, &CHANGE_DYNAMIC_TYPE_LOCATION (expr), opf_use);
2178       return;
2179
2180     case BLOCK:
2181     case FUNCTION_DECL:
2182     case EXC_PTR_EXPR:
2183     case FILTER_EXPR:
2184     case LABEL_DECL:
2185     case CONST_DECL:
2186     case OMP_PARALLEL:
2187     case OMP_SECTIONS:
2188     case OMP_FOR:
2189     case OMP_SINGLE:
2190     case OMP_MASTER:
2191     case OMP_ORDERED:
2192     case OMP_CRITICAL:
2193     case OMP_RETURN:
2194     case OMP_CONTINUE:
2195       /* Expressions that make no memory references.  */
2196       return;
2197
2198     default:
2199       if (codeclass == tcc_unary)
2200         goto do_unary;
2201       if (codeclass == tcc_binary || codeclass == tcc_comparison)
2202         goto do_binary;
2203       if (codeclass == tcc_constant || codeclass == tcc_type)
2204         return;
2205     }
2206
2207   /* If we get here, something has gone wrong.  */
2208 #ifdef ENABLE_CHECKING
2209   fprintf (stderr, "unhandled expression in get_expr_operands():\n");
2210   debug_tree (expr);
2211   fputs ("\n", stderr);
2212 #endif
2213   gcc_unreachable ();
2214 }
2215
2216
2217 /* Parse STMT looking for operands.  When finished, the various
2218    build_* operand vectors will have potential operands in them.  */
2219
2220 static void
2221 parse_ssa_operands (tree stmt)
2222 {
2223   enum tree_code code;
2224
2225   code = TREE_CODE (stmt);
2226   switch (code)
2227     {
2228     case GIMPLE_MODIFY_STMT:
2229       get_modify_stmt_operands (stmt, stmt);
2230       break;
2231
2232     case COND_EXPR:
2233       get_expr_operands (stmt, &COND_EXPR_COND (stmt), opf_use);
2234       break;
2235
2236     case SWITCH_EXPR:
2237       get_expr_operands (stmt, &SWITCH_COND (stmt), opf_use);
2238       break;
2239
2240     case ASM_EXPR:
2241       get_asm_expr_operands (stmt);
2242       break;
2243
2244     case RETURN_EXPR:
2245       get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), opf_use);
2246       break;
2247
2248     case GOTO_EXPR:
2249       get_expr_operands (stmt, &GOTO_DESTINATION (stmt), opf_use);
2250       break;
2251
2252     case LABEL_EXPR:
2253       get_expr_operands (stmt, &LABEL_EXPR_LABEL (stmt), opf_use);
2254       break;
2255
2256     case BIND_EXPR:
2257     case CASE_LABEL_EXPR:
2258     case TRY_CATCH_EXPR:
2259     case TRY_FINALLY_EXPR:
2260     case EH_FILTER_EXPR:
2261     case CATCH_EXPR:
2262     case RESX_EXPR:
2263       /* These nodes contain no variable references.  */
2264      break;
2265
2266     default:
2267       /* Notice that if get_expr_operands tries to use &STMT as the
2268          operand pointer (which may only happen for USE operands), we
2269          will fail in add_stmt_operand.  This default will handle
2270          statements like empty statements, or CALL_EXPRs that may
2271          appear on the RHS of a statement or as statements themselves.  */
2272       get_expr_operands (stmt, &stmt, opf_use);
2273       break;
2274     }
2275 }
2276
2277
2278 /* Create an operands cache for STMT.  */
2279
2280 static void
2281 build_ssa_operands (tree stmt)
2282 {
2283   stmt_ann_t ann = get_stmt_ann (stmt);
2284   
2285   /* Initially assume that the statement has no volatile operands and
2286      makes no memory references.  */
2287   ann->has_volatile_ops = false;
2288   ann->references_memory = false;
2289   /* Just clear the bitmap so we don't end up reallocating it over and over.  */
2290   if (ann->addresses_taken)
2291     bitmap_clear (ann->addresses_taken);
2292
2293   start_ssa_stmt_operands ();
2294   parse_ssa_operands (stmt);
2295   operand_build_sort_virtual (build_vuses);
2296   operand_build_sort_virtual (build_vdefs);
2297   finalize_ssa_stmt_operands (stmt);
2298
2299   if (ann->addresses_taken && bitmap_empty_p (ann->addresses_taken))
2300     ann->addresses_taken = NULL;
2301   /* For added safety, assume that statements with volatile operands
2302      also reference memory.  */
2303   if (ann->has_volatile_ops)
2304     ann->references_memory = true;
2305 }
2306
2307
2308 /* Free any operands vectors in OPS.  */
2309
2310 void 
2311 free_ssa_operands (stmt_operands_p ops)
2312 {
2313   ops->def_ops = NULL;
2314   ops->use_ops = NULL;
2315   ops->vdef_ops = NULL;
2316   ops->vuse_ops = NULL;
2317   BITMAP_FREE (ops->loads);
2318   BITMAP_FREE (ops->stores);
2319 }
2320
2321
2322 /* Get the operands of statement STMT.  */
2323
2324 void
2325 update_stmt_operands (tree stmt)
2326 {
2327   stmt_ann_t ann = get_stmt_ann (stmt);
2328
2329   /* If update_stmt_operands is called before SSA is initialized, do
2330      nothing.  */
2331   if (!ssa_operands_active ())
2332     return;
2333
2334   /* The optimizers cannot handle statements that are nothing but a
2335      _DECL.  This indicates a bug in the gimplifier.  */
2336   gcc_assert (!SSA_VAR_P (stmt));
2337
2338   timevar_push (TV_TREE_OPS);
2339
2340   gcc_assert (ann->modified);
2341   build_ssa_operands (stmt);
2342   ann->modified = 0;
2343
2344   timevar_pop (TV_TREE_OPS);
2345 }
2346
2347
2348 /* Copies virtual operands from SRC to DST.  */
2349
2350 void
2351 copy_virtual_operands (tree dest, tree src)
2352 {
2353   unsigned int i, n;
2354   voptype_p src_vuses, dest_vuses;
2355   voptype_p src_vdefs, dest_vdefs;
2356   struct voptype_d vuse;
2357   struct voptype_d vdef;
2358   stmt_ann_t dest_ann;
2359
2360   VDEF_OPS (dest) = NULL;
2361   VUSE_OPS (dest) = NULL;
2362
2363   dest_ann = get_stmt_ann (dest);
2364   BITMAP_FREE (dest_ann->operands.loads);
2365   BITMAP_FREE (dest_ann->operands.stores);
2366
2367   if (LOADED_SYMS (src))
2368     {
2369       dest_ann->operands.loads = BITMAP_ALLOC (&operands_bitmap_obstack);
2370       bitmap_copy (dest_ann->operands.loads, LOADED_SYMS (src));
2371     }
2372
2373   if (STORED_SYMS (src))
2374     {
2375       dest_ann->operands.stores = BITMAP_ALLOC (&operands_bitmap_obstack);
2376       bitmap_copy (dest_ann->operands.stores, STORED_SYMS (src));
2377     }
2378
2379   /* Copy all the VUSE operators and corresponding operands.  */
2380   dest_vuses = &vuse;
2381   for (src_vuses = VUSE_OPS (src); src_vuses; src_vuses = src_vuses->next)
2382     {
2383       n = VUSE_NUM (src_vuses);
2384       dest_vuses = add_vuse_op (dest, NULL_TREE, n, dest_vuses);
2385       for (i = 0; i < n; i++)
2386         SET_USE (VUSE_OP_PTR (dest_vuses, i), VUSE_OP (src_vuses, i));
2387
2388       if (VUSE_OPS (dest) == NULL)
2389         VUSE_OPS (dest) = vuse.next;
2390     }
2391
2392   /* Copy all the VDEF operators and corresponding operands.  */
2393   dest_vdefs = &vdef;
2394   for (src_vdefs = VDEF_OPS (src); src_vdefs; src_vdefs = src_vdefs->next)
2395     {
2396       n = VUSE_NUM (src_vdefs);
2397       dest_vdefs = add_vdef_op (dest, NULL_TREE, n, dest_vdefs);
2398       VDEF_RESULT (dest_vdefs) = VDEF_RESULT (src_vdefs);
2399       for (i = 0; i < n; i++)
2400         SET_USE (VUSE_OP_PTR (dest_vdefs, i), VUSE_OP (src_vdefs, i));
2401
2402       if (VDEF_OPS (dest) == NULL)
2403         VDEF_OPS (dest) = vdef.next;
2404     }
2405 }
2406
2407
2408 /* Specifically for use in DOM's expression analysis.  Given a store, we
2409    create an artificial stmt which looks like a load from the store, this can
2410    be used to eliminate redundant loads.  OLD_OPS are the operands from the 
2411    store stmt, and NEW_STMT is the new load which represents a load of the
2412    values stored.  */
2413
2414 void
2415 create_ssa_artificial_load_stmt (tree new_stmt, tree old_stmt)
2416 {
2417   tree op;
2418   ssa_op_iter iter;
2419   use_operand_p use_p;
2420   unsigned i;
2421
2422   get_stmt_ann (new_stmt);
2423
2424   /* Process NEW_STMT looking for operands.  */
2425   start_ssa_stmt_operands ();
2426   parse_ssa_operands (new_stmt);
2427
2428   for (i = 0; VEC_iterate (tree, build_vuses, i, op); i++)
2429     if (TREE_CODE (op) != SSA_NAME)
2430       var_ann (op)->in_vuse_list = false;
2431    
2432   for (i = 0; VEC_iterate (tree, build_vuses, i, op); i++)
2433     if (TREE_CODE (op) != SSA_NAME)
2434       var_ann (op)->in_vdef_list = false;
2435
2436   /* Remove any virtual operands that were found.  */
2437   VEC_truncate (tree, build_vdefs, 0);
2438   VEC_truncate (tree, build_vuses, 0);
2439
2440   /* For each VDEF on the original statement, we want to create a
2441      VUSE of the VDEF result operand on the new statement.  */
2442   FOR_EACH_SSA_TREE_OPERAND (op, old_stmt, iter, SSA_OP_VDEF)
2443     append_vuse (op);
2444
2445   finalize_ssa_stmt_operands (new_stmt);
2446
2447   /* All uses in this fake stmt must not be in the immediate use lists.  */
2448   FOR_EACH_SSA_USE_OPERAND (use_p, new_stmt, iter, SSA_OP_ALL_USES)
2449     delink_imm_use (use_p);
2450 }
2451
2452
2453 /* Swap operands EXP0 and EXP1 in statement STMT.  No attempt is done
2454    to test the validity of the swap operation.  */
2455
2456 void
2457 swap_tree_operands (tree stmt, tree *exp0, tree *exp1)
2458 {
2459   tree op0, op1;
2460   op0 = *exp0;
2461   op1 = *exp1;
2462
2463   /* If the operand cache is active, attempt to preserve the relative
2464      positions of these two operands in their respective immediate use
2465      lists.  */
2466   if (ssa_operands_active () && op0 != op1)
2467     {
2468       use_optype_p use0, use1, ptr;
2469       use0 = use1 = NULL;
2470
2471       /* Find the 2 operands in the cache, if they are there.  */
2472       for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
2473         if (USE_OP_PTR (ptr)->use == exp0)
2474           {
2475             use0 = ptr;
2476             break;
2477           }
2478
2479       for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
2480         if (USE_OP_PTR (ptr)->use == exp1)
2481           {
2482             use1 = ptr;
2483             break;
2484           }
2485
2486       /* If both uses don't have operand entries, there isn't much we can do
2487          at this point.  Presumably we don't need to worry about it.  */
2488       if (use0 && use1)
2489         {
2490           tree *tmp = USE_OP_PTR (use1)->use;
2491           USE_OP_PTR (use1)->use = USE_OP_PTR (use0)->use;
2492           USE_OP_PTR (use0)->use = tmp;
2493         }
2494     }
2495
2496   /* Now swap the data.  */
2497   *exp0 = op1;
2498   *exp1 = op0;
2499 }
2500
2501
2502 /* Add the base address of REF to the set *ADDRESSES_TAKEN.  If
2503    *ADDRESSES_TAKEN is NULL, a new set is created.  REF may be
2504    a single variable whose address has been taken or any other valid
2505    GIMPLE memory reference (structure reference, array, etc).  If the
2506    base address of REF is a decl that has sub-variables, also add all
2507    of its sub-variables.  */
2508
2509 void
2510 add_to_addressable_set (tree ref, bitmap *addresses_taken)
2511 {
2512   tree var;
2513   subvar_t svars;
2514
2515   gcc_assert (addresses_taken);
2516
2517   /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF
2518      as the only thing we take the address of.  If VAR is a structure,
2519      taking the address of a field means that the whole structure may
2520      be referenced using pointer arithmetic.  See PR 21407 and the
2521      ensuing mailing list discussion.  */
2522   var = get_base_address (ref);
2523   if (var && SSA_VAR_P (var))
2524     {
2525       if (*addresses_taken == NULL)
2526         *addresses_taken = BITMAP_GGC_ALLOC ();      
2527       
2528       if (var_can_have_subvars (var)
2529           && (svars = get_subvars_for_var (var)))
2530         {
2531           subvar_t sv;
2532           for (sv = svars; sv; sv = sv->next)
2533             {
2534               bitmap_set_bit (*addresses_taken, DECL_UID (sv->var));
2535               TREE_ADDRESSABLE (sv->var) = 1;
2536             }
2537         }
2538       else
2539         {
2540           bitmap_set_bit (*addresses_taken, DECL_UID (var));
2541           TREE_ADDRESSABLE (var) = 1;
2542         }
2543     }
2544 }
2545
2546
2547 /* Scan the immediate_use list for VAR making sure its linked properly.
2548    Return TRUE if there is a problem and emit an error message to F.  */
2549
2550 bool
2551 verify_imm_links (FILE *f, tree var)
2552 {
2553   use_operand_p ptr, prev, list;
2554   int count;
2555
2556   gcc_assert (TREE_CODE (var) == SSA_NAME);
2557
2558   list = &(SSA_NAME_IMM_USE_NODE (var));
2559   gcc_assert (list->use == NULL);
2560
2561   if (list->prev == NULL)
2562     {
2563       gcc_assert (list->next == NULL);
2564       return false;
2565     }
2566
2567   prev = list;
2568   count = 0;
2569   for (ptr = list->next; ptr != list; )
2570     {
2571       if (prev != ptr->prev)
2572         goto error;
2573       
2574       if (ptr->use == NULL)
2575         goto error; /* 2 roots, or SAFE guard node.  */
2576       else if (*(ptr->use) != var)
2577         goto error;
2578
2579       prev = ptr;
2580       ptr = ptr->next;
2581
2582       /* Avoid infinite loops.  50,000,000 uses probably indicates a
2583          problem.  */
2584       if (count++ > 50000000)
2585         goto error;
2586     }
2587
2588   /* Verify list in the other direction.  */
2589   prev = list;
2590   for (ptr = list->prev; ptr != list; )
2591     {
2592       if (prev != ptr->next)
2593         goto error;
2594       prev = ptr;
2595       ptr = ptr->prev;
2596       if (count-- < 0)
2597         goto error;
2598     }
2599
2600   if (count != 0)
2601     goto error;
2602
2603   return false;
2604
2605  error:
2606   if (ptr->stmt && stmt_modified_p (ptr->stmt))
2607     {
2608       fprintf (f, " STMT MODIFIED. - <%p> ", (void *)ptr->stmt);
2609       print_generic_stmt (f, ptr->stmt, TDF_SLIM);
2610     }
2611   fprintf (f, " IMM ERROR : (use_p : tree - %p:%p)", (void *)ptr, 
2612            (void *)ptr->use);
2613   print_generic_expr (f, USE_FROM_PTR (ptr), TDF_SLIM);
2614   fprintf(f, "\n");
2615   return true;
2616 }
2617
2618
2619 /* Dump all the immediate uses to FILE.  */
2620
2621 void
2622 dump_immediate_uses_for (FILE *file, tree var)
2623 {
2624   imm_use_iterator iter;
2625   use_operand_p use_p;
2626
2627   gcc_assert (var && TREE_CODE (var) == SSA_NAME);
2628
2629   print_generic_expr (file, var, TDF_SLIM);
2630   fprintf (file, " : -->");
2631   if (has_zero_uses (var))
2632     fprintf (file, " no uses.\n");
2633   else
2634     if (has_single_use (var))
2635       fprintf (file, " single use.\n");
2636     else
2637       fprintf (file, "%d uses.\n", num_imm_uses (var));
2638
2639   FOR_EACH_IMM_USE_FAST (use_p, iter, var)
2640     {
2641       if (use_p->stmt == NULL && use_p->use == NULL)
2642         fprintf (file, "***end of stmt iterator marker***\n");
2643       else
2644         if (!is_gimple_reg (USE_FROM_PTR (use_p)))
2645           print_generic_stmt (file, USE_STMT (use_p), TDF_VOPS|TDF_MEMSYMS);
2646         else
2647           print_generic_stmt (file, USE_STMT (use_p), TDF_SLIM);
2648     }
2649   fprintf(file, "\n");
2650 }
2651
2652
2653 /* Dump all the immediate uses to FILE.  */
2654
2655 void
2656 dump_immediate_uses (FILE *file)
2657 {
2658   tree var;
2659   unsigned int x;
2660
2661   fprintf (file, "Immediate_uses: \n\n");
2662   for (x = 1; x < num_ssa_names; x++)
2663     {
2664       var = ssa_name(x);
2665       if (!var)
2666         continue;
2667       dump_immediate_uses_for (file, var);
2668     }
2669 }
2670
2671
2672 /* Dump def-use edges on stderr.  */
2673
2674 void
2675 debug_immediate_uses (void)
2676 {
2677   dump_immediate_uses (stderr);
2678 }
2679
2680
2681 /* Dump def-use edges on stderr.  */
2682
2683 void
2684 debug_immediate_uses_for (tree var)
2685 {
2686   dump_immediate_uses_for (stderr, var);
2687 }
2688
2689
2690 /* Create a new change buffer for the statement pointed by STMT_P and
2691    push the buffer into SCB_STACK.  Each change buffer
2692    records state information needed to determine what changed in the
2693    statement.  Mainly, this keeps track of symbols that may need to be
2694    put into SSA form, SSA name replacements and other information
2695    needed to keep the SSA form up to date.  */
2696
2697 void
2698 push_stmt_changes (tree *stmt_p)
2699 {
2700   tree stmt;
2701   scb_t buf;
2702   
2703   stmt = *stmt_p;
2704
2705   /* It makes no sense to keep track of PHI nodes.  */
2706   if (TREE_CODE (stmt) == PHI_NODE)
2707     return;
2708
2709   buf = XNEW (struct scb_d);
2710   memset (buf, 0, sizeof *buf);
2711
2712   buf->stmt_p = stmt_p;
2713
2714   if (stmt_references_memory_p (stmt))
2715     {
2716       tree op;
2717       ssa_op_iter i;
2718
2719       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VUSE)
2720         {
2721           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2722           if (buf->loads == NULL)
2723             buf->loads = BITMAP_ALLOC (NULL);
2724           bitmap_set_bit (buf->loads, DECL_UID (sym));
2725         }
2726
2727       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VDEF)
2728         {
2729           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2730           if (buf->stores == NULL)
2731             buf->stores = BITMAP_ALLOC (NULL);
2732           bitmap_set_bit (buf->stores, DECL_UID (sym));
2733         }
2734     }
2735
2736   VEC_safe_push (scb_t, heap, scb_stack, buf);
2737 }
2738
2739
2740 /* Given two sets S1 and S2, mark the symbols that differ in S1 and S2
2741    for renaming.  The set to mark for renaming is (S1 & ~S2) | (S2 & ~S1).  */
2742
2743 static void
2744 mark_difference_for_renaming (bitmap s1, bitmap s2)
2745 {
2746   if (s1 == NULL && s2 == NULL)
2747     return;
2748
2749   if (s1 && s2 == NULL)
2750     mark_set_for_renaming (s1);
2751   else if (s1 == NULL && s2)
2752     mark_set_for_renaming (s2);
2753   else if (!bitmap_equal_p (s1, s2))
2754     {
2755       bitmap t1 = BITMAP_ALLOC (NULL);
2756       bitmap t2 = BITMAP_ALLOC (NULL);
2757
2758       bitmap_and_compl (t1, s1, s2);
2759       bitmap_and_compl (t2, s2, s1);
2760       bitmap_ior_into (t1, t2);
2761       mark_set_for_renaming (t1);
2762
2763       BITMAP_FREE (t1);
2764       BITMAP_FREE (t2);
2765     }
2766 }
2767
2768
2769 /* Pop the top SCB from SCB_STACK and act on the differences between
2770    what was recorded by push_stmt_changes and the current state of
2771    the statement.  */
2772
2773 void
2774 pop_stmt_changes (tree *stmt_p)
2775 {
2776   tree op, stmt;
2777   ssa_op_iter iter;
2778   bitmap loads, stores;
2779   scb_t buf;
2780
2781   stmt = *stmt_p;
2782
2783   /* It makes no sense to keep track of PHI nodes.  */
2784   if (TREE_CODE (stmt) == PHI_NODE)
2785     return;
2786
2787   buf = VEC_pop (scb_t, scb_stack);
2788   gcc_assert (stmt_p == buf->stmt_p);
2789
2790   /* Force an operand re-scan on the statement and mark any newly
2791      exposed variables.  */
2792   update_stmt (stmt);
2793
2794   /* Determine whether any memory symbols need to be renamed.  If the
2795      sets of loads and stores are different after the statement is
2796      modified, then the affected symbols need to be renamed.
2797      
2798      Note that it may be possible for the statement to not reference
2799      memory anymore, but we still need to act on the differences in
2800      the sets of symbols.  */
2801   loads = stores = NULL;
2802   if (stmt_references_memory_p (stmt))
2803     {
2804       tree op;
2805       ssa_op_iter i;
2806
2807       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VUSE)
2808         {
2809           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2810           if (loads == NULL)
2811             loads = BITMAP_ALLOC (NULL);
2812           bitmap_set_bit (loads, DECL_UID (sym));
2813         }
2814
2815       FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_VDEF)
2816         {
2817           tree sym = TREE_CODE (op) == SSA_NAME ? SSA_NAME_VAR (op) : op;
2818           if (stores == NULL)
2819             stores = BITMAP_ALLOC (NULL);
2820           bitmap_set_bit (stores, DECL_UID (sym));
2821         }
2822     }
2823
2824   /* If LOADS is different from BUF->LOADS, the affected
2825      symbols need to be marked for renaming.  */
2826   mark_difference_for_renaming (loads, buf->loads);
2827
2828   /* Similarly for STORES and BUF->STORES.  */
2829   mark_difference_for_renaming (stores, buf->stores);
2830
2831   /* Mark all the naked GIMPLE register operands for renaming.  */
2832   FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF|SSA_OP_USE)
2833     if (DECL_P (op))
2834       mark_sym_for_renaming (op);
2835
2836   /* FIXME, need to add more finalizers here.  Cleanup EH info,
2837      recompute invariants for address expressions, add
2838      SSA replacement mappings, etc.  For instance, given
2839      testsuite/gcc.c-torture/compile/pr16808.c, we fold a statement of
2840      the form:
2841
2842           # SMT.4_20 = VDEF <SMT.4_16>
2843           D.1576_11 = 1.0e+0;
2844
2845      So, the VDEF will disappear, but instead of marking SMT.4 for
2846      renaming it would be far more efficient to establish a
2847      replacement mapping that would replace every reference of
2848      SMT.4_20 with SMT.4_16.  */
2849
2850   /* Free memory used by the buffer.  */
2851   BITMAP_FREE (buf->loads);
2852   BITMAP_FREE (buf->stores);
2853   BITMAP_FREE (loads);
2854   BITMAP_FREE (stores);
2855   buf->stmt_p = NULL;
2856   free (buf);
2857 }
2858
2859
2860 /* Discard the topmost change buffer from SCB_STACK.  This is useful
2861    when the caller realized that it did not actually modified the
2862    statement.  It avoids the expensive operand re-scan.  */
2863
2864 void
2865 discard_stmt_changes (tree *stmt_p)
2866 {
2867   scb_t buf;
2868   tree stmt;
2869   
2870   /* It makes no sense to keep track of PHI nodes.  */
2871   stmt = *stmt_p;
2872   if (TREE_CODE (stmt) == PHI_NODE)
2873     return;
2874
2875   buf = VEC_pop (scb_t, scb_stack);
2876   gcc_assert (stmt_p == buf->stmt_p);
2877
2878   /* Free memory used by the buffer.  */
2879   BITMAP_FREE (buf->loads);
2880   BITMAP_FREE (buf->stores);
2881   buf->stmt_p = NULL;
2882   free (buf);
2883 }
2884
2885
2886 /* Returns true if statement STMT may access memory.  */
2887
2888 bool
2889 stmt_references_memory_p (tree stmt)
2890 {
2891   if (!gimple_ssa_operands (cfun)->ops_active || TREE_CODE (stmt) == PHI_NODE)
2892     return false;
2893
2894   return stmt_ann (stmt)->references_memory;
2895 }