OSDN Git Service

2007-08-17 H.J. Lu <hongjiu.lu@intel.com>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-operands.c
1 /* SSA operands management for trees.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tm.h"
24 #include "tree.h"
25 #include "flags.h"
26 #include "function.h"
27 #include "diagnostic.h"
28 #include "tree-flow.h"
29 #include "tree-inline.h"
30 #include "tree-pass.h"
31 #include "ggc.h"
32 #include "timevar.h"
33 #include "toplev.h"
34 #include "langhooks.h"
35 #include "ipa-reference.h"
36
37 /* This file contains the code required to manage the operands cache of the 
38    SSA optimizer.  For every stmt, we maintain an operand cache in the stmt 
39    annotation.  This cache contains operands that will be of interest to 
40    optimizers and other passes wishing to manipulate the IL. 
41
42    The operand type are broken up into REAL and VIRTUAL operands.  The real 
43    operands are represented as pointers into the stmt's operand tree.  Thus 
44    any manipulation of the real operands will be reflected in the actual tree.
45    Virtual operands are represented solely in the cache, although the base 
46    variable for the SSA_NAME may, or may not occur in the stmt's tree.  
47    Manipulation of the virtual operands will not be reflected in the stmt tree.
48
49    The routines in this file are concerned with creating this operand cache 
50    from a stmt tree.
51
52    The operand tree is the parsed by the various get_* routines which look 
53    through the stmt tree for the occurrence of operands which may be of 
54    interest, and calls are made to the append_* routines whenever one is 
55    found.  There are 4 of these routines, each representing one of the 
56    4 types of operands. Defs, Uses, Virtual Uses, and Virtual May Defs.
57
58    The append_* routines check for duplication, and simply keep a list of 
59    unique objects for each operand type in the build_* extendable vectors.
60
61    Once the stmt tree is completely parsed, the finalize_ssa_operands() 
62    routine is called, which proceeds to perform the finalization routine 
63    on each of the 4 operand vectors which have been built up.
64
65    If the stmt had a previous operand cache, the finalization routines 
66    attempt to match up the new operands with the old ones.  If it's a perfect 
67    match, the old vector is simply reused.  If it isn't a perfect match, then 
68    a new vector is created and the new operands are placed there.  For 
69    virtual operands, if the previous cache had SSA_NAME version of a 
70    variable, and that same variable occurs in the same operands cache, then 
71    the new cache vector will also get the same SSA_NAME.
72
73   i.e., if a stmt had a VUSE of 'a_5', and 'a' occurs in the new operand 
74   vector for VUSE, then the new vector will also be modified such that 
75   it contains 'a_5' rather than 'a'.  */
76
77
78 /* Structure storing statistics on how many call clobbers we have, and
79    how many where avoided.  */
80
81 static struct 
82 {
83   /* Number of call-clobbered ops we attempt to add to calls in
84      add_call_clobbered_mem_symbols.  */
85   unsigned int clobbered_vars;
86
87   /* Number of write-clobbers (VDEFs) avoided by using
88      not_written information.  */
89   unsigned int static_write_clobbers_avoided;
90
91   /* Number of reads (VUSEs) avoided by using not_read information.  */
92   unsigned int static_read_clobbers_avoided;
93   
94   /* Number of write-clobbers avoided because the variable can't escape to
95      this call.  */
96   unsigned int unescapable_clobbers_avoided;
97
98   /* Number of read-only uses we attempt to add to calls in
99      add_call_read_mem_symbols.  */
100   unsigned int readonly_clobbers;
101
102   /* Number of read-only uses we avoid using not_read information.  */
103   unsigned int static_readonly_clobbers_avoided;
104 } clobber_stats;
105
106
107 /* Flags to describe operand properties in helpers.  */
108
109 /* By default, operands are loaded.  */
110 #define opf_use         0
111
112 /* Operand is the target of an assignment expression or a 
113    call-clobbered variable.  */
114 #define opf_def         (1 << 0)
115
116 /* No virtual operands should be created in the expression.  This is used
117    when traversing ADDR_EXPR nodes which have different semantics than
118    other expressions.  Inside an ADDR_EXPR node, the only operands that we
119    need to consider are indices into arrays.  For instance, &a.b[i] should
120    generate a USE of 'i' but it should not generate a VUSE for 'a' nor a
121    VUSE for 'b'.  */
122 #define opf_no_vops     (1 << 1)
123
124 /* Operand is an implicit reference.  This is used to distinguish
125    explicit assignments in the form of GIMPLE_MODIFY_STMT from
126    clobbering sites like function calls or ASM_EXPRs.  */
127 #define opf_implicit    (1 << 2)
128
129 /* Array for building all the def operands.  */
130 static VEC(tree,heap) *build_defs;
131
132 /* Array for building all the use operands.  */
133 static VEC(tree,heap) *build_uses;
134
135 /* Set for building all the VDEF operands.  */
136 static VEC(tree,heap) *build_vdefs;
137
138 /* Set for building all the VUSE operands.  */
139 static VEC(tree,heap) *build_vuses;
140
141 /* Bitmap obstack for our datastructures that needs to survive across   
142    compilations of multiple functions.  */
143 static bitmap_obstack operands_bitmap_obstack;
144
145 /* Set for building all the loaded symbols.  */
146 static bitmap build_loads;
147
148 /* Set for building all the stored symbols.  */
149 static bitmap build_stores;
150
151 static void get_expr_operands (tree, tree *, int);
152
153 /* Number of functions with initialized ssa_operands.  */
154 static int n_initialized = 0;
155
156 /* Statement change buffer.  Data structure used to record state
157    information for statements.  This is used to determine what needs
158    to be done in order to update the SSA web after a statement is
159    modified by a pass.  If STMT is a statement that has just been
160    created, or needs to be folded via fold_stmt, or anything that
161    changes its physical structure then the pass should:
162
163    1- Call push_stmt_changes (&stmt) to record the current state of
164       STMT before any modifications are made.
165
166    2- Make all appropriate modifications to the statement.
167
168    3- Call pop_stmt_changes (&stmt) to find new symbols that
169       need to be put in SSA form, SSA name mappings for names that
170       have disappeared, recompute invariantness for address
171       expressions, cleanup EH information, etc.
172
173    If it is possible to determine that the statement was not modified,
174    instead of calling pop_stmt_changes it is quicker to call
175    discard_stmt_changes to avoid the expensive and unnecessary operand
176    re-scan and change comparison.  */
177
178 struct scb_d
179 {
180   /* Pointer to the statement being modified.  */
181   tree *stmt_p;
182
183   /* If the statement references memory these are the sets of symbols
184      loaded and stored by the statement.  */
185   bitmap loads;
186   bitmap stores;
187 };
188
189 typedef struct scb_d *scb_t;
190 DEF_VEC_P(scb_t);
191 DEF_VEC_ALLOC_P(scb_t,heap);
192
193 /* Stack of statement change buffers (SCB).  Every call to
194    push_stmt_changes pushes a new buffer onto the stack.  Calls to
195    pop_stmt_changes pop a buffer off of the stack and compute the set
196    of changes for the popped statement.  */
197 static VEC(scb_t,heap) *scb_stack;
198
199 /* Return the DECL_UID of the base variable of T.  */
200
201 static inline unsigned
202 get_name_decl (const_tree t)
203 {
204   if (TREE_CODE (t) != SSA_NAME)
205     return DECL_UID (t);
206   else
207     return DECL_UID (SSA_NAME_VAR (t));
208 }
209
210
211 /* Comparison function for qsort used in operand_build_sort_virtual.  */
212
213 static int
214 operand_build_cmp (const void *p, const void *q)
215 {
216   const_tree const e1 = *((const_tree const *)p);
217   const_tree const e2 = *((const_tree const *)q);
218   const unsigned int u1 = get_name_decl (e1);
219   const unsigned int u2 = get_name_decl (e2);
220
221   /* We want to sort in ascending order.  They can never be equal.  */
222 #ifdef ENABLE_CHECKING
223   gcc_assert (u1 != u2);
224 #endif
225   return (u1 > u2 ? 1 : -1);
226 }
227
228
229 /* Sort the virtual operands in LIST from lowest DECL_UID to highest.  */
230
231 static inline void
232 operand_build_sort_virtual (VEC(tree,heap) *list)
233 {
234   int num = VEC_length (tree, list);
235
236   if (num < 2)
237     return;
238
239   if (num == 2)
240     {
241       if (get_name_decl (VEC_index (tree, list, 0)) 
242           > get_name_decl (VEC_index (tree, list, 1)))
243         {  
244           /* Swap elements if in the wrong order.  */
245           tree tmp = VEC_index (tree, list, 0);
246           VEC_replace (tree, list, 0, VEC_index (tree, list, 1));
247           VEC_replace (tree, list, 1, tmp);
248         }
249       return;
250     }
251
252   /* There are 3 or more elements, call qsort.  */
253   qsort (VEC_address (tree, list), 
254          VEC_length (tree, list), 
255          sizeof (tree),
256          operand_build_cmp);
257 }
258
259
260 /*  Return true if the SSA operands cache is active.  */
261
262 bool
263 ssa_operands_active (void)
264 {
265   return cfun->gimple_df && gimple_ssa_operands (cfun)->ops_active;
266 }
267
268
269 /* VOPs are of variable sized, so the free list maps "free buckets" to the 
270    following table:  
271     bucket   # operands
272     ------   ----------
273         0       1
274         1       2
275           ...
276         15      16
277         16      17-24
278         17      25-32
279         18      31-40
280           ...
281         29      121-128
282    Any VOPs larger than this are simply added to the largest bucket when they
283    are freed.  */
284
285
286 /* Return the number of operands used in bucket BUCKET.  */
287
288 static inline int
289 vop_free_bucket_size (int bucket)
290 {
291 #ifdef ENABLE_CHECKING
292   gcc_assert (bucket >= 0 && bucket < NUM_VOP_FREE_BUCKETS);
293 #endif
294   if (bucket < 16)
295     return bucket + 1;
296   return (bucket - 13) * 8;
297 }
298
299
300 /* For a vop of NUM operands, return the bucket NUM belongs to.  If NUM is 
301    beyond the end of the bucket table, return -1.  */
302
303 static inline int 
304 vop_free_bucket_index (int num)
305 {
306   gcc_assert (num > 0 && NUM_VOP_FREE_BUCKETS > 16);
307
308   /* Sizes 1 through 16 use buckets 0-15.  */
309   if (num <= 16)
310     return num - 1;
311   /* Buckets 16 - NUM_VOP_FREE_BUCKETS represent 8 unit chunks.  */
312   num = 14 + (num - 1) / 8;
313   if (num >= NUM_VOP_FREE_BUCKETS)
314     return -1;
315   else
316     return num;
317 }
318
319
320 /* Initialize the VOP free buckets.  */
321
322 static inline void
323 init_vop_buckets (void)
324 {
325   int x;
326
327   for (x = 0; x < NUM_VOP_FREE_BUCKETS; x++)
328     gimple_ssa_operands (cfun)->vop_free_buckets[x] = NULL;
329 }
330
331
332 /* Add PTR to the appropriate VOP bucket.  */
333
334 static inline void
335 add_vop_to_freelist (voptype_p ptr)
336 {
337   int bucket = vop_free_bucket_index (VUSE_VECT_NUM_ELEM (ptr->usev));
338
339   /* Too large, use the largest bucket so its not a complete throw away.  */
340   if (bucket == -1)
341     bucket = NUM_VOP_FREE_BUCKETS - 1;
342
343   ptr->next = gimple_ssa_operands (cfun)->vop_free_buckets[bucket];
344   gimple_ssa_operands (cfun)->vop_free_buckets[bucket] = ptr;
345 }
346  
347
348 /* These are the sizes of the operand memory  buffer which gets allocated each 
349    time more operands space is required.  The final value is the amount that is
350    allocated every time after that.  */
351   
352 #define OP_SIZE_INIT    0
353 #define OP_SIZE_1       30
354 #define OP_SIZE_2       110
355 #define OP_SIZE_3       511
356
357 /* Initialize the operand cache routines.  */
358
359 void
360 init_ssa_operands (void)
361 {
362   if (!n_initialized++)
363     {
364       build_defs = VEC_alloc (tree, heap, 5);
365       build_uses = VEC_alloc (tree, heap, 10);
366       build_vuses = VEC_alloc (tree, heap, 25);
367       build_vdefs = VEC_alloc (tree, heap, 25);
368       bitmap_obstack_initialize (&operands_bitmap_obstack);
369       build_loads = BITMAP_ALLOC (&operands_bitmap_obstack);
370       build_stores = BITMAP_ALLOC (&operands_bitmap_obstack);
371       scb_stack = VEC_alloc (scb_t, heap, 20);
372     }
373
374   gcc_assert (gimple_ssa_operands (cfun)->operand_memory == NULL);
375   gcc_assert (gimple_ssa_operands (cfun)->mpt_table == NULL);
376   gimple_ssa_operands (cfun)->operand_memory_index
377      = gimple_ssa_operands (cfun)->ssa_operand_mem_size;
378   gimple_ssa_operands (cfun)->ops_active = true;
379   memset (&clobber_stats, 0, sizeof (clobber_stats));
380   init_vop_buckets ();
381   gimple_ssa_operands (cfun)->ssa_operand_mem_size = OP_SIZE_INIT;
382 }
383
384
385 /* Dispose of anything required by the operand routines.  */
386
387 void
388 fini_ssa_operands (void)
389 {
390   struct ssa_operand_memory_d *ptr;
391   unsigned ix;
392   tree mpt;
393
394   if (!--n_initialized)
395     {
396       VEC_free (tree, heap, build_defs);
397       VEC_free (tree, heap, build_uses);
398       VEC_free (tree, heap, build_vdefs);
399       VEC_free (tree, heap, build_vuses);
400       BITMAP_FREE (build_loads);
401       BITMAP_FREE (build_stores);
402
403       /* The change buffer stack had better be empty.  */
404       gcc_assert (VEC_length (scb_t, scb_stack) == 0);
405       VEC_free (scb_t, heap, scb_stack);
406       scb_stack = NULL;
407     }
408
409   gimple_ssa_operands (cfun)->free_defs = NULL;
410   gimple_ssa_operands (cfun)->free_uses = NULL;
411
412   while ((ptr = gimple_ssa_operands (cfun)->operand_memory) != NULL)
413     {
414       gimple_ssa_operands (cfun)->operand_memory
415         = gimple_ssa_operands (cfun)->operand_memory->next;
416       ggc_free (ptr);
417     }
418
419   for (ix = 0;
420        VEC_iterate (tree, gimple_ssa_operands (cfun)->mpt_table, ix, mpt);
421        ix++)
422     {
423       if (mpt)
424         BITMAP_FREE (MPT_SYMBOLS (mpt));
425     }
426
427   VEC_free (tree, heap, gimple_ssa_operands (cfun)->mpt_table);
428
429   gimple_ssa_operands (cfun)->ops_active = false;
430
431   if (!n_initialized)
432     bitmap_obstack_release (&operands_bitmap_obstack);
433   if (dump_file && (dump_flags & TDF_STATS))
434     {
435       fprintf (dump_file, "Original clobbered vars:           %d\n",
436                clobber_stats.clobbered_vars);
437       fprintf (dump_file, "Static write clobbers avoided:     %d\n",
438                clobber_stats.static_write_clobbers_avoided);
439       fprintf (dump_file, "Static read clobbers avoided:      %d\n",
440                clobber_stats.static_read_clobbers_avoided);
441       fprintf (dump_file, "Unescapable clobbers avoided:      %d\n",
442                clobber_stats.unescapable_clobbers_avoided);
443       fprintf (dump_file, "Original read-only clobbers:       %d\n",
444                clobber_stats.readonly_clobbers);
445       fprintf (dump_file, "Static read-only clobbers avoided: %d\n",
446                clobber_stats.static_readonly_clobbers_avoided);
447     }
448 }
449
450
451 /* Return memory for operands of SIZE chunks.  */
452                                                                               
453 static inline void *
454 ssa_operand_alloc (unsigned size)
455 {
456   char *ptr;
457
458   if (gimple_ssa_operands (cfun)->operand_memory_index + size
459       >= gimple_ssa_operands (cfun)->ssa_operand_mem_size)
460     {
461       struct ssa_operand_memory_d *ptr;
462
463       if (gimple_ssa_operands (cfun)->ssa_operand_mem_size == OP_SIZE_INIT)
464         gimple_ssa_operands (cfun)->ssa_operand_mem_size
465            = OP_SIZE_1 * sizeof (struct voptype_d);
466       else
467         if (gimple_ssa_operands (cfun)->ssa_operand_mem_size
468             == OP_SIZE_1 * sizeof (struct voptype_d))
469           gimple_ssa_operands (cfun)->ssa_operand_mem_size
470              = OP_SIZE_2 * sizeof (struct voptype_d);
471         else
472           gimple_ssa_operands (cfun)->ssa_operand_mem_size
473              = OP_SIZE_3 * sizeof (struct voptype_d);
474
475       /* Go right to the maximum size if the request is too large.  */
476       if (size > gimple_ssa_operands (cfun)->ssa_operand_mem_size)
477         gimple_ssa_operands (cfun)->ssa_operand_mem_size
478           = OP_SIZE_3 * sizeof (struct voptype_d);
479
480       /* Fail if there is not enough space.  If there are this many operands
481          required, first make sure there isn't a different problem causing this
482          many operands.  If the decision is that this is OK, then we can 
483          specially allocate a buffer just for this request.  */
484       gcc_assert (size <= gimple_ssa_operands (cfun)->ssa_operand_mem_size);
485
486       ptr = (struct ssa_operand_memory_d *) 
487               ggc_alloc (sizeof (struct ssa_operand_memory_d) 
488                          + gimple_ssa_operands (cfun)->ssa_operand_mem_size - 1);
489       ptr->next = gimple_ssa_operands (cfun)->operand_memory;
490       gimple_ssa_operands (cfun)->operand_memory = ptr;
491       gimple_ssa_operands (cfun)->operand_memory_index = 0;
492     }
493   ptr = &(gimple_ssa_operands (cfun)->operand_memory
494           ->mem[gimple_ssa_operands (cfun)->operand_memory_index]);
495   gimple_ssa_operands (cfun)->operand_memory_index += size;
496   return ptr;
497 }
498
499
500 /* Allocate a DEF operand.  */
501
502 static inline struct def_optype_d *
503 alloc_def (void)
504 {
505   struct def_optype_d *ret;
506   if (gimple_ssa_operands (cfun)->free_defs)
507     {
508       ret = gimple_ssa_operands (cfun)->free_defs;
509       gimple_ssa_operands (cfun)->free_defs
510         = gimple_ssa_operands (cfun)->free_defs->next;
511     }
512   else
513     ret = (struct def_optype_d *)
514           ssa_operand_alloc (sizeof (struct def_optype_d));
515   return ret;
516 }
517
518
519 /* Allocate a USE operand.  */
520
521 static inline struct use_optype_d *
522 alloc_use (void)
523 {
524   struct use_optype_d *ret;
525   if (gimple_ssa_operands (cfun)->free_uses)
526     {
527       ret = gimple_ssa_operands (cfun)->free_uses;
528       gimple_ssa_operands (cfun)->free_uses
529         = gimple_ssa_operands (cfun)->free_uses->next;
530     }
531   else
532     ret = (struct use_optype_d *)
533           ssa_operand_alloc (sizeof (struct use_optype_d));
534   return ret;
535 }
536
537
538 /* Allocate a vop with NUM elements.  */
539
540 static inline struct voptype_d *
541 alloc_vop (int num)
542 {
543   struct voptype_d *ret = NULL;
544   int alloc_size = 0;
545
546   int bucket = vop_free_bucket_index (num);
547   if (bucket != -1)
548     {
549       /* If there is a free operand, use it.  */
550       if (gimple_ssa_operands (cfun)->vop_free_buckets[bucket] != NULL)
551         {
552           ret = gimple_ssa_operands (cfun)->vop_free_buckets[bucket];
553           gimple_ssa_operands (cfun)->vop_free_buckets[bucket] = 
554                   gimple_ssa_operands (cfun)->vop_free_buckets[bucket]->next;
555         }
556       else
557         alloc_size = vop_free_bucket_size(bucket);
558     }
559   else
560     alloc_size = num;
561
562   if (alloc_size > 0)
563     ret = (struct voptype_d *)ssa_operand_alloc (
564         sizeof (struct voptype_d) + (alloc_size - 1) * sizeof (vuse_element_t));
565
566   VUSE_VECT_NUM_ELEM (ret->usev) = num;
567   return ret;
568 }
569
570
571 /* This routine makes sure that PTR is in an immediate use list, and makes
572    sure the stmt pointer is set to the current stmt.  */
573
574 static inline void
575 set_virtual_use_link (use_operand_p ptr, tree stmt)
576 {
577   /*  fold_stmt may have changed the stmt pointers.  */
578   if (ptr->stmt != stmt)
579     ptr->stmt = stmt;
580
581   /* If this use isn't in a list, add it to the correct list.  */
582   if (!ptr->prev)
583     link_imm_use (ptr, *(ptr->use));
584 }
585
586
587 /* Adds OP to the list of defs after LAST.  */
588
589 static inline def_optype_p 
590 add_def_op (tree *op, def_optype_p last)
591 {
592   def_optype_p new_def;
593
594   new_def = alloc_def ();
595   DEF_OP_PTR (new_def) = op;
596   last->next = new_def;
597   new_def->next = NULL;
598   return new_def;
599 }
600
601
602 /* Adds OP to the list of uses of statement STMT after LAST.  */
603
604 static inline use_optype_p
605 add_use_op (tree stmt, tree *op, use_optype_p last)
606 {
607   use_optype_p new_use;
608
609   new_use = alloc_use ();
610   USE_OP_PTR (new_use)->use = op;
611   link_imm_use_stmt (USE_OP_PTR (new_use), *op, stmt);
612   last->next = new_use;
613   new_use->next = NULL;
614   return new_use;
615 }
616
617
618 /* Return a virtual op pointer with NUM elements which are all initialized to OP
619    and are linked into the immediate uses for STMT.  The new vop is appended
620    after PREV.  */
621
622 static inline voptype_p
623 add_vop (tree stmt, tree op, int num, voptype_p prev)
624 {
625   voptype_p new_vop;
626   int x;
627
628   new_vop = alloc_vop (num);
629   for (x = 0; x < num; x++)
630     {
631       VUSE_OP_PTR (new_vop, x)->prev = NULL;
632       SET_VUSE_OP (new_vop, x, op);
633       VUSE_OP_PTR (new_vop, x)->use = &new_vop->usev.uses[x].use_var;
634       link_imm_use_stmt (VUSE_OP_PTR (new_vop, x),
635                          new_vop->usev.uses[x].use_var, stmt);
636     }
637
638   if (prev)
639     prev->next = new_vop;
640   new_vop->next = NULL;
641   return new_vop;
642 }
643
644
645 /* Adds OP to the list of vuses of statement STMT after LAST, and moves
646    LAST to the new element.  */
647
648 static inline voptype_p
649 add_vuse_op (tree stmt, tree op, int num, voptype_p last)
650 {
651   voptype_p new_vop = add_vop (stmt, op, num, last);
652   VDEF_RESULT (new_vop) = NULL_TREE;
653   return new_vop;
654 }
655
656
657 /* Adds OP to the list of vdefs of statement STMT after LAST, and moves
658    LAST to the new element.  */
659
660 static inline voptype_p
661 add_vdef_op (tree stmt, tree op, int num, voptype_p last)
662 {
663   voptype_p new_vop = add_vop (stmt, op, num, last);
664   VDEF_RESULT (new_vop) = op;
665   return new_vop;
666 }
667   
668
669 /* Takes elements from build_defs and turns them into def operands of STMT.
670    TODO -- Make build_defs VEC of tree *.  */
671
672 static inline void
673 finalize_ssa_defs (tree stmt)
674 {
675   unsigned new_i;
676   struct def_optype_d new_list;
677   def_optype_p old_ops, last;
678   unsigned int num = VEC_length (tree, build_defs);
679
680   /* There should only be a single real definition per assignment.  */
681   gcc_assert ((stmt && TREE_CODE (stmt) != GIMPLE_MODIFY_STMT) || num <= 1);
682
683   new_list.next = NULL;
684   last = &new_list;
685
686   old_ops = DEF_OPS (stmt);
687
688   new_i = 0;
689
690   /* Check for the common case of 1 def that hasn't changed.  */
691   if (old_ops && old_ops->next == NULL && num == 1
692       && (tree *) VEC_index (tree, build_defs, 0) == DEF_OP_PTR (old_ops))
693     return;
694
695   /* If there is anything in the old list, free it.  */
696   if (old_ops)
697     {
698       old_ops->next = gimple_ssa_operands (cfun)->free_defs;
699       gimple_ssa_operands (cfun)->free_defs = old_ops;
700     }
701
702   /* If there is anything remaining in the build_defs list, simply emit it.  */
703   for ( ; new_i < num; new_i++)
704     last = add_def_op ((tree *) VEC_index (tree, build_defs, new_i), last);
705
706   /* Now set the stmt's operands.  */
707   DEF_OPS (stmt) = new_list.next;
708
709 #ifdef ENABLE_CHECKING
710   {
711     def_optype_p ptr;
712     unsigned x = 0;
713     for (ptr = DEF_OPS (stmt); ptr; ptr = ptr->next)
714       x++;
715
716     gcc_assert (x == num);
717   }
718 #endif
719 }
720
721
722 /* Takes elements from build_uses and turns them into use operands of STMT.
723    TODO -- Make build_uses VEC of tree *.  */
724
725 static inline void
726 finalize_ssa_uses (tree stmt)
727 {
728   unsigned new_i;
729   struct use_optype_d new_list;
730   use_optype_p old_ops, ptr, last;
731
732 #ifdef ENABLE_CHECKING
733   {
734     unsigned x;
735     unsigned num = VEC_length (tree, build_uses);
736
737     /* If the pointer to the operand is the statement itself, something is
738        wrong.  It means that we are pointing to a local variable (the 
739        initial call to update_stmt_operands does not pass a pointer to a 
740        statement).  */
741     for (x = 0; x < num; x++)
742       gcc_assert (*((tree *)VEC_index (tree, build_uses, x)) != stmt);
743   }
744 #endif
745
746   new_list.next = NULL;
747   last = &new_list;
748
749   old_ops = USE_OPS (stmt);
750
751   /* If there is anything in the old list, free it.  */
752   if (old_ops)
753     {
754       for (ptr = old_ops; ptr; ptr = ptr->next)
755         delink_imm_use (USE_OP_PTR (ptr));
756       old_ops->next = gimple_ssa_operands (cfun)->free_uses;
757       gimple_ssa_operands (cfun)->free_uses = old_ops;
758     }
759
760   /* Now create nodes for all the new nodes.  */
761   for (new_i = 0; new_i < VEC_length (tree, build_uses); new_i++)
762     last = add_use_op (stmt, 
763                        (tree *) VEC_index (tree, build_uses, new_i), 
764                        last);
765
766   /* Now set the stmt's operands.  */
767   USE_OPS (stmt) = new_list.next;
768
769 #ifdef ENABLE_CHECKING
770   {
771     unsigned x = 0;
772     for (ptr = USE_OPS (stmt); ptr; ptr = ptr->next)
773       x++;
774
775     gcc_assert (x == VEC_length (tree, build_uses));
776   }
777 #endif
778 }
779
780
781 /* Takes elements from BUILD_VDEFS and turns them into vdef operands of
782    STMT.  FIXME, for now VDEF operators should have a single operand
783    in their RHS.  */
784
785 static inline void
786 finalize_ssa_vdefs (tree stmt)
787 {
788   unsigned new_i;
789   struct voptype_d new_list;
790   voptype_p old_ops, ptr, last;
791   stmt_ann_t ann = stmt_ann (stmt);
792
793   /* Set the symbols referenced by STMT.  */
794   if (!bitmap_empty_p (build_stores))
795     {
796       if (ann->operands.stores == NULL)
797         ann->operands.stores = BITMAP_ALLOC (&operands_bitmap_obstack);
798
799       bitmap_copy (ann->operands.stores, build_stores);
800     }
801   else
802     BITMAP_FREE (ann->operands.stores);
803
804   /* If aliases have not been computed, do not instantiate a virtual
805      operator on STMT.  Initially, we only compute the SSA form on
806      GIMPLE registers.  The virtual SSA form is only computed after
807      alias analysis, so virtual operators will remain unrenamed and
808      the verifier will complain.  However, alias analysis needs to
809      access symbol load/store information, so we need to compute
810      those.  */
811   if (!gimple_aliases_computed_p (cfun))
812     return;
813
814   new_list.next = NULL;
815   last = &new_list;
816
817   old_ops = VDEF_OPS (stmt);
818   new_i = 0;
819   while (old_ops && new_i < VEC_length (tree, build_vdefs))
820     {
821       tree op = VEC_index (tree, build_vdefs, new_i);
822       unsigned new_uid = get_name_decl (op);
823       unsigned old_uid = get_name_decl (VDEF_RESULT (old_ops));
824
825       /* FIXME, for now each VDEF operator should have at most one
826          operand in their RHS.  */
827       gcc_assert (VDEF_NUM (old_ops) == 1);
828
829       if (old_uid == new_uid)
830         {
831           /* If the symbols are the same, reuse the existing operand.  */
832           last->next = old_ops;
833           last = old_ops;
834           old_ops = old_ops->next;
835           last->next = NULL;
836           set_virtual_use_link (VDEF_OP_PTR (last, 0), stmt);
837           new_i++;
838         }
839       else if (old_uid < new_uid)
840         {
841           /* If old is less than new, old goes to the free list.  */
842           voptype_p next;
843           delink_imm_use (VDEF_OP_PTR (old_ops, 0));
844           next = old_ops->next;
845           add_vop_to_freelist (old_ops);
846           old_ops = next;
847         }
848       else
849         {
850           /* This is a new operand.  */
851           last = add_vdef_op (stmt, op, 1, last);
852           new_i++;
853         }
854     }
855
856   /* If there is anything remaining in BUILD_VDEFS, simply emit it.  */
857   for ( ; new_i < VEC_length (tree, build_vdefs); new_i++)
858     last = add_vdef_op (stmt, VEC_index (tree, build_vdefs, new_i), 1, last);
859
860   /* If there is anything in the old list, free it.  */
861   if (old_ops)
862     {
863       for (ptr = old_ops; ptr; ptr = last)
864         {
865           last = ptr->next;
866           delink_imm_use (VDEF_OP_PTR (ptr, 0));
867           add_vop_to_freelist (ptr);
868         }
869     }
870
871   /* Now set STMT's operands.  */
872   VDEF_OPS (stmt) = new_list.next;
873
874 #ifdef ENABLE_CHECKING
875   {
876     unsigned x = 0;
877     for (ptr = VDEF_OPS (stmt); ptr; ptr = ptr->next)
878       x++;
879
880     gcc_assert (x == VEC_length (tree, build_vdefs));
881   }
882 #endif
883 }
884
885
886 /* Takes elements from BUILD_VUSES and turns them into VUSE operands of
887    STMT.  */
888
889 static inline void
890 finalize_ssa_vuse_ops (tree stmt)
891 {
892   unsigned new_i, old_i;
893   voptype_p old_ops, last;
894   VEC(tree,heap) *new_ops;
895   stmt_ann_t ann;
896
897   /* Set the symbols referenced by STMT.  */
898   ann = stmt_ann (stmt);
899   if (!bitmap_empty_p (build_loads))
900     {
901       if (ann->operands.loads == NULL)
902         ann->operands.loads = BITMAP_ALLOC (&operands_bitmap_obstack);
903
904       bitmap_copy (ann->operands.loads, build_loads);
905     }
906   else
907     BITMAP_FREE (ann->operands.loads);
908
909   /* If aliases have not been computed, do not instantiate a virtual
910      operator on STMT.  Initially, we only compute the SSA form on
911      GIMPLE registers.  The virtual SSA form is only computed after
912      alias analysis, so virtual operators will remain unrenamed and
913      the verifier will complain.  However, alias analysis needs to
914      access symbol load/store information, so we need to compute
915      those.  */
916   if (!gimple_aliases_computed_p (cfun))
917     return;
918
919   /* STMT should have at most one VUSE operator.  */
920   old_ops = VUSE_OPS (stmt);
921   gcc_assert (old_ops == NULL || old_ops->next == NULL);
922
923   new_ops = NULL;
924   new_i = old_i = 0;
925   while (old_ops
926          && old_i < VUSE_NUM (old_ops)
927          && new_i < VEC_length (tree, build_vuses))
928     {
929       tree new_op = VEC_index (tree, build_vuses, new_i);
930       tree old_op = VUSE_OP (old_ops, old_i);
931       unsigned new_uid = get_name_decl (new_op);
932       unsigned old_uid = get_name_decl (old_op);
933
934       if (old_uid == new_uid)
935         {
936           /* If the symbols are the same, reuse the existing operand.  */
937           VEC_safe_push (tree, heap, new_ops, old_op);
938           new_i++;
939           old_i++;
940         }
941       else if (old_uid < new_uid)
942         {
943           /* If OLD_UID is less than NEW_UID, the old operand has
944              disappeared, skip to the next old operand.  */
945           old_i++;
946         }
947       else
948         {
949           /* This is a new operand.  */
950           VEC_safe_push (tree, heap, new_ops, new_op);
951           new_i++;
952         }
953     }
954
955   /* If there is anything remaining in the build_vuses list, simply emit it.  */
956   for ( ; new_i < VEC_length (tree, build_vuses); new_i++)
957     VEC_safe_push (tree, heap, new_ops, VEC_index (tree, build_vuses, new_i));
958
959   /* If there is anything in the old list, free it.  */
960   if (old_ops)
961     {
962       for (old_i = 0; old_i < VUSE_NUM (old_ops); old_i++)
963         delink_imm_use (VUSE_OP_PTR (old_ops, old_i));
964       add_vop_to_freelist (old_ops);
965       VUSE_OPS (stmt) = NULL;
966     }
967
968   /* If there are any operands, instantiate a VUSE operator for STMT.  */
969   if (new_ops)
970     {
971       tree op;
972       unsigned i;
973
974       last = add_vuse_op (stmt, NULL, VEC_length (tree, new_ops), NULL);
975
976       for (i = 0; VEC_iterate (tree, new_ops, i, op); i++)
977         SET_USE (VUSE_OP_PTR (last, (int) i), op);
978
979       VUSE_OPS (stmt) = last;
980       VEC_free (tree, heap, new_ops);
981     }
982
983 #ifdef ENABLE_CHECKING
984   {
985     unsigned x;
986     
987     if (VUSE_OPS (stmt))
988       {
989         gcc_assert (VUSE_OPS (stmt)->next == NULL);
990         x = VUSE_NUM (VUSE_OPS (stmt));
991       }
992     else
993       x = 0;
994
995     gcc_assert (x == VEC_length (tree, build_vuses));
996   }
997 #endif
998 }
999
1000 /* Return a new VUSE operand vector for STMT.  */
1001                                                                               
1002 static void
1003 finalize_ssa_vuses (tree stmt)
1004 {
1005   unsigned num, num_vdefs;
1006   unsigned vuse_index;
1007
1008   /* Remove superfluous VUSE operands.  If the statement already has a
1009      VDEF operator for a variable 'a', then a VUSE for 'a' is not
1010      needed because VDEFs imply a VUSE of the variable.  For instance,
1011      suppose that variable 'a' is pointed-to by p and q:
1012
1013               # VUSE <a_2>
1014               # a_3 = VDEF <a_2>
1015               *p = *q;
1016
1017      The VUSE <a_2> is superfluous because it is implied by the
1018      VDEF operator.  */
1019   num = VEC_length (tree, build_vuses);
1020   num_vdefs = VEC_length (tree, build_vdefs);
1021
1022   if (num > 0 && num_vdefs > 0)
1023     for (vuse_index = 0; vuse_index < VEC_length (tree, build_vuses); )
1024       {
1025         tree vuse;
1026         vuse = VEC_index (tree, build_vuses, vuse_index);
1027         if (TREE_CODE (vuse) != SSA_NAME)
1028           {
1029             var_ann_t ann = var_ann (vuse);
1030             ann->in_vuse_list = 0;
1031             if (ann->in_vdef_list)
1032               {
1033                 VEC_ordered_remove (tree, build_vuses, vuse_index);
1034                 continue;
1035               }
1036           }
1037         vuse_index++;
1038       }
1039
1040   finalize_ssa_vuse_ops (stmt);
1041 }
1042
1043
1044 /* Clear the in_list bits and empty the build array for VDEFs and
1045    VUSEs.  */
1046
1047 static inline void
1048 cleanup_build_arrays (void)
1049 {
1050   unsigned i;
1051   tree t;
1052
1053   for (i = 0; VEC_iterate (tree, build_vdefs, i, t); i++)
1054     if (TREE_CODE (t) != SSA_NAME)
1055       var_ann (t)->in_vdef_list = false;
1056
1057   for (i = 0; VEC_iterate (tree, build_vuses, i, t); i++)
1058     if (TREE_CODE (t) != SSA_NAME)
1059       var_ann (t)->in_vuse_list = false;
1060
1061   VEC_truncate (tree, build_vdefs, 0);
1062   VEC_truncate (tree, build_vuses, 0);
1063   VEC_truncate (tree, build_defs, 0);
1064   VEC_truncate (tree, build_uses, 0);
1065   bitmap_clear (build_loads);
1066   bitmap_clear (build_stores);
1067 }
1068
1069
1070 /* Finalize all the build vectors, fill the new ones into INFO.  */
1071                                                                               
1072 static inline void
1073 finalize_ssa_stmt_operands (tree stmt)
1074 {
1075   finalize_ssa_defs (stmt);
1076   finalize_ssa_uses (stmt);
1077   finalize_ssa_vdefs (stmt);
1078   finalize_ssa_vuses (stmt);
1079   cleanup_build_arrays ();
1080 }
1081
1082
1083 /* Start the process of building up operands vectors in INFO.  */
1084
1085 static inline void
1086 start_ssa_stmt_operands (void)
1087 {
1088   gcc_assert (VEC_length (tree, build_defs) == 0);
1089   gcc_assert (VEC_length (tree, build_uses) == 0);
1090   gcc_assert (VEC_length (tree, build_vuses) == 0);
1091   gcc_assert (VEC_length (tree, build_vdefs) == 0);
1092   gcc_assert (bitmap_empty_p (build_loads));
1093   gcc_assert (bitmap_empty_p (build_stores));
1094 }
1095
1096
1097 /* Add DEF_P to the list of pointers to operands.  */
1098
1099 static inline void
1100 append_def (tree *def_p)
1101 {
1102   VEC_safe_push (tree, heap, build_defs, (tree) def_p);
1103 }
1104
1105
1106 /* Add USE_P to the list of pointers to operands.  */
1107
1108 static inline void
1109 append_use (tree *use_p)
1110 {
1111   VEC_safe_push (tree, heap, build_uses, (tree) use_p);
1112 }
1113
1114
1115 /* Add VAR to the set of variables that require a VDEF operator.  */
1116
1117 static inline void
1118 append_vdef (tree var)
1119 {
1120   tree sym;
1121
1122   if (TREE_CODE (var) != SSA_NAME)
1123     {
1124       tree mpt;
1125       var_ann_t ann;
1126
1127       /* If VAR belongs to a memory partition, use it instead of VAR.  */
1128       mpt = memory_partition (var);
1129       if (mpt)
1130         var = mpt;
1131
1132       /* Don't allow duplicate entries.  */
1133       ann = get_var_ann (var);
1134       if (ann->in_vdef_list)
1135         return;
1136
1137       ann->in_vdef_list = true;
1138       sym = var;
1139     }
1140   else
1141     sym = SSA_NAME_VAR (var);
1142
1143   VEC_safe_push (tree, heap, build_vdefs, var);
1144   bitmap_set_bit (build_stores, DECL_UID (sym));
1145 }
1146
1147
1148 /* Add VAR to the set of variables that require a VUSE operator.  */
1149
1150 static inline void
1151 append_vuse (tree var)
1152 {
1153   tree sym;
1154
1155   if (TREE_CODE (var) != SSA_NAME)
1156     {
1157       tree mpt;
1158       var_ann_t ann;
1159
1160       /* If VAR belongs to a memory partition, use it instead of VAR.  */
1161       mpt = memory_partition (var);
1162       if (mpt)
1163         var = mpt;
1164
1165       /* Don't allow duplicate entries.  */
1166       ann = get_var_ann (var);
1167       if (ann->in_vuse_list || ann->in_vdef_list)
1168         return;
1169
1170       ann->in_vuse_list = true;
1171       sym = var;
1172     }
1173   else
1174     sym = SSA_NAME_VAR (var);
1175
1176   VEC_safe_push (tree, heap, build_vuses, var);
1177   bitmap_set_bit (build_loads, DECL_UID (sym));
1178 }
1179
1180
1181 /* REF is a tree that contains the entire pointer dereference
1182    expression, if available, or NULL otherwise.  ALIAS is the variable
1183    we are asking if REF can access.  OFFSET and SIZE come from the
1184    memory access expression that generated this virtual operand.  */
1185
1186 static bool
1187 access_can_touch_variable (tree ref, tree alias, HOST_WIDE_INT offset,
1188                            HOST_WIDE_INT size)
1189 {
1190   bool offsetgtz = offset > 0;
1191   unsigned HOST_WIDE_INT uoffset = (unsigned HOST_WIDE_INT) offset;
1192   tree base = ref ? get_base_address (ref) : NULL;
1193
1194   /* If ALIAS is .GLOBAL_VAR then the memory reference REF must be
1195      using a call-clobbered memory tag.  By definition, call-clobbered
1196      memory tags can always touch .GLOBAL_VAR.  */
1197   if (alias == gimple_global_var (cfun))
1198     return true;
1199
1200   /* If ALIAS is an SFT, it can't be touched if the offset     
1201      and size of the access is not overlapping with the SFT offset and
1202      size.  This is only true if we are accessing through a pointer
1203      to a type that is the same as SFT_PARENT_VAR.  Otherwise, we may
1204      be accessing through a pointer to some substruct of the
1205      structure, and if we try to prune there, we will have the wrong
1206      offset, and get the wrong answer.
1207      i.e., we can't prune without more work if we have something like
1208
1209      struct gcc_target
1210      {
1211        struct asm_out
1212        {
1213          const char *byte_op;
1214          struct asm_int_op
1215          {    
1216            const char *hi;
1217          } aligned_op;
1218        } asm_out;
1219      } targetm;
1220      
1221      foo = &targetm.asm_out.aligned_op;
1222      return foo->hi;
1223
1224      SFT.1, which represents hi, will have SFT_OFFSET=32 because in
1225      terms of SFT_PARENT_VAR, that is where it is.
1226      However, the access through the foo pointer will be at offset 0.  */
1227   if (size != -1
1228       && TREE_CODE (alias) == STRUCT_FIELD_TAG
1229       && base
1230       && TREE_TYPE (base) == TREE_TYPE (SFT_PARENT_VAR (alias))
1231       && !overlap_subvar (offset, size, alias, NULL))
1232     {
1233 #ifdef ACCESS_DEBUGGING
1234       fprintf (stderr, "Access to ");
1235       print_generic_expr (stderr, ref, 0);
1236       fprintf (stderr, " may not touch ");
1237       print_generic_expr (stderr, alias, 0);
1238       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1239 #endif
1240       return false;
1241     }
1242
1243   /* Without strict aliasing, it is impossible for a component access
1244      through a pointer to touch a random variable, unless that
1245      variable *is* a structure or a pointer.
1246
1247      That is, given p->c, and some random global variable b,
1248      there is no legal way that p->c could be an access to b.
1249      
1250      Without strict aliasing on, we consider it legal to do something
1251      like:
1252
1253      struct foos { int l; };
1254      int foo;
1255      static struct foos *getfoo(void);
1256      int main (void)
1257      {
1258        struct foos *f = getfoo();
1259        f->l = 1;
1260        foo = 2;
1261        if (f->l == 1)
1262          abort();
1263        exit(0);
1264      }
1265      static struct foos *getfoo(void)     
1266      { return (struct foos *)&foo; }
1267      
1268      (taken from 20000623-1.c)
1269
1270      The docs also say/imply that access through union pointers
1271      is legal (but *not* if you take the address of the union member,
1272      i.e. the inverse), such that you can do
1273
1274      typedef union {
1275        int d;
1276      } U;
1277
1278      int rv;
1279      void breakme()
1280      {
1281        U *rv0;
1282        U *pretmp = (U*)&rv;
1283        rv0 = pretmp;
1284        rv0->d = 42;    
1285      }
1286      To implement this, we just punt on accesses through union
1287      pointers entirely.
1288   */
1289   else if (ref 
1290            && flag_strict_aliasing
1291            && TREE_CODE (ref) != INDIRECT_REF
1292            && !MTAG_P (alias)
1293            && (TREE_CODE (base) != INDIRECT_REF
1294                || TREE_CODE (TREE_TYPE (base)) != UNION_TYPE)
1295            && !AGGREGATE_TYPE_P (TREE_TYPE (alias))
1296            && TREE_CODE (TREE_TYPE (alias)) != COMPLEX_TYPE
1297            && !var_ann (alias)->is_heapvar
1298            /* When the struct has may_alias attached to it, we need not to
1299               return true.  */
1300            && get_alias_set (base))
1301     {
1302 #ifdef ACCESS_DEBUGGING
1303       fprintf (stderr, "Access to ");
1304       print_generic_expr (stderr, ref, 0);
1305       fprintf (stderr, " may not touch ");
1306       print_generic_expr (stderr, alias, 0);
1307       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1308 #endif
1309       return false;
1310     }
1311
1312   /* If the offset of the access is greater than the size of one of
1313      the possible aliases, it can't be touching that alias, because it
1314      would be past the end of the structure.  */
1315   else if (ref
1316            && flag_strict_aliasing
1317            && TREE_CODE (ref) != INDIRECT_REF
1318            && !MTAG_P (alias)
1319            && !POINTER_TYPE_P (TREE_TYPE (alias))
1320            && offsetgtz
1321            && DECL_SIZE (alias)
1322            && TREE_CODE (DECL_SIZE (alias)) == INTEGER_CST
1323            && uoffset > TREE_INT_CST_LOW (DECL_SIZE (alias)))
1324     {
1325 #ifdef ACCESS_DEBUGGING
1326       fprintf (stderr, "Access to ");
1327       print_generic_expr (stderr, ref, 0);
1328       fprintf (stderr, " may not touch ");
1329       print_generic_expr (stderr, alias, 0);
1330       fprintf (stderr, " in function %s\n", get_name (current_function_decl));
1331 #endif
1332       return false;
1333     }      
1334
1335   return true;
1336 }
1337
1338
1339 /* Add VAR to the virtual operands array.  FLAGS is as in
1340    get_expr_operands.  FULL_REF is a tree that contains the entire
1341    pointer dereference expression, if available, or NULL otherwise.
1342    OFFSET and SIZE come from the memory access expression that
1343    generated this virtual operand.  IS_CALL_SITE is true if the
1344    affected statement is a call site.  */
1345
1346 static void 
1347 add_virtual_operand (tree var, stmt_ann_t s_ann, int flags,
1348                      tree full_ref, HOST_WIDE_INT offset,
1349                      HOST_WIDE_INT size, bool is_call_site)
1350 {
1351   bitmap aliases = NULL;
1352   tree sym;
1353   var_ann_t v_ann;
1354   
1355   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1356   v_ann = var_ann (sym);
1357   
1358   /* Mark the statement as having memory operands.  */
1359   s_ann->references_memory = true;
1360
1361   /* Mark statements with volatile operands.  Optimizers should back
1362      off from statements having volatile operands.  */
1363   if (TREE_THIS_VOLATILE (sym) && s_ann)
1364     s_ann->has_volatile_ops = true;
1365
1366   /* If the variable cannot be modified and this is a VDEF change
1367      it into a VUSE.  This happens when read-only variables are marked
1368      call-clobbered and/or aliased to writable variables.  So we only
1369      check that this only happens on non-specific stores.
1370
1371      Note that if this is a specific store, i.e. associated with a
1372      GIMPLE_MODIFY_STMT, then we can't suppress the VDEF, lest we run
1373      into validation problems.
1374
1375      This can happen when programs cast away const, leaving us with a
1376      store to read-only memory.  If the statement is actually executed
1377      at runtime, then the program is ill formed.  If the statement is
1378      not executed then all is well.  At the very least, we cannot ICE.  */
1379   if ((flags & opf_implicit) && unmodifiable_var_p (var))
1380     flags &= ~opf_def;
1381   
1382   /* The variable is not a GIMPLE register.  Add it (or its aliases) to
1383      virtual operands, unless the caller has specifically requested
1384      not to add virtual operands (used when adding operands inside an
1385      ADDR_EXPR expression).  */
1386   if (flags & opf_no_vops)
1387     return;
1388   
1389   if (MTAG_P (var))
1390     aliases = MTAG_ALIASES (var);
1391
1392   if (aliases == NULL)
1393     {
1394       if (s_ann && !gimple_aliases_computed_p (cfun))
1395         s_ann->has_volatile_ops = true;
1396
1397       /* The variable is not aliased or it is an alias tag.  */
1398       if (flags & opf_def)
1399         append_vdef (var);
1400       else
1401         append_vuse (var);
1402     }
1403   else
1404     {
1405       bitmap_iterator bi;
1406       unsigned int i;
1407       tree al;
1408       
1409       /* The variable is aliased.  Add its aliases to the virtual
1410          operands.  */
1411       gcc_assert (!bitmap_empty_p (aliases));
1412       
1413       if (flags & opf_def)
1414         {
1415           bool none_added = true;
1416           EXECUTE_IF_SET_IN_BITMAP (aliases, 0, i, bi)
1417             {
1418               al = referenced_var (i);
1419               if (!access_can_touch_variable (full_ref, al, offset, size))
1420                 continue;
1421
1422               /* Call-clobbered tags may have non-call-clobbered
1423                  symbols in their alias sets.  Ignore them if we are
1424                  adding VOPs for a call site.  */
1425               if (is_call_site && !is_call_clobbered (al))
1426                 continue;
1427
1428               none_added = false;
1429               append_vdef (al);
1430             }
1431
1432           /* If the variable is also an alias tag, add a virtual
1433              operand for it, otherwise we will miss representing
1434              references to the members of the variable's alias set.          
1435              This fixes the bug in gcc.c-torture/execute/20020503-1.c.
1436              
1437              It is also necessary to add bare defs on clobbers for
1438              SMT's, so that bare SMT uses caused by pruning all the
1439              aliases will link up properly with calls.   In order to
1440              keep the number of these bare defs we add down to the
1441              minimum necessary, we keep track of which SMT's were used
1442              alone in statement vdefs or VUSEs.  */
1443           if (none_added
1444               || (TREE_CODE (var) == SYMBOL_MEMORY_TAG
1445                   && is_call_site))
1446             {
1447               append_vdef (var);
1448             }
1449         }
1450       else
1451         {
1452           bool none_added = true;
1453           EXECUTE_IF_SET_IN_BITMAP (aliases, 0, i, bi)
1454             {
1455               al = referenced_var (i);
1456               if (!access_can_touch_variable (full_ref, al, offset, size))
1457                 continue;
1458
1459               /* Call-clobbered tags may have non-call-clobbered
1460                  symbols in their alias sets.  Ignore them if we are
1461                  adding VOPs for a call site.  */
1462               if (is_call_site && !is_call_clobbered (al))
1463                 continue;
1464
1465               none_added = false;
1466               append_vuse (al);
1467             }
1468           
1469           /* Even if no aliases have been added, we still need to
1470              establish def-use and use-def chains, lest
1471              transformations think that this is not a memory
1472              reference.  For an example of this scenario, see
1473              testsuite/g++.dg/opt/cleanup1.C.  */
1474           if (none_added)
1475             append_vuse (var);
1476         }
1477     }
1478 }
1479
1480
1481 /* Add *VAR_P to the appropriate operand array for S_ANN.  FLAGS is as in
1482    get_expr_operands.  If *VAR_P is a GIMPLE register, it will be added to
1483    the statement's real operands, otherwise it is added to virtual
1484    operands.  */
1485
1486 static void
1487 add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
1488 {
1489   tree var, sym;
1490   var_ann_t v_ann;
1491
1492   gcc_assert (SSA_VAR_P (*var_p) && s_ann);
1493
1494   var = *var_p;
1495   sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
1496   v_ann = var_ann (sym);
1497
1498   /* Mark statements with volatile operands.  */
1499   if (TREE_THIS_VOLATILE (sym))
1500     s_ann->has_volatile_ops = true;
1501
1502   if (is_gimple_reg (sym))
1503     {
1504       /* The variable is a GIMPLE register.  Add it to real operands.  */
1505       if (flags & opf_def)
1506         append_def (var_p);
1507       else
1508         append_use (var_p);
1509     }
1510   else
1511     add_virtual_operand (var, s_ann, flags, NULL_TREE, 0, -1, false);
1512 }
1513
1514
1515 /* A subroutine of get_expr_operands to handle INDIRECT_REF,
1516    ALIGN_INDIRECT_REF and MISALIGNED_INDIRECT_REF.  
1517
1518    STMT is the statement being processed, EXPR is the INDIRECT_REF
1519       that got us here.
1520    
1521    FLAGS is as in get_expr_operands.
1522
1523    FULL_REF contains the full pointer dereference expression, if we
1524       have it, or NULL otherwise.
1525
1526    OFFSET and SIZE are the location of the access inside the
1527       dereferenced pointer, if known.
1528
1529    RECURSE_ON_BASE should be set to true if we want to continue
1530       calling get_expr_operands on the base pointer, and false if
1531       something else will do it for us.  */
1532
1533 static void
1534 get_indirect_ref_operands (tree stmt, tree expr, int flags,
1535                            tree full_ref,
1536                            HOST_WIDE_INT offset, HOST_WIDE_INT size,
1537                            bool recurse_on_base)
1538 {
1539   tree *pptr = &TREE_OPERAND (expr, 0);
1540   tree ptr = *pptr;
1541   stmt_ann_t s_ann = stmt_ann (stmt);
1542
1543   s_ann->references_memory = true;
1544   if (s_ann && TREE_THIS_VOLATILE (expr))
1545     s_ann->has_volatile_ops = true; 
1546
1547   if (SSA_VAR_P (ptr))
1548     {
1549       struct ptr_info_def *pi = NULL;
1550
1551       /* If PTR has flow-sensitive points-to information, use it.  */
1552       if (TREE_CODE (ptr) == SSA_NAME
1553           && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
1554           && pi->name_mem_tag)
1555         {
1556           /* PTR has its own memory tag.  Use it.  */
1557           add_virtual_operand (pi->name_mem_tag, s_ann, flags,
1558                                full_ref, offset, size, false);
1559         }
1560       else
1561         {
1562           /* If PTR is not an SSA_NAME or it doesn't have a name
1563              tag, use its symbol memory tag.  */
1564           var_ann_t v_ann;
1565
1566           /* If we are emitting debugging dumps, display a warning if
1567              PTR is an SSA_NAME with no flow-sensitive alias
1568              information.  That means that we may need to compute
1569              aliasing again.  */
1570           if (dump_file
1571               && TREE_CODE (ptr) == SSA_NAME
1572               && pi == NULL)
1573             {
1574               fprintf (dump_file,
1575                   "NOTE: no flow-sensitive alias info for ");
1576               print_generic_expr (dump_file, ptr, dump_flags);
1577               fprintf (dump_file, " in ");
1578               print_generic_stmt (dump_file, stmt, dump_flags);
1579             }
1580
1581           if (TREE_CODE (ptr) == SSA_NAME)
1582             ptr = SSA_NAME_VAR (ptr);
1583           v_ann = var_ann (ptr);
1584
1585           if (v_ann->symbol_mem_tag)
1586             add_virtual_operand (v_ann->symbol_mem_tag, s_ann, flags,
1587                                  full_ref, offset, size, false);
1588
1589           /* Aliasing information is missing; mark statement as
1590              volatile so we won't optimize it out too actively.  */
1591           else if (s_ann
1592                    && !gimple_aliases_computed_p (cfun)
1593                    && (flags & opf_def))
1594             s_ann->has_volatile_ops = true;
1595         }
1596     }
1597   else if (TREE_CODE (ptr) == INTEGER_CST)
1598     {
1599       /* If a constant is used as a pointer, we can't generate a real
1600          operand for it but we mark the statement volatile to prevent
1601          optimizations from messing things up.  */
1602       if (s_ann)
1603         s_ann->has_volatile_ops = true;
1604       return;
1605     }
1606   else
1607     {
1608       /* Ok, this isn't even is_gimple_min_invariant.  Something's broke.  */
1609       gcc_unreachable ();
1610     }
1611
1612   /* If requested, add a USE operand for the base pointer.  */
1613   if (recurse_on_base)
1614     get_expr_operands (stmt, pptr, opf_use);
1615 }
1616
1617
1618 /* A subroutine of get_expr_operands to handle TARGET_MEM_REF.  */
1619
1620 static void
1621 get_tmr_operands (tree stmt, tree expr, int flags)
1622 {
1623   tree tag, ref;
1624   HOST_WIDE_INT offset, size, maxsize;
1625   subvar_t svars, sv;
1626   stmt_ann_t s_ann = stmt_ann (stmt);
1627
1628   /* This statement references memory.  */
1629   s_ann->references_memory = 1;
1630
1631   /* First record the real operands.  */
1632   get_expr_operands (stmt, &TMR_BASE (expr), opf_use);
1633   get_expr_operands (stmt, &TMR_INDEX (expr), opf_use);
1634
1635   if (TMR_SYMBOL (expr))
1636     add_to_addressable_set (TMR_SYMBOL (expr), &s_ann->addresses_taken);
1637
1638   tag = TMR_TAG (expr);
1639   if (!tag)
1640     {
1641       /* Something weird, so ensure that we will be careful.  */
1642       s_ann->has_volatile_ops = true;
1643       return;
1644     }
1645
1646   if (DECL_P (tag))
1647     {
1648       get_expr_operands (stmt, &tag, flags);
1649       return;
1650     }
1651
1652   ref = get_ref_base_and_extent (tag, &offset, &size, &maxsize);
1653   gcc_assert (ref != NULL_TREE);
1654   svars = get_subvars_for_var (ref);
1655   for (sv = svars; sv; sv = sv->next)
1656     {
1657       bool exact;               
1658
1659       if (overlap_subvar (offset, maxsize, sv->var, &exact))
1660         add_stmt_operand (&sv->var, s_ann, flags);
1661     }
1662 }
1663
1664
1665 /* Add clobbering definitions for .GLOBAL_VAR or for each of the call
1666    clobbered variables in the function.  */
1667
1668 static void
1669 add_call_clobber_ops (tree stmt, tree callee)
1670 {
1671   unsigned u;
1672   bitmap_iterator bi;
1673   stmt_ann_t s_ann = stmt_ann (stmt);
1674   bitmap not_read_b, not_written_b;
1675   
1676   /* Functions that are not const, pure or never return may clobber
1677      call-clobbered variables.  */
1678   if (s_ann)
1679     s_ann->makes_clobbering_call = true;
1680
1681   /* If we created .GLOBAL_VAR earlier, just use it.  */
1682   if (gimple_global_var (cfun))
1683     {
1684       tree var = gimple_global_var (cfun);
1685       add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1, true);
1686       return;
1687     }
1688
1689   /* Get info for local and module level statics.  There is a bit
1690      set for each static if the call being processed does not read
1691      or write that variable.  */
1692   not_read_b = callee ? ipa_reference_get_not_read_global (callee) : NULL; 
1693   not_written_b = callee ? ipa_reference_get_not_written_global (callee) : NULL; 
1694
1695   /* Add a VDEF operand for every call clobbered variable.  */
1696   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, u, bi)
1697     {
1698       tree var = referenced_var_lookup (u);
1699       unsigned int escape_mask = var_ann (var)->escape_mask;
1700       tree real_var = var;
1701       bool not_read;
1702       bool not_written;
1703       
1704       /* Not read and not written are computed on regular vars, not
1705          subvars, so look at the parent var if this is an SFT. */
1706       if (TREE_CODE (var) == STRUCT_FIELD_TAG)
1707         real_var = SFT_PARENT_VAR (var);
1708
1709       not_read = not_read_b
1710                  ? bitmap_bit_p (not_read_b, DECL_UID (real_var))
1711                  : false;
1712
1713       not_written = not_written_b
1714                     ? bitmap_bit_p (not_written_b, DECL_UID (real_var))
1715                     : false;
1716       gcc_assert (!unmodifiable_var_p (var));
1717       
1718       clobber_stats.clobbered_vars++;
1719
1720       /* See if this variable is really clobbered by this function.  */
1721
1722       /* Trivial case: Things escaping only to pure/const are not
1723          clobbered by non-pure-const, and only read by pure/const. */
1724       if ((escape_mask & ~(ESCAPE_TO_PURE_CONST)) == 0)
1725         {
1726           tree call = get_call_expr_in (stmt);
1727           if (call_expr_flags (call) & (ECF_CONST | ECF_PURE))
1728             {
1729               add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1730               clobber_stats.unescapable_clobbers_avoided++;
1731               continue;
1732             }
1733           else
1734             {
1735               clobber_stats.unescapable_clobbers_avoided++;
1736               continue;
1737             }
1738         }
1739             
1740       if (not_written)
1741         {
1742           clobber_stats.static_write_clobbers_avoided++;
1743           if (!not_read)
1744             add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1745           else
1746             clobber_stats.static_read_clobbers_avoided++;
1747         }
1748       else
1749         add_virtual_operand (var, s_ann, opf_def, NULL, 0, -1, true);
1750     }
1751 }
1752
1753
1754 /* Add VUSE operands for .GLOBAL_VAR or all call clobbered variables in the
1755    function.  */
1756
1757 static void
1758 add_call_read_ops (tree stmt, tree callee)
1759 {
1760   unsigned u;
1761   bitmap_iterator bi;
1762   stmt_ann_t s_ann = stmt_ann (stmt);
1763   bitmap not_read_b;
1764
1765   /* if the function is not pure, it may reference memory.  Add
1766      a VUSE for .GLOBAL_VAR if it has been created.  See add_referenced_var
1767      for the heuristic used to decide whether to create .GLOBAL_VAR.  */
1768   if (gimple_global_var (cfun))
1769     {
1770       tree var = gimple_global_var (cfun);
1771       add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1772       return;
1773     }
1774   
1775   not_read_b = callee ? ipa_reference_get_not_read_global (callee) : NULL; 
1776
1777   /* Add a VUSE for each call-clobbered variable.  */
1778   EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, u, bi)
1779     {
1780       tree var = referenced_var (u);
1781       tree real_var = var;
1782       bool not_read;
1783       
1784       clobber_stats.readonly_clobbers++;
1785
1786       /* Not read and not written are computed on regular vars, not
1787          subvars, so look at the parent var if this is an SFT. */
1788
1789       if (TREE_CODE (var) == STRUCT_FIELD_TAG)
1790         real_var = SFT_PARENT_VAR (var);
1791
1792       not_read = not_read_b ? bitmap_bit_p (not_read_b, DECL_UID (real_var))
1793                             : false;
1794       
1795       if (not_read)
1796         {
1797           clobber_stats.static_readonly_clobbers_avoided++;
1798           continue;
1799         }
1800             
1801       add_virtual_operand (var, s_ann, opf_use, NULL, 0, -1, true);
1802     }
1803 }
1804
1805
1806 /* A subroutine of get_expr_operands to handle CALL_EXPR.  */
1807
1808 static void
1809 get_call_expr_operands (tree stmt, tree expr)
1810 {
1811   int call_flags = call_expr_flags (expr);
1812   int i, nargs;
1813   stmt_ann_t ann = stmt_ann (stmt);
1814
1815   ann->references_memory = true;
1816
1817   /* If aliases have been computed already, add VDEF or VUSE
1818      operands for all the symbols that have been found to be
1819      call-clobbered.  */
1820   if (gimple_aliases_computed_p (cfun)
1821       && !(call_flags & ECF_NOVOPS))
1822     {
1823       /* A 'pure' or a 'const' function never call-clobbers anything. 
1824          A 'noreturn' function might, but since we don't return anyway 
1825          there is no point in recording that.  */ 
1826       if (TREE_SIDE_EFFECTS (expr)
1827           && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
1828         add_call_clobber_ops (stmt, get_callee_fndecl (expr));
1829       else if (!(call_flags & ECF_CONST))
1830         add_call_read_ops (stmt, get_callee_fndecl (expr));
1831     }
1832
1833   /* Find uses in the called function.  */
1834   get_expr_operands (stmt, &CALL_EXPR_FN (expr), opf_use);
1835   nargs = call_expr_nargs (expr);
1836   for (i = 0; i < nargs; i++)
1837     get_expr_operands (stmt, &CALL_EXPR_ARG (expr, i), opf_use);
1838
1839   get_expr_operands (stmt, &CALL_EXPR_STATIC_CHAIN (expr), opf_use);
1840 }
1841
1842
1843 /* Scan operands in the ASM_EXPR stmt referred to in INFO.  */
1844
1845 static void
1846 get_asm_expr_operands (tree stmt)
1847 {
1848   stmt_ann_t s_ann;
1849   int i, noutputs;
1850   const char **oconstraints;
1851   const char *constraint;
1852   bool allows_mem, allows_reg, is_inout;
1853   tree link;
1854
1855   s_ann = stmt_ann (stmt);
1856   noutputs = list_length (ASM_OUTPUTS (stmt));
1857   oconstraints = (const char **) alloca ((noutputs) * sizeof (const char *));
1858
1859   /* Gather all output operands.  */
1860   for (i = 0, link = ASM_OUTPUTS (stmt); link; i++, link = TREE_CHAIN (link))
1861     {
1862       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1863       oconstraints[i] = constraint;
1864       parse_output_constraint (&constraint, i, 0, 0, &allows_mem,
1865                                &allows_reg, &is_inout);
1866
1867       /* This should have been split in gimplify_asm_expr.  */
1868       gcc_assert (!allows_reg || !is_inout);
1869
1870       /* Memory operands are addressable.  Note that STMT needs the
1871          address of this operand.  */
1872       if (!allows_reg && allows_mem)
1873         {
1874           tree t = get_base_address (TREE_VALUE (link));
1875           if (t && DECL_P (t) && s_ann)
1876             add_to_addressable_set (t, &s_ann->addresses_taken);
1877         }
1878
1879       get_expr_operands (stmt, &TREE_VALUE (link), opf_def);
1880     }
1881
1882   /* Gather all input operands.  */
1883   for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
1884     {
1885       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
1886       parse_input_constraint (&constraint, 0, 0, noutputs, 0, oconstraints,
1887                               &allows_mem, &allows_reg);
1888
1889       /* Memory operands are addressable.  Note that STMT needs the
1890          address of this operand.  */
1891       if (!allows_reg && allows_mem)
1892         {
1893           tree t = get_base_address (TREE_VALUE (link));
1894           if (t && DECL_P (t) && s_ann)
1895             add_to_addressable_set (t, &s_ann->addresses_taken);
1896         }
1897
1898       get_expr_operands (stmt, &TREE_VALUE (link), 0);
1899     }
1900
1901   /* Clobber all memory and addressable symbols for asm ("" : : : "memory");  */
1902   for (link = ASM_CLOBBERS (stmt); link; link = TREE_CHAIN (link))
1903     if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
1904       {
1905         unsigned i;
1906         bitmap_iterator bi;
1907
1908         s_ann->references_memory = true;
1909
1910         EXECUTE_IF_SET_IN_BITMAP (gimple_call_clobbered_vars (cfun), 0, i, bi)
1911           {
1912             tree var = referenced_var (i);
1913             add_stmt_operand (&var, s_ann, opf_def | opf_implicit);
1914           }
1915
1916         EXECUTE_IF_SET_IN_BITMAP (gimple_addressable_vars (cfun), 0, i, bi)
1917           {
1918             tree var = referenced_var (i);
1919
1920             /* Subvars are explicitly represented in this list, so we
1921                don't need the original to be added to the clobber ops,
1922                but the original *will* be in this list because we keep
1923                the addressability of the original variable up-to-date
1924                to avoid confusing the back-end.  */
1925             if (var_can_have_subvars (var)
1926                 && get_subvars_for_var (var) != NULL)
1927               continue;         
1928
1929             add_stmt_operand (&var, s_ann, opf_def | opf_implicit);
1930           }
1931         break;
1932       }
1933 }
1934
1935
1936 /* Scan operands for the assignment expression EXPR in statement STMT.  */
1937
1938 static void
1939 get_modify_stmt_operands (tree stmt, tree expr)
1940 {
1941   /* First get operands from the RHS.  */
1942   get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (expr, 1), opf_use);
1943
1944   /* For the LHS, use a regular definition (opf_def) for GIMPLE
1945      registers.  If the LHS is a store to memory, we will need
1946      a preserving definition (VDEF).
1947
1948      Preserving definitions are those that modify a part of an
1949      aggregate object for which no subvars have been computed (or the
1950      reference does not correspond exactly to one of them). Stores
1951      through a pointer are also represented with VDEF operators.
1952
1953      We used to distinguish between preserving and killing definitions.
1954      We always emit preserving definitions now.  */
1955   get_expr_operands (stmt, &GIMPLE_STMT_OPERAND (expr, 0), opf_def);
1956 }
1957
1958
1959 /* Recursively scan the expression pointed to by EXPR_P in statement
1960    STMT.  FLAGS is one of the OPF_* constants modifying how to
1961    interpret the operands found.  */
1962
1963 static void
1964 get_expr_operands (tree stmt, tree *expr_p, int flags)
1965 {
1966   enum tree_code code;
1967   enum tree_code_class codeclass;
1968   tree expr = *expr_p;
1969   stmt_ann_t s_ann = stmt_ann (stmt);
1970
1971   if (expr == NULL)
1972     return;
1973
1974   code = TREE_CODE (expr);
1975   codeclass = TREE_CODE_CLASS (code);
1976
1977   switch (code)
1978     {
1979     case ADDR_EXPR:
1980       /* Taking the address of a variable does not represent a
1981          reference to it, but the fact that the statement takes its
1982          address will be of interest to some passes (e.g. alias
1983          resolution).  */
1984       add_to_addressable_set (TREE_OPERAND (expr, 0), &s_ann->addresses_taken);
1985
1986       /* If the address is invariant, there may be no interesting
1987          variable references inside.  */
1988       if (is_gimple_min_invariant (expr))
1989         return;
1990
1991       /* Otherwise, there may be variables referenced inside but there
1992          should be no VUSEs created, since the referenced objects are
1993          not really accessed.  The only operands that we should find
1994          here are ARRAY_REF indices which will always be real operands
1995          (GIMPLE does not allow non-registers as array indices).  */
1996       flags |= opf_no_vops;
1997       get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
1998       return;
1999
2000     case SSA_NAME:
2001     case STRUCT_FIELD_TAG:
2002     case SYMBOL_MEMORY_TAG:
2003     case NAME_MEMORY_TAG:
2004      add_stmt_operand (expr_p, s_ann, flags);
2005      return;
2006
2007     case VAR_DECL:
2008     case PARM_DECL:
2009     case RESULT_DECL:
2010       {
2011         subvar_t svars;
2012         
2013         /* Add the subvars for a variable, if it has subvars, to DEFS
2014            or USES.  Otherwise, add the variable itself.  Whether it
2015            goes to USES or DEFS depends on the operand flags.  */
2016         if (var_can_have_subvars (expr)
2017             && (svars = get_subvars_for_var (expr)))
2018           {
2019             subvar_t sv;
2020             for (sv = svars; sv; sv = sv->next)
2021               add_stmt_operand (&sv->var, s_ann, flags);
2022           }
2023         else
2024           add_stmt_operand (expr_p, s_ann, flags);
2025
2026         return;
2027       }
2028
2029     case MISALIGNED_INDIRECT_REF:
2030       get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
2031       /* fall through */
2032
2033     case ALIGN_INDIRECT_REF:
2034     case INDIRECT_REF:
2035       get_indirect_ref_operands (stmt, expr, flags, NULL_TREE, 0, -1, true);
2036       return;
2037
2038     case TARGET_MEM_REF:
2039       get_tmr_operands (stmt, expr, flags);
2040       return;
2041
2042     case ARRAY_REF:
2043     case ARRAY_RANGE_REF:
2044     case COMPONENT_REF:
2045     case REALPART_EXPR:
2046     case IMAGPART_EXPR:
2047       {
2048         tree ref;
2049         HOST_WIDE_INT offset, size, maxsize;
2050         bool none = true;
2051
2052         /* This component reference becomes an access to all of the
2053            subvariables it can touch, if we can determine that, but
2054            *NOT* the real one.  If we can't determine which fields we
2055            could touch, the recursion will eventually get to a
2056            variable and add *all* of its subvars, or whatever is the
2057            minimum correct subset.  */
2058         ref = get_ref_base_and_extent (expr, &offset, &size, &maxsize);
2059         if (SSA_VAR_P (ref) && get_subvars_for_var (ref))
2060           {
2061             subvar_t sv;
2062             subvar_t svars = get_subvars_for_var (ref);
2063
2064             for (sv = svars; sv; sv = sv->next)
2065               {
2066                 bool exact;             
2067
2068                 if (overlap_subvar (offset, maxsize, sv->var, &exact))
2069                   {
2070                     int subvar_flags = flags;
2071                     none = false;
2072                     add_stmt_operand (&sv->var, s_ann, subvar_flags);
2073                   }
2074               }
2075
2076             if (!none)
2077               flags |= opf_no_vops;
2078
2079             if (TREE_THIS_VOLATILE (expr))
2080               get_stmt_ann (stmt)->has_volatile_ops = true;
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 }