00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "config.h"
00022 #include "system.h"
00023 #include "coretypes.h"
00024 #include "tm.h"
00025 #include "tree.h"
00026 #include "flags.h"
00027 #include "function.h"
00028 #include "diagnostic.h"
00029 #include "errors.h"
00030 #include "tree-flow.h"
00031 #include "tree-inline.h"
00032 #include "tree-pass.h"
00033 #include "ggc.h"
00034 #include "timevar.h"
00035
00036 #include "langhooks.h"
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 #define opf_none 0
00088
00089
00090
00091 #define opf_is_def (1 << 0)
00092
00093
00094 #define opf_kill_def (1 << 1)
00095
00096
00097
00098
00099
00100
00101
00102 #define opf_no_vops (1 << 2)
00103
00104
00105 static GTY (()) varray_type build_defs;
00106
00107
00108 static GTY (()) varray_type build_uses;
00109
00110
00111 static GTY (()) varray_type build_v_may_defs;
00112
00113
00114 static GTY (()) varray_type build_vuses;
00115
00116
00117 static GTY (()) varray_type build_v_must_defs;
00118
00119
00120 bool ssa_call_clobbered_cache_valid;
00121 bool ssa_ro_call_cache_valid;
00122
00123
00124 static GTY (()) varray_type clobbered_v_may_defs;
00125 static GTY (()) varray_type clobbered_vuses;
00126 static GTY (()) varray_type ro_call_vuses;
00127 static bool clobbered_aliased_loads;
00128 static bool clobbered_aliased_stores;
00129 static bool ro_call_aliased_loads;
00130
00131 #ifdef ENABLE_CHECKING
00132
00133 tree check_build_stmt;
00134 #endif
00135
00136 def_operand_p NULL_DEF_OPERAND_P = { NULL };
00137 use_operand_p NULL_USE_OPERAND_P = { NULL };
00138
00139 static void note_addressable (tree, stmt_ann_t);
00140 static void get_expr_operands (tree, tree *, int);
00141 static void get_asm_expr_operands (tree);
00142 static void get_indirect_ref_operands (tree, tree, int);
00143 static void get_call_expr_operands (tree, tree);
00144 static inline void append_def (tree *);
00145 static inline void append_use (tree *);
00146 static void append_v_may_def (tree);
00147 static void append_v_must_def (tree);
00148 static void add_call_clobber_ops (tree);
00149 static void add_call_read_ops (tree);
00150 static void add_stmt_operand (tree *, stmt_ann_t, int);
00151
00152
00153
00154 static inline def_optype
00155 allocate_def_optype (unsigned num)
00156 {
00157 def_optype def_ops;
00158 unsigned size;
00159 size = sizeof (struct def_optype_d) + sizeof (tree *) * (num - 1);
00160 def_ops = ggc_alloc (size);
00161 def_ops->num_defs = num;
00162 return def_ops;
00163 }
00164
00165
00166
00167
00168 static inline use_optype
00169 allocate_use_optype (unsigned num)
00170 {
00171 use_optype use_ops;
00172 unsigned size;
00173 size = sizeof (struct use_optype_d) + sizeof (tree *) * (num - 1);
00174 use_ops = ggc_alloc (size);
00175 use_ops->num_uses = num;
00176 return use_ops;
00177 }
00178
00179
00180
00181
00182 static inline v_may_def_optype
00183 allocate_v_may_def_optype (unsigned num)
00184 {
00185 v_may_def_optype v_may_def_ops;
00186 unsigned size;
00187 size = sizeof (struct v_may_def_optype_d)
00188 + sizeof (v_def_use_operand_type_t) * (num - 1);
00189 v_may_def_ops = ggc_alloc (size);
00190 v_may_def_ops->num_v_may_defs = num;
00191 return v_may_def_ops;
00192 }
00193
00194
00195
00196
00197 static inline vuse_optype
00198 allocate_vuse_optype (unsigned num)
00199 {
00200 vuse_optype vuse_ops;
00201 unsigned size;
00202 size = sizeof (struct vuse_optype_d) + sizeof (tree) * (num - 1);
00203 vuse_ops = ggc_alloc (size);
00204 vuse_ops->num_vuses = num;
00205 return vuse_ops;
00206 }
00207
00208
00209
00210
00211 static inline v_must_def_optype
00212 allocate_v_must_def_optype (unsigned num)
00213 {
00214 v_must_def_optype v_must_def_ops;
00215 unsigned size;
00216 size = sizeof (struct v_must_def_optype_d) + sizeof (v_def_use_operand_type_t) * (num - 1);
00217 v_must_def_ops = ggc_alloc (size);
00218 v_must_def_ops->num_v_must_defs = num;
00219 return v_must_def_ops;
00220 }
00221
00222
00223
00224
00225 static inline void
00226 free_uses (use_optype *uses)
00227 {
00228 if (*uses)
00229 {
00230 ggc_free (*uses);
00231 *uses = NULL;
00232 }
00233 }
00234
00235
00236
00237
00238 static inline void
00239 free_defs (def_optype *defs)
00240 {
00241 if (*defs)
00242 {
00243 ggc_free (*defs);
00244 *defs = NULL;
00245 }
00246 }
00247
00248
00249
00250
00251 static inline void
00252 free_vuses (vuse_optype *vuses)
00253 {
00254 if (*vuses)
00255 {
00256 ggc_free (*vuses);
00257 *vuses = NULL;
00258 }
00259 }
00260
00261
00262
00263
00264 static inline void
00265 free_v_may_defs (v_may_def_optype *v_may_defs)
00266 {
00267 if (*v_may_defs)
00268 {
00269 ggc_free (*v_may_defs);
00270 *v_may_defs = NULL;
00271 }
00272 }
00273
00274
00275
00276
00277 static inline void
00278 free_v_must_defs (v_must_def_optype *v_must_defs)
00279 {
00280 if (*v_must_defs)
00281 {
00282 ggc_free (*v_must_defs);
00283 *v_must_defs = NULL;
00284 }
00285 }
00286
00287
00288
00289
00290 void
00291 init_ssa_operands (void)
00292 {
00293 VARRAY_TREE_PTR_INIT (build_defs, 5, "build defs");
00294 VARRAY_TREE_PTR_INIT (build_uses, 10, "build uses");
00295 VARRAY_TREE_INIT (build_v_may_defs, 10, "build v_may_defs");
00296 VARRAY_TREE_INIT (build_vuses, 10, "build vuses");
00297 VARRAY_TREE_INIT (build_v_must_defs, 10, "build v_must_defs");
00298 }
00299
00300
00301
00302
00303 void
00304 fini_ssa_operands (void)
00305 {
00306 ggc_free (build_defs);
00307 ggc_free (build_uses);
00308 ggc_free (build_v_may_defs);
00309 ggc_free (build_vuses);
00310 ggc_free (build_v_must_defs);
00311 build_defs = NULL;
00312 build_uses = NULL;
00313 build_v_may_defs = NULL;
00314 build_vuses = NULL;
00315 build_v_must_defs = NULL;
00316 if (clobbered_v_may_defs)
00317 {
00318 ggc_free (clobbered_v_may_defs);
00319 ggc_free (clobbered_vuses);
00320 clobbered_v_may_defs = NULL;
00321 clobbered_vuses = NULL;
00322 }
00323 if (ro_call_vuses)
00324 {
00325 ggc_free (ro_call_vuses);
00326 ro_call_vuses = NULL;
00327 }
00328 }
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339 static def_optype
00340 finalize_ssa_defs (def_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED)
00341 {
00342 unsigned num, x;
00343 def_optype def_ops, old_ops;
00344 bool build_diff;
00345
00346 num = VARRAY_ACTIVE_SIZE (build_defs);
00347 if (num == 0)
00348 return NULL;
00349
00350
00351 gcc_assert (TREE_CODE (stmt) != MODIFY_EXPR || num <= 1);
00352
00353 old_ops = *old_ops_p;
00354
00355
00356 build_diff = true;
00357 if (old_ops && old_ops->num_defs == num)
00358 {
00359 build_diff = false;
00360 for (x = 0; x < num; x++)
00361 if (old_ops->defs[x].def != VARRAY_TREE_PTR (build_defs, x))
00362 {
00363 build_diff = true;
00364 break;
00365 }
00366 }
00367
00368 if (!build_diff)
00369 {
00370 def_ops = old_ops;
00371 *old_ops_p = NULL;
00372 }
00373 else
00374 {
00375 def_ops = allocate_def_optype (num);
00376 for (x = 0; x < num ; x++)
00377 def_ops->defs[x].def = VARRAY_TREE_PTR (build_defs, x);
00378 }
00379
00380 VARRAY_POP_ALL (build_defs);
00381
00382 return def_ops;
00383 }
00384
00385
00386
00387
00388 static use_optype
00389 finalize_ssa_uses (use_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED)
00390 {
00391 unsigned num, x;
00392 use_optype use_ops, old_ops;
00393 bool build_diff;
00394
00395 num = VARRAY_ACTIVE_SIZE (build_uses);
00396 if (num == 0)
00397 return NULL;
00398
00399 #ifdef ENABLE_CHECKING
00400 {
00401 unsigned x;
00402
00403
00404
00405
00406 for (x = 0; x < num; x++)
00407 gcc_assert (*(VARRAY_TREE_PTR (build_uses, x)) != stmt);
00408 }
00409 #endif
00410 old_ops = *old_ops_p;
00411
00412
00413 build_diff = true;
00414 if (old_ops && old_ops->num_uses == num)
00415 {
00416 build_diff = false;
00417 for (x = 0; x < num; x++)
00418 if (old_ops->uses[x].use != VARRAY_TREE_PTR (build_uses, x))
00419 {
00420 build_diff = true;
00421 break;
00422 }
00423 }
00424
00425 if (!build_diff)
00426 {
00427 use_ops = old_ops;
00428 *old_ops_p = NULL;
00429 }
00430 else
00431 {
00432 use_ops = allocate_use_optype (num);
00433 for (x = 0; x < num ; x++)
00434 use_ops->uses[x].use = VARRAY_TREE_PTR (build_uses, x);
00435 }
00436 VARRAY_POP_ALL (build_uses);
00437
00438 return use_ops;
00439 }
00440
00441
00442
00443
00444 static v_may_def_optype
00445 finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p)
00446 {
00447 unsigned num, x, i, old_num;
00448 v_may_def_optype v_may_def_ops, old_ops;
00449 tree result, var;
00450 bool build_diff;
00451
00452 num = VARRAY_ACTIVE_SIZE (build_v_may_defs);
00453 if (num == 0)
00454 return NULL;
00455
00456 old_ops = *old_ops_p;
00457
00458
00459 build_diff = true;
00460 if (old_ops && old_ops->num_v_may_defs == num)
00461 {
00462 old_num = num;
00463 build_diff = false;
00464 for (x = 0; x < num; x++)
00465 {
00466 var = old_ops->v_may_defs[x].def;
00467 if (TREE_CODE (var) == SSA_NAME)
00468 var = SSA_NAME_VAR (var);
00469 if (var != VARRAY_TREE (build_v_may_defs, x))
00470 {
00471 build_diff = true;
00472 break;
00473 }
00474 }
00475 }
00476 else
00477 old_num = (old_ops ? old_ops->num_v_may_defs : 0);
00478
00479 if (!build_diff)
00480 {
00481 v_may_def_ops = old_ops;
00482 *old_ops_p = NULL;
00483 }
00484 else
00485 {
00486 v_may_def_ops = allocate_v_may_def_optype (num);
00487 for (x = 0; x < num; x++)
00488 {
00489 var = VARRAY_TREE (build_v_may_defs, x);
00490
00491 for (i = 0; i < old_num; i++)
00492 {
00493 result = old_ops->v_may_defs[i].def;
00494 if (TREE_CODE (result) == SSA_NAME)
00495 result = SSA_NAME_VAR (result);
00496 if (result == var)
00497 {
00498 v_may_def_ops->v_may_defs[x] = old_ops->v_may_defs[i];
00499 break;
00500 }
00501 }
00502 if (i == old_num)
00503 {
00504 v_may_def_ops->v_may_defs[x].def = var;
00505 v_may_def_ops->v_may_defs[x].use = var;
00506 }
00507 }
00508 }
00509
00510
00511
00512 return v_may_def_ops;
00513 }
00514
00515
00516
00517
00518 static inline void
00519 cleanup_v_may_defs (void)
00520 {
00521 unsigned x, num;
00522 num = VARRAY_ACTIVE_SIZE (build_v_may_defs);
00523
00524 for (x = 0; x < num; x++)
00525 {
00526 tree t = VARRAY_TREE (build_v_may_defs, x);
00527 var_ann_t ann = var_ann (t);
00528 ann->in_v_may_def_list = 0;
00529 }
00530 VARRAY_POP_ALL (build_v_may_defs);
00531 }
00532
00533
00534
00535 static vuse_optype
00536 finalize_ssa_vuses (vuse_optype *old_ops_p)
00537 {
00538 unsigned num, x, i, num_v_may_defs, old_num;
00539 vuse_optype vuse_ops, old_ops;
00540 bool build_diff;
00541
00542 num = VARRAY_ACTIVE_SIZE (build_vuses);
00543 if (num == 0)
00544 {
00545 cleanup_v_may_defs ();
00546 return NULL;
00547 }
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561 num_v_may_defs = VARRAY_ACTIVE_SIZE (build_v_may_defs);
00562
00563 if (num_v_may_defs > 0)
00564 {
00565 size_t i;
00566 tree vuse;
00567 for (i = 0; i < VARRAY_ACTIVE_SIZE (build_vuses); i++)
00568 {
00569 vuse = VARRAY_TREE (build_vuses, i);
00570 if (TREE_CODE (vuse) != SSA_NAME)
00571 {
00572 var_ann_t ann = var_ann (vuse);
00573 ann->in_vuse_list = 0;
00574 if (ann->in_v_may_def_list)
00575 {
00576
00577
00578
00579
00580 if (i != VARRAY_ACTIVE_SIZE (build_vuses) - 1)
00581 {
00582 VARRAY_TREE (build_vuses, i)
00583 = VARRAY_TREE (build_vuses,
00584 VARRAY_ACTIVE_SIZE (build_vuses) - 1);
00585 }
00586 VARRAY_POP (build_vuses);
00587
00588
00589
00590
00591 i--;
00592 }
00593 }
00594 }
00595 }
00596 else
00597
00598 for (x = 0; x < num; x++)
00599 {
00600 tree t = VARRAY_TREE (build_vuses, x);
00601 if (TREE_CODE (t) != SSA_NAME)
00602 {
00603 var_ann_t ann = var_ann (t);
00604 ann->in_vuse_list = 0;
00605 }
00606 }
00607
00608
00609 num = VARRAY_ACTIVE_SIZE (build_vuses);
00610
00611 if (num == 0)
00612 {
00613 cleanup_v_may_defs ();
00614 return NULL;
00615 }
00616
00617 old_ops = *old_ops_p;
00618
00619
00620 build_diff = true;
00621 if (old_ops && old_ops->num_vuses == num)
00622 {
00623 old_num = num;
00624 build_diff = false;
00625 for (x = 0; x < num ; x++)
00626 {
00627 tree v;
00628 v = old_ops->vuses[x];
00629 if (TREE_CODE (v) == SSA_NAME)
00630 v = SSA_NAME_VAR (v);
00631 if (v != VARRAY_TREE (build_vuses, x))
00632 {
00633 build_diff = true;
00634 break;
00635 }
00636 }
00637 }
00638 else
00639 old_num = (old_ops ? old_ops->num_vuses : 0);
00640
00641 if (!build_diff)
00642 {
00643 vuse_ops = old_ops;
00644 *old_ops_p = NULL;
00645 }
00646 else
00647 {
00648 vuse_ops = allocate_vuse_optype (num);
00649 for (x = 0; x < num; x++)
00650 {
00651 tree result, var = VARRAY_TREE (build_vuses, x);
00652
00653 for (i = 0; i < old_num; i++)
00654 {
00655 result = old_ops->vuses[i];
00656 if (TREE_CODE (result) == SSA_NAME)
00657 result = SSA_NAME_VAR (result);
00658 if (result == var)
00659 {
00660 vuse_ops->vuses[x] = old_ops->vuses[i];
00661 break;
00662 }
00663 }
00664 if (i == old_num)
00665 vuse_ops->vuses[x] = var;
00666 }
00667 }
00668
00669
00670
00671 VARRAY_POP_ALL (build_vuses);
00672 cleanup_v_may_defs ();
00673
00674 return vuse_ops;
00675 }
00676
00677
00678
00679 static v_must_def_optype
00680 finalize_ssa_v_must_defs (v_must_def_optype *old_ops_p,
00681 tree stmt ATTRIBUTE_UNUSED)
00682 {
00683 unsigned num, x, i, old_num = 0;
00684 v_must_def_optype v_must_def_ops, old_ops;
00685 bool build_diff;
00686
00687 num = VARRAY_ACTIVE_SIZE (build_v_must_defs);
00688 if (num == 0)
00689 return NULL;
00690
00691
00692 gcc_assert (TREE_CODE (stmt) != MODIFY_EXPR || num <= 1);
00693
00694 old_ops = *old_ops_p;
00695
00696
00697 build_diff = true;
00698 if (old_ops && old_ops->num_v_must_defs == num)
00699 {
00700 old_num = num;
00701 build_diff = false;
00702 for (x = 0; x < num; x++)
00703 {
00704 tree var = old_ops->v_must_defs[x].def;
00705 if (TREE_CODE (var) == SSA_NAME)
00706 var = SSA_NAME_VAR (var);
00707 if (var != VARRAY_TREE (build_v_must_defs, x))
00708 {
00709 build_diff = true;
00710 break;
00711 }
00712 }
00713 }
00714 else
00715 old_num = (old_ops ? old_ops->num_v_must_defs : 0);
00716
00717 if (!build_diff)
00718 {
00719 v_must_def_ops = old_ops;
00720 *old_ops_p = NULL;
00721 }
00722 else
00723 {
00724 v_must_def_ops = allocate_v_must_def_optype (num);
00725 for (x = 0; x < num ; x++)
00726 {
00727 tree result, var = VARRAY_TREE (build_v_must_defs, x);
00728
00729 for (i = 0; i < old_num; i++)
00730 {
00731 result = old_ops->v_must_defs[i].def;
00732 if (TREE_CODE (result) == SSA_NAME)
00733 result = SSA_NAME_VAR (result);
00734 if (result == var)
00735 {
00736 v_must_def_ops->v_must_defs[x].def = old_ops->v_must_defs[i].def;
00737 v_must_def_ops->v_must_defs[x].use = old_ops->v_must_defs[i].use;
00738 break;
00739 }
00740 }
00741 if (i == old_num)
00742 {
00743 v_must_def_ops->v_must_defs[x].def = var;
00744 v_must_def_ops->v_must_defs[x].use = var;
00745 }
00746 }
00747 }
00748 VARRAY_POP_ALL (build_v_must_defs);
00749
00750 return v_must_def_ops;
00751 }
00752
00753
00754
00755
00756 static inline void
00757 finalize_ssa_stmt_operands (tree stmt, stmt_operands_p old_ops,
00758 stmt_operands_p new_ops)
00759 {
00760 new_ops->def_ops = finalize_ssa_defs (&(old_ops->def_ops), stmt);
00761 new_ops->use_ops = finalize_ssa_uses (&(old_ops->use_ops), stmt);
00762 new_ops->v_must_def_ops
00763 = finalize_ssa_v_must_defs (&(old_ops->v_must_def_ops), stmt);
00764 new_ops->v_may_def_ops = finalize_ssa_v_may_defs (&(old_ops->v_may_def_ops));
00765 new_ops->vuse_ops = finalize_ssa_vuses (&(old_ops->vuse_ops));
00766 }
00767
00768
00769
00770
00771 static inline void
00772 start_ssa_stmt_operands (void)
00773 {
00774 gcc_assert (VARRAY_ACTIVE_SIZE (build_defs) == 0);
00775 gcc_assert (VARRAY_ACTIVE_SIZE (build_uses) == 0);
00776 gcc_assert (VARRAY_ACTIVE_SIZE (build_vuses) == 0);
00777 gcc_assert (VARRAY_ACTIVE_SIZE (build_v_may_defs) == 0);
00778 gcc_assert (VARRAY_ACTIVE_SIZE (build_v_must_defs) == 0);
00779 }
00780
00781
00782
00783
00784 static inline void
00785 append_def (tree *def_p)
00786 {
00787 VARRAY_PUSH_TREE_PTR (build_defs, def_p);
00788 }
00789
00790
00791
00792
00793 static inline void
00794 append_use (tree *use_p)
00795 {
00796 VARRAY_PUSH_TREE_PTR (build_uses, use_p);
00797 }
00798
00799
00800
00801
00802 static inline void
00803 append_v_may_def (tree var)
00804 {
00805 var_ann_t ann = get_var_ann (var);
00806
00807
00808 if (ann->in_v_may_def_list)
00809 return;
00810 ann->in_v_may_def_list = 1;
00811
00812 VARRAY_PUSH_TREE (build_v_may_defs, var);
00813 }
00814
00815
00816
00817
00818 static inline void
00819 append_vuse (tree var)
00820 {
00821
00822
00823 if (TREE_CODE (var) != SSA_NAME)
00824 {
00825 var_ann_t ann = get_var_ann (var);
00826
00827 if (ann->in_vuse_list || ann->in_v_may_def_list)
00828 return;
00829 ann->in_vuse_list = 1;
00830 }
00831
00832 VARRAY_PUSH_TREE (build_vuses, var);
00833 }
00834
00835
00836
00837
00838 static inline void
00839 append_v_must_def (tree var)
00840 {
00841 unsigned i;
00842
00843
00844 for (i = 0; i < VARRAY_ACTIVE_SIZE (build_v_must_defs); i++)
00845 if (var == VARRAY_TREE (build_v_must_defs, i))
00846 return;
00847
00848 VARRAY_PUSH_TREE (build_v_must_defs, var);
00849 }
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869 static void
00870 build_ssa_operands (tree stmt, stmt_ann_t ann, stmt_operands_p old_ops,
00871 stmt_operands_p new_ops)
00872 {
00873 enum tree_code code;
00874 tree_ann_t saved_ann = stmt->common.ann;
00875
00876
00877
00878
00879 stmt->common.ann = (tree_ann_t) ann;
00880
00881
00882
00883 if (ann)
00884 {
00885 ann->has_volatile_ops = false;
00886 ann->makes_aliased_stores = false;
00887 ann->makes_aliased_loads = false;
00888 }
00889
00890 start_ssa_stmt_operands ();
00891
00892 code = TREE_CODE (stmt);
00893 switch (code)
00894 {
00895 case MODIFY_EXPR:
00896
00897
00898
00899
00900
00901
00902 {
00903 tree lhs = TREE_OPERAND (stmt, 0);
00904 int lhs_flags = opf_is_def;
00905
00906 get_expr_operands (stmt, &TREE_OPERAND (stmt, 1), opf_none);
00907
00908
00909
00910
00911 if (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
00912 lhs = TREE_OPERAND (lhs, 0);
00913
00914 if (TREE_CODE (lhs) != ARRAY_REF && TREE_CODE (lhs) != ARRAY_RANGE_REF
00915 && TREE_CODE (lhs) != COMPONENT_REF
00916 && TREE_CODE (lhs) != BIT_FIELD_REF
00917 && TREE_CODE (lhs) != REALPART_EXPR
00918 && TREE_CODE (lhs) != IMAGPART_EXPR)
00919 lhs_flags |= opf_kill_def;
00920
00921 get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), lhs_flags);
00922 }
00923 break;
00924
00925 case COND_EXPR:
00926 get_expr_operands (stmt, &COND_EXPR_COND (stmt), opf_none);
00927 break;
00928
00929 case SWITCH_EXPR:
00930 get_expr_operands (stmt, &SWITCH_COND (stmt), opf_none);
00931 break;
00932
00933 case ASM_EXPR:
00934 get_asm_expr_operands (stmt);
00935 break;
00936
00937 case RETURN_EXPR:
00938 get_expr_operands (stmt, &TREE_OPERAND (stmt, 0), opf_none);
00939 break;
00940
00941 case GOTO_EXPR:
00942 get_expr_operands (stmt, &GOTO_DESTINATION (stmt), opf_none);
00943 break;
00944
00945 case LABEL_EXPR:
00946 get_expr_operands (stmt, &LABEL_EXPR_LABEL (stmt), opf_none);
00947 break;
00948
00949
00950 case BIND_EXPR:
00951 case CASE_LABEL_EXPR:
00952 case TRY_CATCH_EXPR:
00953 case TRY_FINALLY_EXPR:
00954 case EH_FILTER_EXPR:
00955 case CATCH_EXPR:
00956 case RESX_EXPR:
00957 break;
00958
00959 default:
00960
00961
00962
00963
00964
00965 get_expr_operands (stmt, &stmt, opf_none);
00966 break;
00967 }
00968
00969 finalize_ssa_stmt_operands (stmt, old_ops, new_ops);
00970 stmt->common.ann = saved_ann;
00971 }
00972
00973
00974
00975
00976 static void
00977 free_ssa_operands (stmt_operands_p ops)
00978 {
00979 if (ops->def_ops)
00980 free_defs (&(ops->def_ops));
00981 if (ops->use_ops)
00982 free_uses (&(ops->use_ops));
00983 if (ops->vuse_ops)
00984 free_vuses (&(ops->vuse_ops));
00985 if (ops->v_may_def_ops)
00986 free_v_may_defs (&(ops->v_may_def_ops));
00987 if (ops->v_must_def_ops)
00988 free_v_must_defs (&(ops->v_must_def_ops));
00989 }
00990
00991
00992
00993
00994
00995
00996 void
00997 get_stmt_operands (tree stmt)
00998 {
00999 stmt_ann_t ann;
01000 stmt_operands_t old_operands;
01001
01002
01003
01004 gcc_assert (!SSA_VAR_P (stmt));
01005
01006
01007 if (TREE_CODE (stmt) == ERROR_MARK)
01008 return;
01009
01010 ann = get_stmt_ann (stmt);
01011
01012
01013 if (!ann->modified)
01014 return;
01015
01016 timevar_push (TV_TREE_OPS);
01017
01018 old_operands = ann->operands;
01019 memset (&(ann->operands), 0, sizeof (stmt_operands_t));
01020
01021 build_ssa_operands (stmt, ann, &old_operands, &(ann->operands));
01022 free_ssa_operands (&old_operands);
01023
01024
01025
01026
01027 ann->modified = 0;
01028
01029 timevar_pop (TV_TREE_OPS);
01030 }
01031
01032
01033
01034
01035
01036
01037 static void
01038 get_expr_operands (tree stmt, tree *expr_p, int flags)
01039 {
01040 enum tree_code code;
01041 enum tree_code_class class;
01042 tree expr = *expr_p;
01043 stmt_ann_t s_ann = stmt_ann (stmt);
01044
01045 if (expr == NULL || expr == error_mark_node)
01046 return;
01047
01048 code = TREE_CODE (expr);
01049 class = TREE_CODE_CLASS (code);
01050
01051 switch (code)
01052 {
01053 case ADDR_EXPR:
01054
01055
01056
01057
01058
01059 add_stmt_operand (expr_p, s_ann, 0);
01060
01061
01062
01063 if (is_gimple_min_invariant (expr))
01064 return;
01065
01066
01067
01068
01069
01070 flags |= opf_no_vops;
01071
01072 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
01073 return;
01074
01075 case SSA_NAME:
01076 case VAR_DECL:
01077 case PARM_DECL:
01078 case RESULT_DECL:
01079 case CONST_DECL:
01080
01081
01082 add_stmt_operand (expr_p, s_ann, flags);
01083 return;
01084
01085 case MISALIGNED_INDIRECT_REF:
01086 get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
01087
01088
01089 case ALIGN_INDIRECT_REF:
01090 case INDIRECT_REF:
01091 get_indirect_ref_operands (stmt, expr, flags);
01092 return;
01093
01094 case ARRAY_REF:
01095 case ARRAY_RANGE_REF:
01096
01097
01098
01099
01100
01101
01102
01103 if (SSA_VAR_P (TREE_OPERAND (expr, 0)))
01104 add_stmt_operand (expr_p, s_ann, flags);
01105 else
01106 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
01107
01108 get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
01109 get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
01110 get_expr_operands (stmt, &TREE_OPERAND (expr, 3), opf_none);
01111 return;
01112
01113 case COMPONENT_REF:
01114 case REALPART_EXPR:
01115 case IMAGPART_EXPR:
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131 if (SSA_VAR_P (TREE_OPERAND (expr, 0)))
01132 add_stmt_operand (expr_p, s_ann, flags);
01133 else
01134 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
01135
01136 if (code == COMPONENT_REF)
01137 {
01138 if (s_ann && TREE_THIS_VOLATILE (TREE_OPERAND (expr, 1)))
01139 s_ann->has_volatile_ops = true;
01140 get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
01141 }
01142 return;
01143
01144 case WITH_SIZE_EXPR:
01145
01146
01147 get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
01148 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
01149 return;
01150
01151 case CALL_EXPR:
01152 get_call_expr_operands (stmt, expr);
01153 return;
01154
01155 case COND_EXPR:
01156 case VEC_COND_EXPR:
01157 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_none);
01158 get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
01159 get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
01160 return;
01161
01162 case MODIFY_EXPR:
01163 {
01164 int subflags;
01165 tree op;
01166
01167 get_expr_operands (stmt, &TREE_OPERAND (expr, 1), opf_none);
01168
01169 op = TREE_OPERAND (expr, 0);
01170 if (TREE_CODE (op) == WITH_SIZE_EXPR)
01171 op = TREE_OPERAND (expr, 0);
01172 if (TREE_CODE (op) == ARRAY_REF
01173 || TREE_CODE (op) == ARRAY_RANGE_REF
01174 || TREE_CODE (op) == COMPONENT_REF
01175 || TREE_CODE (op) == REALPART_EXPR
01176 || TREE_CODE (op) == IMAGPART_EXPR)
01177 subflags = opf_is_def;
01178 else
01179 subflags = opf_is_def | opf_kill_def;
01180
01181 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), subflags);
01182 return;
01183 }
01184
01185 case CONSTRUCTOR:
01186 {
01187
01188
01189
01190 tree t;
01191 for (t = TREE_OPERAND (expr, 0); t ; t = TREE_CHAIN (t))
01192 get_expr_operands (stmt, &TREE_VALUE (t), opf_none);
01193
01194 return;
01195 }
01196
01197 case TRUTH_NOT_EXPR:
01198 case BIT_FIELD_REF:
01199 case VIEW_CONVERT_EXPR:
01200 do_unary:
01201 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
01202 return;
01203
01204 case TRUTH_AND_EXPR:
01205 case TRUTH_OR_EXPR:
01206 case TRUTH_XOR_EXPR:
01207 case COMPOUND_EXPR:
01208 case OBJ_TYPE_REF:
01209 do_binary:
01210 {
01211 tree op0 = TREE_OPERAND (expr, 0);
01212 tree op1 = TREE_OPERAND (expr, 1);
01213
01214
01215
01216
01217
01218
01219
01220 if (tree_swap_operands_p (op0, op1, false))
01221 {
01222
01223
01224 if (code == LT_EXPR
01225 || code == GT_EXPR
01226 || code == LE_EXPR
01227 || code == GE_EXPR)
01228 {
01229 TREE_SET_CODE (expr, swap_tree_comparison (code));
01230 TREE_OPERAND (expr, 0) = op1;
01231 TREE_OPERAND (expr, 1) = op0;
01232 }
01233
01234
01235 else if (commutative_tree_code (code))
01236 {
01237 TREE_OPERAND (expr, 0) = op1;
01238 TREE_OPERAND (expr, 1) = op0;
01239 }
01240 }
01241
01242 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
01243 get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
01244 return;
01245 }
01246
01247 case REALIGN_LOAD_EXPR:
01248 {
01249 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), flags);
01250 get_expr_operands (stmt, &TREE_OPERAND (expr, 1), flags);
01251 get_expr_operands (stmt, &TREE_OPERAND (expr, 2), flags);
01252 return;
01253 }
01254
01255 case BLOCK:
01256 case FUNCTION_DECL:
01257 case EXC_PTR_EXPR:
01258 case FILTER_EXPR:
01259 case LABEL_DECL:
01260
01261 return;
01262
01263 default:
01264 if (class == tcc_unary)
01265 goto do_unary;
01266 if (class == tcc_binary || class == tcc_comparison)
01267 goto do_binary;
01268 if (class == tcc_constant || class == tcc_type)
01269 return;
01270 }
01271
01272
01273 #ifdef ENABLE_CHECKING
01274 fprintf (stderr, "unhandled expression in get_expr_operands():\n");
01275 debug_tree (expr);
01276 fputs ("\n", stderr);
01277 internal_error ("internal error");
01278 #endif
01279 gcc_unreachable ();
01280 }
01281
01282
01283
01284
01285 static void
01286 get_asm_expr_operands (tree stmt)
01287 {
01288 stmt_ann_t s_ann = stmt_ann (stmt);
01289 int noutputs = list_length (ASM_OUTPUTS (stmt));
01290 const char **oconstraints
01291 = (const char **) alloca ((noutputs) * sizeof (const char *));
01292 int i;
01293 tree link;
01294 const char *constraint;
01295 bool allows_mem, allows_reg, is_inout;
01296
01297 for (i=0, link = ASM_OUTPUTS (stmt); link; ++i, link = TREE_CHAIN (link))
01298 {
01299 oconstraints[i] = constraint
01300 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
01301 parse_output_constraint (&constraint, i, 0, 0,
01302 &allows_mem, &allows_reg, &is_inout);
01303
01304
01305 gcc_assert (!allows_reg || !is_inout);
01306
01307
01308
01309 if (!allows_reg && allows_mem)
01310 {
01311 tree t = get_base_address (TREE_VALUE (link));
01312 if (t && DECL_P (t))
01313 note_addressable (t, s_ann);
01314 }
01315
01316 get_expr_operands (stmt, &TREE_VALUE (link), opf_is_def);
01317 }
01318
01319 for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
01320 {
01321 constraint
01322 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
01323 parse_input_constraint (&constraint, 0, 0, noutputs, 0,
01324 oconstraints, &allows_mem, &allows_reg);
01325
01326
01327
01328 if (!allows_reg && allows_mem)
01329 {
01330 tree t = get_base_address (TREE_VALUE (link));
01331 if (t && DECL_P (t))
01332 note_addressable (t, s_ann);
01333 }
01334
01335 get_expr_operands (stmt, &TREE_VALUE (link), 0);
01336 }
01337
01338
01339
01340 for (link = ASM_CLOBBERS (stmt); link; link = TREE_CHAIN (link))
01341 if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
01342 {
01343 unsigned i;
01344 bitmap_iterator bi;
01345
01346
01347
01348 if (global_var)
01349 add_stmt_operand (&global_var, s_ann, opf_is_def);
01350 else
01351 EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
01352 {
01353 tree var = referenced_var (i);
01354 add_stmt_operand (&var, s_ann, opf_is_def);
01355 }
01356
01357
01358 EXECUTE_IF_SET_IN_BITMAP (addressable_vars, 0, i, bi)
01359 {
01360 tree var = referenced_var (i);
01361 add_stmt_operand (&var, s_ann, opf_is_def);
01362 }
01363
01364 break;
01365 }
01366 }
01367
01368
01369
01370
01371 static void
01372 get_indirect_ref_operands (tree stmt, tree expr, int flags)
01373 {
01374 tree *pptr = &TREE_OPERAND (expr, 0);
01375 tree ptr = *pptr;
01376 stmt_ann_t s_ann = stmt_ann (stmt);
01377
01378
01379 flags &= ~opf_kill_def;
01380
01381 if (SSA_VAR_P (ptr))
01382 {
01383 struct ptr_info_def *pi = NULL;
01384
01385
01386 if (TREE_CODE (ptr) == SSA_NAME
01387 && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
01388 && pi->name_mem_tag)
01389 {
01390
01391 add_stmt_operand (&pi->name_mem_tag, s_ann, flags);
01392 }
01393 else
01394 {
01395
01396
01397 var_ann_t v_ann;
01398
01399
01400
01401
01402
01403 if (dump_file
01404 && TREE_CODE (ptr) == SSA_NAME
01405 && pi == NULL)
01406 {
01407 fprintf (dump_file,
01408 "NOTE: no flow-sensitive alias info for ");
01409 print_generic_expr (dump_file, ptr, dump_flags);
01410 fprintf (dump_file, " in ");
01411 print_generic_stmt (dump_file, stmt, dump_flags);
01412 }
01413
01414 if (TREE_CODE (ptr) == SSA_NAME)
01415 ptr = SSA_NAME_VAR (ptr);
01416 v_ann = var_ann (ptr);
01417 if (v_ann->type_mem_tag)
01418 add_stmt_operand (&v_ann->type_mem_tag, s_ann, flags);
01419 }
01420 }
01421
01422
01423
01424
01425 else if (TREE_CODE (ptr) == INTEGER_CST)
01426 {
01427 if (s_ann)
01428 s_ann->has_volatile_ops = true;
01429 return;
01430 }
01431
01432
01433
01434
01435
01436
01437 else if ((TREE_CODE (ptr) == PLUS_EXPR || TREE_CODE (ptr) == MINUS_EXPR)
01438 && TREE_CODE (TREE_OPERAND (ptr, 0)) == ADDR_EXPR
01439 && TREE_CODE (TREE_OPERAND (ptr, 1)) == INTEGER_CST)
01440 {
01441
01442 pptr = &TREE_OPERAND (ptr, 0);
01443 add_stmt_operand (pptr, s_ann, 0);
01444
01445
01446 pptr = &TREE_OPERAND (*pptr, 0);
01447 get_expr_operands (stmt, pptr, flags);
01448 return;
01449 }
01450
01451
01452 else
01453 gcc_unreachable ();
01454
01455
01456 get_expr_operands (stmt, pptr, opf_none);
01457 }
01458
01459
01460
01461 static void
01462 get_call_expr_operands (tree stmt, tree expr)
01463 {
01464 tree op;
01465 int call_flags = call_expr_flags (expr);
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477 if (aliases_computed_p && !bitmap_empty_p (call_clobbered_vars))
01478 {
01479
01480
01481
01482 if (TREE_SIDE_EFFECTS (expr)
01483 && !(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN)))
01484 add_call_clobber_ops (stmt);
01485 else if (!(call_flags & ECF_CONST))
01486 add_call_read_ops (stmt);
01487 }
01488
01489
01490 get_expr_operands (stmt, &TREE_OPERAND (expr, 0), opf_none);
01491
01492 for (op = TREE_OPERAND (expr, 1); op; op = TREE_CHAIN (op))
01493 get_expr_operands (stmt, &TREE_VALUE (op), opf_none);
01494
01495 get_expr_operands (stmt, &TREE_OPERAND (expr, 2), opf_none);
01496
01497 }
01498
01499
01500
01501
01502
01503
01504
01505 static void
01506 add_stmt_operand (tree *var_p, stmt_ann_t s_ann, int flags)
01507 {
01508 bool is_real_op;
01509 tree var, sym;
01510 var_ann_t v_ann;
01511
01512 var = *var_p;
01513 STRIP_NOPS (var);
01514
01515
01516
01517 if (TREE_CODE (var) == ADDR_EXPR)
01518 {
01519 note_addressable (TREE_OPERAND (var, 0), s_ann);
01520 return;
01521 }
01522
01523
01524
01525
01526 is_real_op = is_gimple_reg (var);
01527 if (!is_real_op && !DECL_P (var))
01528 var = get_virtual_var (var);
01529
01530
01531 if (var == NULL_TREE || !SSA_VAR_P (var))
01532 return;
01533
01534 sym = (TREE_CODE (var) == SSA_NAME ? SSA_NAME_VAR (var) : var);
01535 v_ann = var_ann (sym);
01536
01537
01538
01539 if (TREE_THIS_VOLATILE (sym) && s_ann)
01540 s_ann->has_volatile_ops = true;
01541
01542 if (is_real_op)
01543 {
01544
01545 if (flags & opf_is_def)
01546 append_def (var_p);
01547 else
01548 append_use (var_p);
01549 }
01550 else
01551 {
01552 varray_type aliases;
01553
01554
01555
01556
01557
01558 if (flags & opf_no_vops)
01559 return;
01560
01561 aliases = v_ann->may_aliases;
01562
01563 if (aliases == NULL)
01564 {
01565
01566 if (flags & opf_is_def)
01567 {
01568 if (flags & opf_kill_def)
01569 {
01570
01571
01572 gcc_assert (v_ann->mem_tag_kind == NOT_A_TAG);
01573
01574
01575 append_v_must_def (var);
01576 }
01577 else
01578 {
01579
01580
01581 append_v_may_def (var);
01582 }
01583 }
01584 else
01585 {
01586 append_vuse (var);
01587 if (s_ann && v_ann->is_alias_tag)
01588 s_ann->makes_aliased_loads = 1;
01589 }
01590 }
01591 else
01592 {
01593 size_t i;
01594
01595
01596
01597 gcc_assert (VARRAY_ACTIVE_SIZE (aliases) != 0);
01598
01599 if (flags & opf_is_def)
01600 {
01601
01602
01603
01604
01605 if (v_ann->is_alias_tag)
01606 append_v_may_def (var);
01607
01608 for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
01609 append_v_may_def (VARRAY_TREE (aliases, i));
01610
01611 if (s_ann)
01612 s_ann->makes_aliased_stores = 1;
01613 }
01614 else
01615 {
01616
01617
01618 if (v_ann->is_alias_tag)
01619 append_vuse (var);
01620
01621 for (i = 0; i < VARRAY_ACTIVE_SIZE (aliases); i++)
01622 append_vuse (VARRAY_TREE (aliases, i));
01623
01624 if (s_ann)
01625 s_ann->makes_aliased_loads = 1;
01626 }
01627 }
01628 }
01629 }
01630
01631
01632
01633
01634
01635 static void
01636 note_addressable (tree var, stmt_ann_t s_ann)
01637 {
01638 if (!s_ann)
01639 return;
01640
01641 var = get_base_address (var);
01642 if (var && SSA_VAR_P (var))
01643 {
01644 if (s_ann->addresses_taken == NULL)
01645 s_ann->addresses_taken = BITMAP_GGC_ALLOC ();
01646 bitmap_set_bit (s_ann->addresses_taken, var_ann (var)->uid);
01647 }
01648 }
01649
01650
01651
01652
01653
01654 static void
01655 add_call_clobber_ops (tree stmt)
01656 {
01657 unsigned i;
01658 tree t;
01659 bitmap_iterator bi;
01660 stmt_ann_t s_ann = stmt_ann (stmt);
01661 struct stmt_ann_d empty_ann;
01662
01663
01664
01665 if (s_ann)
01666 s_ann->makes_clobbering_call = true;
01667
01668
01669
01670 if (global_var)
01671 {
01672 add_stmt_operand (&global_var, s_ann, opf_is_def);
01673 return;
01674 }
01675
01676
01677 if (ssa_call_clobbered_cache_valid)
01678 {
01679 for (i = 0; i < VARRAY_ACTIVE_SIZE (clobbered_vuses); i++)
01680 {
01681 t = VARRAY_TREE (clobbered_vuses, i);
01682 gcc_assert (TREE_CODE (t) != SSA_NAME);
01683 var_ann (t)->in_vuse_list = 1;
01684 VARRAY_PUSH_TREE (build_vuses, t);
01685 }
01686 for (i = 0; i < VARRAY_ACTIVE_SIZE (clobbered_v_may_defs); i++)
01687 {
01688 t = VARRAY_TREE (clobbered_v_may_defs, i);
01689 gcc_assert (TREE_CODE (t) != SSA_NAME);
01690 var_ann (t)->in_v_may_def_list = 1;
01691 VARRAY_PUSH_TREE (build_v_may_defs, t);
01692 }
01693 if (s_ann)
01694 {
01695 s_ann->makes_aliased_loads = clobbered_aliased_loads;
01696 s_ann->makes_aliased_stores = clobbered_aliased_stores;
01697 }
01698 return;
01699 }
01700
01701 memset (&empty_ann, 0, sizeof (struct stmt_ann_d));
01702
01703
01704 EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
01705 {
01706 tree var = referenced_var (i);
01707 if (TREE_READONLY (var)
01708 && (TREE_STATIC (var) || DECL_EXTERNAL (var)))
01709 add_stmt_operand (&var, &empty_ann, opf_none);
01710 else
01711 add_stmt_operand (&var, &empty_ann, opf_is_def);
01712 }
01713
01714 clobbered_aliased_loads = empty_ann.makes_aliased_loads;
01715 clobbered_aliased_stores = empty_ann.makes_aliased_stores;
01716
01717
01718 if (s_ann)
01719 {
01720 s_ann->makes_aliased_loads = empty_ann.makes_aliased_loads;
01721 s_ann->makes_aliased_stores = empty_ann.makes_aliased_stores;
01722 }
01723
01724
01725 if (clobbered_v_may_defs)
01726 {
01727 VARRAY_POP_ALL (clobbered_vuses);
01728 VARRAY_POP_ALL (clobbered_v_may_defs);
01729 }
01730 else
01731 {
01732 VARRAY_TREE_INIT (clobbered_v_may_defs, 10, "clobbered_v_may_defs");
01733 VARRAY_TREE_INIT (clobbered_vuses, 10, "clobbered_vuses");
01734 }
01735
01736
01737 for (i = 0; i < VARRAY_ACTIVE_SIZE (build_vuses); i++)
01738 VARRAY_PUSH_TREE (clobbered_vuses, VARRAY_TREE (build_vuses, i));
01739 for (i = 0; i < VARRAY_ACTIVE_SIZE (build_v_may_defs); i++)
01740 VARRAY_PUSH_TREE (clobbered_v_may_defs, VARRAY_TREE (build_v_may_defs, i));
01741
01742 ssa_call_clobbered_cache_valid = true;
01743 }
01744
01745
01746
01747
01748
01749 static void
01750 add_call_read_ops (tree stmt)
01751 {
01752 unsigned i;
01753 tree t;
01754 bitmap_iterator bi;
01755 stmt_ann_t s_ann = stmt_ann (stmt);
01756 struct stmt_ann_d empty_ann;
01757
01758
01759
01760
01761 if (global_var)
01762 {
01763 add_stmt_operand (&global_var, s_ann, opf_none);
01764 return;
01765 }
01766
01767
01768 if (ssa_ro_call_cache_valid)
01769 {
01770 for (i = 0; i < VARRAY_ACTIVE_SIZE (ro_call_vuses); i++)
01771 {
01772 t = VARRAY_TREE (ro_call_vuses, i);
01773 gcc_assert (TREE_CODE (t) != SSA_NAME);
01774 var_ann (t)->in_vuse_list = 1;
01775 VARRAY_PUSH_TREE (build_vuses, t);
01776 }
01777 if (s_ann)
01778 s_ann->makes_aliased_loads = ro_call_aliased_loads;
01779 return;
01780 }
01781
01782 memset (&empty_ann, 0, sizeof (struct stmt_ann_d));
01783
01784
01785 EXECUTE_IF_SET_IN_BITMAP (call_clobbered_vars, 0, i, bi)
01786 {
01787 tree var = referenced_var (i);
01788 add_stmt_operand (&var, &empty_ann, opf_none);
01789 }
01790
01791 ro_call_aliased_loads = empty_ann.makes_aliased_loads;
01792 if (s_ann)
01793 s_ann->makes_aliased_loads = empty_ann.makes_aliased_loads;
01794
01795
01796 if (ro_call_vuses)
01797 VARRAY_POP_ALL (ro_call_vuses);
01798 else
01799 VARRAY_TREE_INIT (ro_call_vuses, 10, "ro_call_vuses");
01800
01801
01802 for (i = 0; i < VARRAY_ACTIVE_SIZE (build_vuses); i++)
01803 VARRAY_PUSH_TREE (ro_call_vuses, VARRAY_TREE (build_vuses, i));
01804
01805 ssa_ro_call_cache_valid = true;
01806 }
01807
01808
01809
01810 void
01811 copy_virtual_operands (tree dst, tree src)
01812 {
01813 unsigned i;
01814 vuse_optype vuses = STMT_VUSE_OPS (src);
01815 v_may_def_optype v_may_defs = STMT_V_MAY_DEF_OPS (src);
01816 v_must_def_optype v_must_defs = STMT_V_MUST_DEF_OPS (src);
01817 vuse_optype *vuses_new = &stmt_ann (dst)->operands.vuse_ops;
01818 v_may_def_optype *v_may_defs_new = &stmt_ann (dst)->operands.v_may_def_ops;
01819 v_must_def_optype *v_must_defs_new = &stmt_ann (dst)->operands.v_must_def_ops;
01820
01821 if (vuses)
01822 {
01823 *vuses_new = allocate_vuse_optype (NUM_VUSES (vuses));
01824 for (i = 0; i < NUM_VUSES (vuses); i++)
01825 SET_VUSE_OP (*vuses_new, i, VUSE_OP (vuses, i));
01826 }
01827
01828 if (v_may_defs)
01829 {
01830 *v_may_defs_new = allocate_v_may_def_optype (NUM_V_MAY_DEFS (v_may_defs));
01831 for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++)
01832 {
01833 SET_V_MAY_DEF_OP (*v_may_defs_new, i, V_MAY_DEF_OP (v_may_defs, i));
01834 SET_V_MAY_DEF_RESULT (*v_may_defs_new, i,
01835 V_MAY_DEF_RESULT (v_may_defs, i));
01836 }
01837 }
01838
01839 if (v_must_defs)
01840 {
01841 *v_must_defs_new = allocate_v_must_def_optype (NUM_V_MUST_DEFS (v_must_defs));
01842 for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++)
01843 {
01844 SET_V_MUST_DEF_RESULT (*v_must_defs_new, i, V_MUST_DEF_RESULT (v_must_defs, i));
01845 SET_V_MUST_DEF_KILL (*v_must_defs_new, i, V_MUST_DEF_KILL (v_must_defs, i));
01846 }
01847 }
01848 }
01849
01850
01851
01852
01853
01854
01855
01856
01857 void
01858 create_ssa_artficial_load_stmt (stmt_operands_p old_ops, tree new_stmt)
01859 {
01860 stmt_ann_t ann;
01861 tree op;
01862 stmt_operands_t tmp;
01863 unsigned j;
01864
01865 memset (&tmp, 0, sizeof (stmt_operands_t));
01866 ann = get_stmt_ann (new_stmt);
01867
01868
01869 free_ssa_operands (&(ann->operands));
01870
01871 build_ssa_operands (new_stmt, NULL, &tmp, &(ann->operands));
01872 free_vuses (&(ann->operands.vuse_ops));
01873 free_v_may_defs (&(ann->operands.v_may_def_ops));
01874 free_v_must_defs (&(ann->operands.v_must_def_ops));
01875
01876
01877
01878
01879 for (j = 0; j < NUM_V_MAY_DEFS (old_ops->v_may_def_ops); j++)
01880 {
01881 op = V_MAY_DEF_RESULT (old_ops->v_may_def_ops, j);
01882 append_vuse (op);
01883 }
01884
01885 for (j = 0; j < NUM_V_MUST_DEFS (old_ops->v_must_def_ops); j++)
01886 {
01887 op = V_MUST_DEF_RESULT (old_ops->v_must_def_ops, j);
01888 append_vuse (op);
01889 }
01890
01891
01892 ann->operands.vuse_ops = finalize_ssa_vuses (&(tmp.vuse_ops));
01893 }
01894
01895 #include "gt-tree-ssa-operands.h"