00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
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
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113 #ifdef USE_PCH
00114 #include "opt_pch.h"
00115 #endif // USE_PCH
00116 #pragma hdrstop
00117
00118
00119 #define __STDC_LIMIT_MACROS
00120 #include <stdint.h>
00121 #include "defs.h"
00122 #include "erglob.h"
00123 #include "opcode.h"
00124 #include "errors.h"
00125 #include "mtypes.h"
00126 #include "cxx_memory.h"
00127 #include "wn_util.h"
00128 #include "targ_const.h"
00129 #include "const.h"
00130
00131 #include "opt_config.h"
00132 #include "opt_wn.h"
00133 #include "opt_util.h"
00134 #include "opt_cfg.h"
00135 #include "opt_htable.h"
00136 #include "opt_mu_chi.h"
00137 #include "opt_cvtl_rule.h"
00138
00139 #include "opt_vn.h"
00140
00141
00142
00143
00144 #define VN_MAX_PREDEFINED_INT 32
00145 #define Coderep_id ERROR_DO_NOT_USE_THIS_USE::get_exprid
00146 #define CVTL_BITSIZE_IS_SIGNED TRUE
00147
00148
00149 #define OFFSET_AND_SIZE_TOGETHER(x,y) (((x)<<8) + (y))
00150
00151
00152 inline BOOL Vn_Tracing(VN::EXPRID id)
00153 {
00154 return FALSE;
00155 }
00156
00157 inline INT Need_Integral_Conversion(MTYPE from_ty, MTYPE to_ty, OPCODE *opc)
00158 {
00159 if (MTYPE_is_integral(from_ty) && MTYPE_is_integral(to_ty)
00160 #ifdef KEY
00161 && !MTYPE_is_vector(from_ty)
00162 #endif
00163 )
00164 return Need_type_conversion(from_ty, to_ty, opc);
00165 else
00166 return NOT_AT_ALL;
00167 }
00168
00169
00170 void
00171 VN::_trace(EXPRID id, VN_VALNUM valnum, FILE *fp)
00172 {
00173 fprintf(fp, "<cr %d> = ", (int)id);
00174 valnum.print(fp);
00175 fprintf(fp, " = ");
00176 if (valnum_expr(valnum) == NULL)
00177 fputs(" ==> ...Chi result, or has Bottom opnd", fp);
00178 else
00179 valnum_expr(valnum)->print(fp);
00180 fprintf(fp, "\n");
00181 }
00182
00183
00184 void
00185 VN::_grow_exprid_maps(EXPRID id)
00186 {
00187
00188
00189 while (_exprid_to_cr.capacity() <= id)
00190 {
00191 const INT32 new_capacity = (_exprid_to_cr.capacity() +
00192 _exprid_to_cr.capacity()/2 + 1);
00193
00194 _exprid_to_cr.reserve(new_capacity);
00195 _exprid_to_vn.reserve(new_capacity);
00196 _exprid_to_stmtlist.reserve(new_capacity);
00197 }
00198 while (id >= _exprid_to_cr.size())
00199 {
00200 _exprid_to_cr.push_back(NULL);
00201 _exprid_to_vn.push_back(VN_VALNUM::Bottom());
00202 _exprid_to_stmtlist.push_back(STMT_LIST(STMT_ALLOCATOR(_gpool)));
00203 }
00204 }
00205
00206
00207 inline void
00208 VN::_set_stmt_map(CODEKIND ck, EXPRID id, const VN_VALNUM &vn)
00209 {
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 if (_no_of_iterations == 0 &&
00232 _current_stmt != NULL &&
00233 !vn.is_bottom() && !vn.is_top())
00234 {
00235 if ((_exprid_to_stmtlist[id].empty() ||
00236 _current_stmt != _exprid_to_stmtlist[id].front()) &&
00237 (ck != CK_CONST && ck != CK_RCONST))
00238
00239 {
00240 _exprid_to_stmtlist[id].push_front(_current_stmt);
00241 }
00242 }
00243 }
00244
00245
00246 void
00247 VN::_set_valnum(EXPRID id,
00248 const VN_VALNUM &vn,
00249 VALNUM_VECTOR &exprid_to_vn,
00250 BIT_VECTOR &locked_to_vn)
00251 {
00252 Is_True(id != 0,
00253 ("Unexpected coderep id (%d) in VN::_set_valnum()", INT32(id)));
00254
00255
00256
00257
00258 if (exprid_to_vn[id] != vn)
00259 {
00260 #if 0
00261
00262
00263 if (_no_of_iterations > 1)
00264 {
00265 if (&exprid_to_vn == &_exprid_to_vn)
00266 fprintf(stderr, "Changed primary valnum for cr%d "
00267 "from %d to %d in iteration %d %s\n",
00268 (INT32)id,
00269 (INT32)exprid_to_vn[id].ordinal(),
00270 (INT32)vn.ordinal(),
00271 (INT32)_no_of_iterations,
00272 (locked_to_vn[id]? "locked" : "unlocked"));
00273 else
00274 fprintf(stderr, "Changed second valnum for cr%d "
00275 "from %d to %d in iteration %d %s\n",
00276 (INT32)id,
00277 (INT32)exprid_to_vn[id].ordinal(),
00278 (INT32)vn.ordinal(),
00279 (INT32)_no_of_iterations,
00280 (locked_to_vn[id]? "locked" : "unlocked"));
00281 }
00282 #endif
00283
00284 _status.changed = TRUE;
00285 exprid_to_vn[id] = vn;
00286
00287
00288
00289
00290
00291
00292
00293 if (vn == _next_valnum)
00294 {
00295 locked_to_vn[id] = TRUE;
00296 _next_valnum = VN_VALNUM::Next(_next_valnum);
00297 }
00298 else if (locked_to_vn[id])
00299 {
00300 locked_to_vn[id] = FALSE;
00301 }
00302 }
00303 (*_status.is_numbered)[id] = TRUE;
00304 }
00305
00306
00307 void
00308 VN::_init_integer_valnum_map()
00309 {
00310
00311
00312
00313
00314
00315 _zero_valnum = _next_valnum;
00316 for (INT64 literal = 0; literal <= VN_MAX_PREDEFINED_INT; literal++)
00317 {
00318 const TCON tc = Host_To_Targ(MTYPE_I8, literal);
00319 const VN_EXPR::PTR expr = VN_EXPR::Create_Literal(tc);
00320
00321 _vn_to_expr.set_map(_next_valnum, expr);
00322 _next_valnum = VN_VALNUM::Next(_next_valnum);
00323 }
00324 }
00325
00326
00327 VN_VALNUM
00328 VN::_valnum_integer(INT64 literal,
00329 BOOL is_signed)
00330 {
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 VN_VALNUM valnum;
00354
00355 if (literal >= 0 && literal < VN_MAX_PREDEFINED_INT)
00356 valnum = _get_literal_valnum(literal);
00357 else
00358 {
00359
00360
00361
00362 const MTYPE mty = (is_signed? MTYPE_I8 : MTYPE_U8);
00363 const TCON tc = Host_To_Targ(mty, literal);
00364 const VN_EXPR::PTR expr = VN_EXPR::Create_Literal(tc);
00365 const VN_HASHTAB::EXPR_MAPPING map =
00366 _status.expr_to_vn->lookup_or_insert(expr, _next_valnum);
00367
00368 valnum = map.second;
00369 if (map.first == expr)
00370 {
00371
00372
00373
00374 _vn_to_expr.set_map(valnum, expr);
00375 _next_valnum = VN_VALNUM::Next(_next_valnum);
00376 }
00377 else
00378 {
00379
00380
00381
00382 expr->free();
00383 }
00384 }
00385 return valnum;
00386 }
00387
00388
00389 VN_VALNUM
00390 VN::_valnum_vn_expr(EXPRID exprid,
00391 VN_EXPR::PTR expr,
00392 VALNUM_VECTOR &exprid_to_vn,
00393 BIT_VECTOR &locked_to_vn)
00394 {
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422 VN_VALNUM valnum;
00423 VN_EXPR::PTR simplified = expr->simplify(this);
00424
00425 Is_True(!(*_status.is_numbered)[exprid],
00426 ("Each expression %d should only be value numbered once "
00427 "in VN::_valnum_vn_expr()", (INT32)exprid));
00428
00429 if (simplified->get_kind() == VN_EXPR::LITERAL &&
00430 #ifdef TARG_X8664
00431 !MTYPE_is_vector(TCON_ty(simplified->get_tcon())) &&
00432 #endif
00433 MTYPE_is_integral(TCON_ty(simplified->get_tcon())))
00434 {
00435 const BOOL is_signed = MTYPE_is_signed(TCON_ty(simplified->get_tcon()));
00436 const INT64 intval = Targ_To_Host(simplified->get_tcon());
00437
00438 simplified->free();
00439 valnum = _valnum_integer(intval, is_signed);
00440 Is_True(valnum != _next_valnum,
00441 ("Expected _next_valnum to be updated in _valnum_integer()!"));
00442 }
00443 else if (simplified->has_bottom_opnd())
00444 {
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458 Is_True(simplified->get_kind() == VN_EXPR::UNARY &&
00459 simplified->get_opc() == OPC_VPARM,
00460 ("simplify() should have reduced expression to Bottom()!"));
00461
00462 valnum = _unique_valnum(exprid, exprid_to_vn, locked_to_vn);
00463
00464 simplified->free();
00465 }
00466 else if (simplified->get_kind() == VN_EXPR::UNARY &&
00467 simplified->get_opc() == OPC_VPARM)
00468 {
00469
00470
00471 valnum = simplified->get_opnd(0);
00472 simplified->free();
00473 }
00474 else if (simplified->get_kind() == VN_EXPR::UNARY &&
00475 OPCODE_is_volatile(simplified->get_opc()))
00476 {
00477
00478
00479 valnum = _unique_valnum(exprid, exprid_to_vn, locked_to_vn);
00480 simplified->free();
00481 }
00482 else
00483 {
00484
00485
00486
00487
00488
00489
00490 const VN_VALNUM new_valnum =
00491 _unique_valnum(exprid, exprid_to_vn, locked_to_vn);
00492 VN_HASHTAB::EXPR_MAPPING vn_map =
00493 _status.expr_to_vn->lookup_or_insert(simplified, new_valnum);
00494
00495 valnum = vn_map.second;
00496 if (vn_map.first == simplified)
00497 _vn_to_expr.set_map(valnum, simplified);
00498 else
00499 simplified->free();
00500 }
00501
00502
00503
00504 _set_valnum(exprid, valnum, exprid_to_vn, locked_to_vn);
00505
00506 return valnum;
00507 }
00508
00509
00510 VN_VALNUM
00511 VN::_valnum_sym(CODEREP *sym)
00512 {
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525 VN_VALNUM valnum = VN_VALNUM::Bottom();
00526
00527 Is_True(sym == NULL || sym->Kind() == CK_VAR,
00528 ("Unexpected coderep kind in VN::_valnum_sym()"));
00529
00530 if (sym != NULL)
00531 {
00532 const EXPRID id = _get_exprid(sym);
00533
00534 if (sym->Is_var_volatile() || sym->Is_flag_set(CF_IS_ZERO_VERSION))
00535 {
00536 _set_valnum(id, VN_VALNUM::Bottom(),
00537 _exprid_to_vn,
00538 *_status.locked_to_vn);
00539 }
00540 else
00541 {
00542
00543
00544
00545
00546
00547
00548 valnum = _exprid_to_vn[id];
00549 }
00550 }
00551 return valnum;
00552 }
00553
00554
00555 VN_VALNUM
00556 VN::_valnum_op(CODEREP *cr)
00557 {
00558 Is_True(cr->Kind() == CK_OP,
00559 ("Unexpected coderep kind in VN::_valnum_op()"));
00560
00561 VN_EXPR::PTR vn_expr_ptr;
00562 VN_VALNUM valnum;
00563 const EXPRID exprid = _get_exprid(cr);
00564 OPCODE opc = cr->Op();
00565
00566 if (OPCODE_is_fake(opc))
00567 {
00568
00569
00570
00571 FmtAssert(FALSE, ("Unexpected opcode in VN::_valnum_op()"));
00572 }
00573 else if (opc == OPC_VPARM)
00574 {
00575
00576
00577 valnum = _valnum_expr(cr->Opnd(0));
00578 _set_valnum(exprid, valnum, _exprid_to_vn, *_status.locked_to_vn);
00579 }
00580 else if (OPCODE_operator(opc) == OPR_INTRINSIC_OP)
00581 {
00582 vn_expr_ptr = VN_EXPR::Create_Intr_Op((INTRINSIC)cr->Intrinsic(),
00583 cr->Kid_count());
00584
00585 for (INT32 i = 0; i < cr->Kid_count(); i++)
00586 {
00587 CODEREP *const vsym = cr->Opnd(i)->Get_ivar_vsym();
00588 const VN_VALNUM vsym_valnum = _valnum_sym(vsym);
00589
00590 valnum = _valnum_expr(cr->Opnd(i));
00591 vn_expr_ptr->set_opnd(i, valnum);
00592 vn_expr_ptr->set_opnd_vsym(i, vsym_valnum);
00593 }
00594 valnum = _valnum_vn_expr(exprid, vn_expr_ptr,
00595 _exprid_to_vn, *_status.locked_to_vn);
00596
00597 }
00598 #ifdef KEY
00599 else if (OPCODE_operator(opc) == OPR_PURE_CALL_OP)
00600 {
00601 vn_expr_ptr = VN_EXPR::Create_Call_Op(cr->Call_op_aux_id(),
00602 cr->Kid_count());
00603
00604 for (INT32 i = 0; i < cr->Kid_count(); i++)
00605 {
00606 CODEREP *const vsym = cr->Opnd(i)->Get_ivar_vsym();
00607 const VN_VALNUM vsym_valnum = _valnum_sym(vsym);
00608
00609 valnum = _valnum_expr(cr->Opnd(i));
00610 vn_expr_ptr->set_opnd(i, valnum);
00611 vn_expr_ptr->set_opnd_vsym(i, vsym_valnum);
00612 }
00613 valnum = _valnum_vn_expr(exprid, vn_expr_ptr,
00614 _exprid_to_vn, *_status.locked_to_vn);
00615 }
00616 #endif
00617 else if (OPCODE_operator(opc) == OPR_ARRAY)
00618 {
00619 vn_expr_ptr = VN_EXPR::Create_Array_Addr(cr->Elm_siz(), cr->Num_dim());
00620
00621 for (INT32 i = 0; i < cr->Kid_count(); i++)
00622 {
00623 valnum = _valnum_expr(cr->Opnd(i));
00624 vn_expr_ptr->set_opnd(i, valnum);
00625 }
00626 valnum = _valnum_vn_expr(exprid, vn_expr_ptr,
00627 _exprid_to_vn, *_status.locked_to_vn);
00628 }
00629 else
00630 {
00631 VN_VALNUM vn0, vn1, vn2;
00632
00633 switch (cr->Kid_count())
00634 {
00635 case 1:
00636 if (cr->Opr() == OPR_CVTL)
00637 {
00638
00639
00640 vn0 = _valnum_expr(cr->Opnd(0));
00641 vn1 = _valnum_integer(cr->Offset(), CVTL_BITSIZE_IS_SIGNED);
00642 vn_expr_ptr = VN_EXPR::Create_Binary(opc, vn0, vn1);
00643 } else if (cr->Opr() == OPR_EXTRACT_BITS) {
00644
00645 vn0 = _valnum_expr(cr->Opnd(0));
00646 vn1 = _valnum_integer(OFFSET_AND_SIZE_TOGETHER(cr->Op_bit_size(),cr->Op_bit_offset()), FALSE);
00647 vn_expr_ptr = VN_EXPR::Create_Binary(opc, vn0, vn1);
00648 }
00649 else
00650 {
00651 vn0 = _valnum_expr(cr->Opnd(0));
00652 vn_expr_ptr = VN_EXPR::Create_Unary(opc, vn0);
00653 }
00654 break;
00655
00656 case 2:
00657 if (cr->Opr() == OPR_COMPOSE_BITS) {
00658
00659 vn0 = _valnum_expr(cr->Opnd(0));
00660 vn1 = _valnum_expr(cr->Opnd(1));
00661 vn2 = _valnum_integer(OFFSET_AND_SIZE_TOGETHER(cr->Op_bit_size(),cr->Op_bit_offset()), FALSE);
00662 vn_expr_ptr = VN_EXPR::Create_Ternary(opc, vn0, vn1, vn2);
00663 } else {
00664 vn0 = _valnum_expr(cr->Opnd(0));
00665 vn1 = _valnum_expr(cr->Opnd(1));
00666 vn_expr_ptr = VN_EXPR::Create_Binary(opc, vn0, vn1);
00667 }
00668 break;
00669
00670 case 3:
00671 vn0 = _valnum_expr(cr->Opnd(0));
00672 vn1 = _valnum_expr(cr->Opnd(1));
00673 vn2 = _valnum_expr(cr->Opnd(2));
00674 vn_expr_ptr = VN_EXPR::Create_Ternary(opc, vn0, vn1, vn2);
00675 break;
00676
00677 default:
00678 FmtAssert(FALSE, ("Unexpected number of kids in VN::_valnum_op()"));
00679 break;
00680
00681 }
00682
00683 valnum = _valnum_vn_expr(exprid, vn_expr_ptr,
00684 _exprid_to_vn, *_status.locked_to_vn);
00685 }
00686 return valnum;
00687 }
00688
00689
00690 VN_VALNUM
00691 VN::_valnum_expr(CODEREP *cr)
00692 {
00693
00694
00695
00696
00697
00698 VN_VALNUM valnum;
00699 const EXPRID exprid = _get_exprid(cr);
00700 const CODEKIND expr_kind = cr->Kind();
00701 BOOL is_parm = FALSE;
00702
00703 if ((*_status.is_numbered)[exprid])
00704 valnum = _exprid_to_vn[exprid];
00705 else
00706 {
00707 VN_EXPR::PTR vn_expr_ptr;
00708
00709
00710
00711 switch (cr->Kind())
00712 {
00713 case CK_LDA:
00714
00715
00716
00717
00718 vn_expr_ptr = VN_EXPR::Create_Lda_Addr((INT32)exprid);
00719 valnum = _valnum_vn_expr(exprid,
00720 vn_expr_ptr,
00721 _exprid_to_vn,
00722 *_status.locked_to_vn);
00723 break;
00724
00725 case CK_CONST:
00726 valnum = _valnum_integer(cr->Const_val(),
00727 MTYPE_is_signed(cr->Dtyp()));
00728 _set_valnum(exprid, valnum, _exprid_to_vn, *_status.locked_to_vn);
00729 break;
00730
00731 case CK_RCONST:
00732 vn_expr_ptr = VN_EXPR::Create_Literal(STC_val(cr->Const_id()));
00733 valnum = _valnum_vn_expr(exprid, vn_expr_ptr,
00734 _exprid_to_vn,
00735 *_status.locked_to_vn);
00736 break;
00737
00738 case CK_IVAR:
00739 if (cr->Opr() == OPR_PARM)
00740 {
00741
00742
00743
00744
00745 is_parm = TRUE;
00746 valnum = _valnum_expr(cr->Ilod_base());
00747 if (cr->Is_ivar_volatile())
00748 _set_valnum(exprid, VN_VALNUM::Bottom(),
00749 _exprid_to_vn,
00750 *_status.locked_to_vn);
00751 else
00752 _set_valnum(exprid, valnum,
00753 _exprid_to_vn,
00754 *_status.locked_to_vn);
00755 }
00756 else
00757 valnum = _valnum_memloc_load(cr);
00758 break;
00759
00760 case CK_OP:
00761 valnum = _valnum_op(cr);
00762 break;
00763
00764 case CK_VAR:
00765
00766
00767
00768
00769
00770
00771 valnum = _valnum_sym(cr);
00772 if (valnum.is_top())
00773 valnum = VN_VALNUM::Bottom();
00774 break;
00775
00776 case CK_DELETED:
00777 default:
00778 FmtAssert(FALSE, ("Unexpected CODEREP kind in VN::_valnum_expr()"));
00779 break;
00780 }
00781 }
00782
00783
00784
00785
00786
00787
00788 if (!is_parm)
00789 _set_stmt_map(cr->Kind(), exprid, valnum);
00790
00791 if (Vn_Tracing(exprid))
00792 _trace(exprid, valnum);
00793
00794 return valnum;
00795 }
00796
00797
00798 VN_VALNUM
00799 VN::_valnum_implicit_integral_cvt(EXPRID exprid,
00800 VN_VALNUM opnd_valnum,
00801 MTYPE from_mty,
00802 MTYPE to_mty,
00803 VALNUM_VECTOR &exprid_to_vn,
00804 BIT_VECTOR &locked_to_vn)
00805 {
00806
00807
00808
00809
00810 VN_EXPR::PTR expr = NULL;
00811 OPCODE opc;
00812 INT need_cvt = Need_Integral_Conversion(from_mty, to_mty, &opc);
00813
00814 Is_True(!opnd_valnum.is_top() && !opnd_valnum.is_bottom(),
00815 ("Unexpected T or _|_ in VN::_valnum_implicit_integral_cvt"));
00816 Is_True(need_cvt != NOT_AT_ALL,
00817 ("Unexpected types in VN::_valnum_implicit_integral_cvt"));
00818
00819
00820
00821 if (need_cvt == NEED_CVT)
00822 {
00823 expr = VN_EXPR::Create_Unary(opc, opnd_valnum);
00824 }
00825 else if (need_cvt == NEED_CVTL)
00826 {
00827 Is_True(OPCODE_operator(opc) == OPR_CVTL,
00828 ("Unexpected conversion in VN::_valnum_implicit_integral_cvt"));
00829
00830 const VN_VALNUM bitsize_valnum = _valnum_integer(MTYPE_bit_size(to_mty),
00831 CVTL_BITSIZE_IS_SIGNED);
00832
00833 expr = VN_EXPR::Create_Binary(opc, opnd_valnum, bitsize_valnum);
00834 }
00835
00836
00837
00838
00839
00840
00841 return _valnum_vn_expr(exprid, expr, exprid_to_vn, locked_to_vn);
00842 }
00843
00844
00845 VN_VALNUM
00846 VN::_valnum_lhs(EXPRID lhs_exprid,
00847 VN_VALNUM valnum,
00848 MTYPE lhs_dty,
00849 MTYPE lhs_dscty,
00850 MTYPE rhs_dty)
00851 {
00852
00853
00854
00855
00856
00857 const BOOL is_multi_scalar_mstore = (lhs_dscty == MTYPE_M &&
00858 rhs_dty != MTYPE_M);
00859 BOOL do_cvt1 =
00860 Need_Integral_Conversion(rhs_dty, lhs_dscty, NULL) != NOT_AT_ALL;
00861 #ifdef KEY // bug 11738: honor truncation effect of store
00862 if (! do_cvt1 &&
00863 MTYPE_is_integral(lhs_dscty) &&
00864 MTYPE_byte_size(lhs_dscty) <= 4) {
00865 if (_vn_to_expr[valnum] != NULL &&
00866 _vn_to_expr[valnum]->get_kind() == VN_EXPR::LITERAL) {
00867 TCON tcon = _vn_to_expr[valnum]->get_tcon();
00868 if (MTYPE_signed(lhs_dscty)) {
00869 INT64 v = Targ_To_Host(tcon);
00870 if (((v << 32) >> 32) != Targ_To_Host(tcon)) {
00871 do_cvt1 = TRUE;
00872 rhs_dty = TCON_ty(tcon);
00873 }
00874 }
00875 else {
00876 UINT64 v = Targ_To_Host(tcon);
00877 if (((v << 32) >> 32) != (UINT64) Targ_To_Host(tcon)) {
00878 do_cvt1 = TRUE;
00879 rhs_dty = TCON_ty(tcon);
00880 }
00881 }
00882 }
00883 }
00884 #endif
00885
00886 const BOOL do_cvt2 =
00887 Need_Integral_Conversion(lhs_dscty, lhs_dty, NULL) != NOT_AT_ALL;
00888
00889 Is_True(!valnum.is_top(), ("Unexpected Top() valnum in VN::_valnum_lhs"));
00890
00891 if (is_multi_scalar_mstore || valnum.is_bottom())
00892 {
00893
00894
00895
00896 valnum = _unique_valnum(lhs_exprid,
00897 _exprid_to_vn,
00898 *_status.locked_to_vn);
00899 _set_valnum(lhs_exprid,
00900 valnum,
00901 _exprid_to_vn,
00902 *_status.locked_to_vn);
00903 }
00904 else if (do_cvt1 && do_cvt2)
00905 {
00906 valnum = _valnum_implicit_integral_cvt(lhs_exprid, valnum,
00907 rhs_dty, lhs_dscty,
00908 *_status.exprid_to_vn2,
00909 *_status.locked_to_vn2);
00910
00911 (*_status.is_numbered)[lhs_exprid] = FALSE;
00912 valnum = _valnum_implicit_integral_cvt(lhs_exprid, valnum,
00913 lhs_dscty, lhs_dty,
00914 _exprid_to_vn,
00915 *_status.locked_to_vn);
00916 }
00917 else if (do_cvt1)
00918 {
00919 valnum = _valnum_implicit_integral_cvt(lhs_exprid, valnum,
00920 rhs_dty, lhs_dscty,
00921 _exprid_to_vn,
00922 *_status.locked_to_vn);
00923 }
00924 else if (do_cvt2)
00925 {
00926 valnum = _valnum_implicit_integral_cvt(lhs_exprid, valnum,
00927 lhs_dscty, lhs_dty,
00928 _exprid_to_vn,
00929 *_status.locked_to_vn);
00930 }
00931 else
00932 {
00933 _set_valnum(lhs_exprid, valnum,
00934 _exprid_to_vn,
00935 *_status.locked_to_vn);
00936 }
00937 return valnum;
00938 }
00939
00940
00941 VN_VALNUM
00942 VN::_valnum_memloc_load(CODEREP *cr)
00943 {
00944 const OPERATOR opr = cr->Opr();
00945 MTYPE dtype = cr->Dtyp();
00946 MTYPE dsctype = cr->Dsctyp();
00947 const WN_OFFSET offset_val = cr->Offset();
00948 CODEREP *const vsym = cr->Get_ivar_vsym();
00949 const VN_VALNUM vsym_valnum = _valnum_sym(vsym);
00950 const VN_VALNUM base_addr = _valnum_expr(cr->Ilod_base());
00951
00952
00953
00954 VN_VALNUM bytesize;
00955 VN_VALNUM offset;
00956
00957 switch (opr)
00958 {
00959 case OPR_ILOAD:
00960 case OPR_ILDBITS:
00961 case OPR_PREFETCH:
00962 bytesize = _valnum_integer(MTYPE_byte_size(dsctype), TRUE);
00963 offset = _valnum_integer(offset_val, TRUE);
00964 break;
00965
00966 case OPR_MLOAD:
00967 dsctype = MTYPE_M;
00968 bytesize = _valnum_expr(cr->Mload_size());
00969 offset = _valnum_integer(offset_val, TRUE);
00970 break;
00971
00972 case OPR_ILOADX:
00973 bytesize = _valnum_integer(MTYPE_byte_size(dsctype), TRUE);
00974 offset = _valnum_expr(cr->Index());
00975 break;
00976
00977 default:
00978 FmtAssert(FALSE,
00979 ("Unexpected opcode for ivar in VN::_valnum_memloc_load()"));
00980 break;
00981 }
00982
00983
00984
00985
00986
00987
00988 if (cr->Is_ivar_volatile() || opr == OPR_ILDBITS)
00989 {
00990
00991
00992
00993
00994
00995 _set_valnum(_get_exprid(cr), VN_VALNUM::Bottom(),
00996 _exprid_to_vn,
00997 *_status.locked_to_vn);
00998 return VN_VALNUM::Bottom();
00999 }
01000 else
01001 {
01002 VN_VALNUM valnum;
01003 const EXPRID exprid = _get_exprid(cr);
01004 const VN_EXPR::PTR vn_expr_ptr =
01005 VN_EXPR::Create_Memloc(dsctype,
01006 bytesize, offset, base_addr, vsym_valnum);
01007
01008
01009
01010 if (Need_Integral_Conversion(dsctype, dtype, NULL) != NOT_AT_ALL)
01011 {
01012
01013
01014
01015
01016 valnum = _valnum_vn_expr(exprid, vn_expr_ptr,
01017 *_status.exprid_to_vn2,
01018 *_status.locked_to_vn2);
01019
01020
01021
01022
01023 (*_status.is_numbered)[exprid] = FALSE;
01024 valnum = _valnum_implicit_integral_cvt(exprid,
01025 valnum,
01026 dsctype,
01027 dtype,
01028 _exprid_to_vn,
01029 *_status.locked_to_vn);
01030 }
01031 else
01032 {
01033 valnum = _valnum_vn_expr(exprid, vn_expr_ptr,
01034 _exprid_to_vn,
01035 *_status.locked_to_vn);
01036 }
01037
01038
01039
01040 if (!valnum.is_bottom())
01041 _set_stmt_map(cr->Kind(), exprid, valnum);
01042
01043 return valnum;
01044 }
01045 }
01046
01047
01048 void
01049 VN::_valnum_memloc_store(CODEREP *lhs,
01050 VN_VALNUM rhs_valnum,
01051 MTYPE rhs_mtype)
01052 {
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070 Is_True(lhs->Kind() == CK_IVAR &&
01071 !(*_status.is_numbered)[_get_exprid(lhs)],
01072 ("Unexpected CODEREP in VN::_valnum_memloc_store()"));
01073
01074 const OPCODE opc = lhs->Op();
01075 MTYPE dtype = lhs->Dtyp();
01076 MTYPE dsctype = lhs->Dsctyp();
01077 const WN_OFFSET offset_val = lhs->Offset();
01078 CODEREP *const vsym = lhs->Get_ivar_vsym();
01079 const VN_VALNUM base_addr = _valnum_expr(lhs->Istr_base());
01080
01081
01082
01083 VN_VALNUM bytesize;
01084 VN_VALNUM offset;
01085
01086 switch (OPCODE_operator(opc))
01087 {
01088 case OPR_ILOAD:
01089 bytesize = _valnum_integer(MTYPE_byte_size(dsctype), TRUE);
01090 offset = _valnum_integer(offset_val, TRUE);
01091 break;
01092
01093 case OPR_MLOAD:
01094 dsctype = MTYPE_M;
01095 bytesize = _valnum_expr(lhs->Mstore_size());
01096 offset = _valnum_integer(offset_val, TRUE);
01097 break;
01098
01099 case OPR_ILOADX:
01100 bytesize = _valnum_integer(MTYPE_byte_size(dsctype), TRUE);
01101 offset = _valnum_expr(lhs->Index());
01102 break;
01103
01104 default:
01105 FmtAssert(FALSE,
01106 ("Unexpected opcode for ivar in VN::_valnum_memloc_store()"));
01107 break;
01108 }
01109
01110 if (lhs->Is_ivar_volatile())
01111 {
01112
01113
01114
01115
01116 _set_valnum(_get_exprid(lhs), VN_VALNUM::Bottom(),
01117 _exprid_to_vn,
01118 *_status.locked_to_vn);
01119 }
01120 else
01121 {
01122 VN_VALNUM lhs_valnum = _valnum_lhs(_get_exprid(lhs),
01123 rhs_valnum,
01124 dtype,
01125 dsctype,
01126 rhs_mtype);
01127
01128
01129
01130 const VN_VALNUM vsym_valnum = _valnum_sym(vsym);
01131 const VN_EXPR::PTR expr =
01132 VN_EXPR::Create_Memloc(dsctype,
01133 bytesize, offset, base_addr, vsym_valnum);
01134 VN_EXPR::PTR simplified = expr->simplify(this);
01135
01136
01137
01138
01139
01140
01141 if (!simplified->has_bottom_opnd())
01142 {
01143 VN_HASHTAB::EXPR_MAPPING map =
01144 _status.expr_to_vn->lookup_or_insert(simplified, lhs_valnum);
01145 Is_True(simplified == map.first,
01146 ("Unexpected match found for CK_IVAR in "
01147 "_valnum_memloc_store"));
01148 }
01149 else
01150 {
01151 simplified->free();
01152 }
01153 }
01154 }
01155
01156
01157 void
01158 VN::_valnum_phi_list(IDTYPE bb_id,
01159 PHI_LIST *phi_list)
01160 {
01161
01162
01163
01164
01165
01166
01167 PHI_NODE *phi;
01168 PHI_LIST_ITER phi_iter;
01169
01170 FOR_ALL_ELEM(phi, phi_iter, Init(phi_list))
01171 {
01172 if (phi->Live())
01173 {
01174 CODEREP * const phi_result = phi->RESULT();
01175 const EXPRID phi_id = _get_exprid(phi_result);
01176
01177 Is_True(phi_result->Kind() == CK_VAR,
01178 ("Unexpected kind of phi result in VN::_valnum_phi_list"));
01179
01180 if ((*_status.is_numbered)[phi_id])
01181 {
01182
01183 }
01184 else if (phi_result->Is_flag_set(CF_IS_ZERO_VERSION))
01185 {
01186
01187
01188 _set_valnum(phi_id,
01189 VN_VALNUM::Bottom(),
01190 _exprid_to_vn,
01191 *_status.locked_to_vn);
01192 }
01193 else
01194 {
01195 VN_EXPR::PTR phi_expr = VN_EXPR::Create_Phi(phi->Size(), bb_id);
01196
01197 for (INT i = 0; i < phi->Size(); i++)
01198 {
01199 CODEREP * const phi_opnd = phi->OPND(i);
01200
01201 if (phi_opnd != NULL &&
01202 Need_Integral_Conversion(phi_opnd->Dtyp(),
01203 phi_result->Dsctyp(),
01204 NULL) != NOT_AT_ALL)
01205 {
01206
01207
01208
01209
01210
01211
01212 phi_expr->set_opnd(i, VN_VALNUM::Bottom());
01213 }
01214 else
01215 {
01216 phi_expr->set_opnd(i, _valnum_sym(phi_opnd));
01217 }
01218 }
01219
01220 const MTYPE dtype = phi_result->Dtyp();
01221 const MTYPE dsctype = phi_result->Dsctyp();
01222
01223 if (Need_Integral_Conversion(dsctype, dtype, NULL) != NOT_AT_ALL)
01224 {
01225
01226
01227
01228
01229 VN_VALNUM valnum = _valnum_vn_expr(phi_id, phi_expr,
01230 *_status.exprid_to_vn2,
01231 *_status.locked_to_vn2);
01232
01233
01234
01235
01236 (*_status.is_numbered)[phi_id] = FALSE;
01237 (void) _valnum_implicit_integral_cvt(phi_id,
01238 valnum,
01239 dsctype,
01240 dtype,
01241 _exprid_to_vn,
01242 *_status.locked_to_vn);
01243 }
01244 else
01245 {
01246 (void)_valnum_vn_expr(phi_id, phi_expr,
01247 _exprid_to_vn,
01248 *_status.locked_to_vn);
01249 }
01250
01251 if (Vn_Tracing(phi_id))
01252 _trace(phi_id, _exprid_to_vn[phi_id]);
01253 }
01254 }
01255 }
01256 }
01257
01258
01259 void
01260 VN::_valnum_chi_list(CHI_LIST *chi_list)
01261 {
01262
01263
01264
01265 CHI_LIST_ITER chi_iter;
01266 CHI_NODE *chi;
01267 FOR_ALL_NODE(chi, chi_iter, Init(chi_list))
01268 {
01269 if (chi->Live())
01270 {
01271 CODEREP *chi_result = chi->RESULT();
01272 EXPRID chi_id = _get_exprid(chi_result);
01273
01274 Is_True(chi_result->Kind() == CK_VAR,
01275 ("Unexpected coderep kind in VN::_valnum_chi_list()"));
01276
01277 if ((*_status.is_numbered)[chi_id])
01278 {
01279
01280 }
01281 else if (chi_result->Is_var_volatile() ||
01282 chi_result->Is_flag_set(CF_IS_ZERO_VERSION))
01283 {
01284
01285 _set_valnum(chi_id,
01286 VN_VALNUM::Bottom(),
01287 _exprid_to_vn,
01288 *_status.locked_to_vn);
01289 }
01290 else
01291 {
01292 VN_VALNUM valnum = _unique_valnum(chi_id,
01293 _exprid_to_vn,
01294 *_status.locked_to_vn);
01295
01296
01297 _set_valnum(chi_id,
01298 valnum,
01299 _exprid_to_vn,
01300 *_status.locked_to_vn);
01301 }
01302 }
01303 }
01304 }
01305
01306
01307 void
01308 VN::_valnum_stmt(STMTREP *stmt)
01309 {
01310 CODEREP *rhs = stmt->Rhs();
01311 CODEREP *lhs = stmt->Lhs();
01312 VN_VALNUM vn;
01313
01314
01315
01316
01317 if (stmt->Has_chi())
01318 {
01319 _valnum_chi_list(stmt->Chi_list());
01320 }
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330 _current_stmt = stmt;
01331 if (OPCODE_is_fake(stmt->Op()))
01332 {
01333
01334 _set_valnum(_get_exprid(rhs),
01335 VN_VALNUM::Bottom(),
01336 _exprid_to_vn,
01337 *_status.locked_to_vn);
01338
01339 for (INT32 i = 0; i < rhs->Kid_count(); i++)
01340 {
01341 _valnum_expr(rhs->Opnd(i));
01342 }
01343 }
01344 else if (!stmt->Black_box())
01345 {
01346 switch (OPCODE_operator(stmt->Op()))
01347 {
01348 case OPR_STID:
01349 Is_True(lhs->Kind() == CK_VAR &&
01350 !(*_status.is_numbered)[_get_exprid(lhs)],
01351 ("Unexpected opc for lhs of STID in VN::_valnum_stmt"));
01352
01353
01354
01355
01356 Is_True(!lhs->Is_flag_set(CF_IS_ZERO_VERSION),
01357 ("Unexpected 0 version as lhs of stid in VN::_valnum_stmt"));
01358
01359
01360
01361 vn = _valnum_expr(rhs);
01362
01363
01364
01365 if (lhs->Is_var_volatile())
01366 {
01367
01368
01369
01370
01371 _set_valnum(_get_exprid(lhs), VN_VALNUM::Bottom(),
01372 _exprid_to_vn,
01373 *_status.locked_to_vn);
01374 vn = VN_VALNUM::Bottom();
01375 }
01376 else
01377 {
01378 vn = _valnum_lhs(_get_exprid(lhs), vn,
01379 lhs->Dtyp(), lhs->Dsctyp(), rhs->Dtyp());
01380 }
01381 break;
01382
01383 case OPR_ISTORE:
01384 case OPR_ISTBITS:
01385 case OPR_MSTORE:
01386 case OPR_ISTOREX:
01387 Is_True(lhs->Kind() == CK_IVAR &&
01388 !(*_status.is_numbered)[_get_exprid(lhs)],
01389 ("Unexpected opc for lhs of ISTORE in VN::_valnum_stmt"));
01390
01391 vn = _valnum_expr(rhs);
01392 _valnum_memloc_store(lhs, vn, rhs->Dtyp());
01393 break;
01394
01395 case OPR_PREFETCH:
01396 Is_True(rhs->Kind() == CK_IVAR &&
01397 !(*_status.is_numbered)[_get_exprid(rhs)],
01398 ("Unexpected opc for lhs of PREFETCH in VN::_valnum_stmt"));
01399
01400 _valnum_memloc_load(rhs);
01401 break;
01402
01403 default:
01404 if (lhs)
01405 _valnum_expr(lhs);
01406 if (rhs)
01407 _valnum_expr(rhs);
01408 break;
01409
01410 }
01411 }
01412 _current_stmt = NULL;
01413 }
01414
01415
01416 void
01417 VN::_valnum_cfg(CFG *cfg)
01418 {
01419
01420
01421
01422
01423
01424
01425 BB_NODE *bb;
01426
01427 RPOBB_ITER cfg_iter(cfg);
01428
01429 FOR_ALL_ELEM(bb, cfg_iter, Init())
01430 {
01431 _valnum_phi_list(bb->Id(), bb->Phi_list());
01432
01433 STMTREP *stmt;
01434 STMTREP_ITER stmt_iter(bb->Stmtlist());
01435 FOR_ALL_NODE(stmt, stmt_iter, Init())
01436 {
01437 _valnum_stmt(stmt);
01438 }
01439 }
01440 }
01441
01442
01443 void
01444 VN::_print_exprid_to_vn(FILE *fp, EXPRID id, INT32 column_width) const
01445 {
01446
01447
01448
01449
01450
01451
01452 INT32 buf_idx;
01453 char buf[64];
01454 const VN_VALNUM valnum = _exprid_to_vn[id];
01455
01456 Is_True(column_width < sizeof(buf),
01457 ("Too large column width in VN::_print_exprid_to_vn"));
01458
01459 buf_idx = sprintf(buf, "cr%d ==> ", id);
01460 if (valnum.is_top())
01461 buf_idx += VN_VALNUM::Bottom().sprint(&buf[buf_idx]);
01462 else
01463 buf_idx += valnum.sprint(&buf[buf_idx]);
01464
01465 while (buf_idx < column_width) buf[buf_idx++] = ' ';
01466 buf[buf_idx] = '\0';
01467
01468 fputs(buf, fp);
01469 }
01470
01471
01472 void
01473 VN::_print_vn_to_exprid(FILE *fp,
01474 const VALNUM_TO_EXPR_LIST &vn_to_exprid,
01475 VN_VALNUM valnum) const
01476 {
01477
01478
01479
01480 VALNUM_TO_EXPR_LIST::EXPR_ITERATOR itr = vn_to_exprid.begin(valnum);
01481 VALNUM_TO_EXPR_LIST::EXPR_ITERATOR end = vn_to_exprid.end(valnum);
01482
01483
01484
01485
01486 valnum.print(fp);
01487 if (_vn_to_expr[valnum] == NULL)
01488 {
01489 fputs(" ==> ...Chi result, or has Bottom opnd", fp);
01490 }
01491 else
01492 {
01493 fputs(" ==> ", fp);
01494 _vn_to_expr[valnum]->print(fp);
01495 }
01496
01497
01498
01499
01500 if (itr != end)
01501 {
01502 fputs(" ==> {", fp);
01503 for (BOOL first_cr = TRUE; itr != end; itr++)
01504 {
01505 if (!first_cr)
01506 fputc(',', fp);
01507 else
01508 first_cr = FALSE;
01509
01510 fprintf(fp, "cr%d", (INT32)*itr);
01511 }
01512 fputs("}\n", fp);
01513 }
01514 else
01515 {
01516 fputc('\n', fp);
01517 }
01518 }
01519
01520
01521 VN::VN(VN_ALGORITHM algo,
01522 CFG *cfg,
01523 CODEMAP *codemap,
01524 MEM_POOL *lpool,
01525 MEM_POOL *gpool):
01526 _lpool(lpool),
01527 _gpool(gpool),
01528 _current_stmt(NULL),
01529 _no_of_iterations(0),
01530 _zero_valnum(VN_VALNUM::Bottom()),
01531 _next_valnum(VN_VALNUM::First()),
01532 _vn_to_expr(gpool),
01533 _exprid_to_cr(codemap->Coderep_id_cnt(),
01534 (CODEREP *) NULL,
01535 CODEREP_VECTOR::allocator_type(gpool)),
01536 _exprid_to_vn(codemap->Coderep_id_cnt(),
01537 Initial_Valnum(algo),
01538 VALNUM_VECTOR::allocator_type(gpool)),
01539 _exprid_to_stmtlist(codemap->Coderep_id_cnt(),
01540 STMT_LIST(STMT_ALLOCATOR(gpool)),
01541 STMTLIST_VECTOR::allocator_type(gpool))
01542 {
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554 Is_True(lpool == Malloc_Mem_Pool || lpool != gpool,
01555 ("Value numbering (VN::VN) requires two different memory pools"));
01556
01557
01558
01559
01560
01561 OPT_POOL_Push(_lpool, -1);
01562 {
01563 VN_HASHTAB expr_to_vn(codemap->Coderep_id_cnt(),
01564 _lpool);
01565 BIT_VECTOR locked_to_vn(codemap->Coderep_id_cnt(),
01566 bool(FALSE),
01567 BVECTOR_ALLOCATOR(_lpool));
01568 BIT_VECTOR is_numbered(codemap->Coderep_id_cnt(),
01569 bool(FALSE),
01570 BVECTOR_ALLOCATOR(_lpool));
01571
01572
01573
01574
01575
01576 BIT_VECTOR locked_to_vn2(codemap->Coderep_id_cnt(),
01577 bool(FALSE),
01578 BVECTOR_ALLOCATOR(_lpool));
01579 VALNUM_VECTOR exprid_to_vn2(codemap->Coderep_id_cnt(),
01580 Initial_Valnum(algo),
01581 VALNUM_VECTOR::allocator_type(gpool));
01582
01583 _status.expr_to_vn = &expr_to_vn;
01584 _status.is_numbered = &is_numbered;
01585 _status.locked_to_vn = &locked_to_vn;
01586 _status.locked_to_vn2 = &locked_to_vn2;
01587 _status.exprid_to_vn2 = &exprid_to_vn2;
01588
01589
01590
01591 _init_integer_valnum_map();
01592
01593
01594
01595 do
01596 {
01597 _status.changed = FALSE;
01598 _valnum_cfg(cfg);
01599 expr_to_vn.clear();
01600
01601
01602
01603 is_numbered.clear();
01604 is_numbered.insert(is_numbered.end(),
01605 is_numbered.capacity(),
01606 bool(FALSE));
01607
01608
01609
01610
01611
01612
01613
01614
01615 if (_status.changed && algo == ITERATIVE)
01616 {
01617
01618
01619 VN_VALNUM valnum =
01620 VN_VALNUM::Next(_get_literal_valnum(VN_MAX_PREDEFINED_INT));
01621
01622
01623
01624
01625 while (valnum <= _vn_to_expr.last())
01626 {
01627 VN_EXPR::PTR vn_expr = _vn_to_expr[valnum];
01628
01629 if (vn_expr != NULL)
01630 {
01631 if (vn_expr->get_kind() == VN_EXPR::LITERAL)
01632 expr_to_vn.lookup_or_insert(vn_expr, valnum);
01633 else
01634 {
01635 _vn_to_expr.set_map(valnum, NULL);
01636 vn_expr->free();
01637 }
01638 }
01639 valnum = VN_VALNUM::Next(valnum);
01640 }
01641 }
01642 _no_of_iterations++;
01643 } while (_status.changed && algo == ITERATIVE);
01644
01645 _status.expr_to_vn = NULL;
01646 _status.is_numbered = NULL;
01647 _status.locked_to_vn = NULL;
01648 _status.locked_to_vn2 = NULL;
01649 _status.exprid_to_vn2 = NULL;
01650 _status.changed = FALSE;
01651 }
01652 OPT_POOL_Pop(_lpool, -1);
01653 }
01654
01655
01656 VN::~VN()
01657 {
01658 _vn_to_expr.reset_all_exprs();
01659 }
01660
01661
01662 void
01663 VN::print(FILE *fp, BOOL emit_stmt_maps) const
01664 {
01665 INT32 i;
01666 VALNUM_VECTOR::size_type no_of_codereps = _exprid_to_vn.size();
01667
01668 fprintf(fp, "%sGLOBAL VALUE NUMBERING (iterations = %d)\n%s",
01669 DBar, _no_of_iterations, DBar);
01670
01671
01672
01673 const INT32 start_col1 = 0;
01674 const INT32 start_col2 = (no_of_codereps + 2)/3;
01675 const INT32 start_col3 = 2*(no_of_codereps + 2)/3;
01676
01677 for (i = 0; i < start_col2; i++)
01678 {
01679 _print_exprid_to_vn(fp, i+start_col1, 20 );
01680 if (i+start_col2 < no_of_codereps)
01681 _print_exprid_to_vn(fp, i+start_col2, 20 );
01682 if (i+start_col3 < no_of_codereps)
01683 _print_exprid_to_vn(fp, i+start_col3, 20 );
01684 fputc('\n', fp);
01685 }
01686 fputc('\n', fp);
01687
01688
01689
01690
01691
01692
01693
01694 OPT_POOL_Push(_lpool, -1);
01695 {
01696 const VALNUM_TO_EXPR_LIST vn_to_exprid(*this, _lpool);
01697 char buf0[16];
01698 char buf1[16];
01699 const VN_VALNUM last = last_valnum();
01700 const VN_VALNUM last_predefined_int =
01701 _get_literal_valnum(VN_MAX_PREDEFINED_INT);
01702
01703
01704
01705 _zero_valnum.sprint(buf0);
01706 last_predefined_int.sprint(buf1);
01707 fprintf(fp,
01708 "NOTE: Integers 0..%d are mapped to %s to %s respectively!\n\n",
01709 VN_MAX_PREDEFINED_INT, buf0, buf1);
01710
01711
01712
01713
01714 for (VN_VALNUM next = VN_VALNUM::First();
01715 next <= last;
01716 next = VN_VALNUM::Next(next))
01717 {
01718 if (next < _zero_valnum ||
01719 next > last_predefined_int ||
01720 !vn_to_exprid.is_empty(next))
01721 {
01722 _print_vn_to_exprid(fp, vn_to_exprid, next);
01723 }
01724 }
01725 fputc('\n', fp);
01726 }
01727 OPT_POOL_Pop(_lpool, -1);
01728
01729
01730
01731
01732 if (emit_stmt_maps)
01733 {
01734 for (i = 0; i < _exprid_to_stmtlist.size(); i++)
01735 {
01736 const STMT_LIST::const_iterator stmt_begin =
01737 _exprid_to_stmtlist[i].begin();
01738 const STMT_LIST::const_iterator stmt_end =
01739 _exprid_to_stmtlist[i].end();
01740
01741 for (STMT_LIST::const_iterator stmt_it = stmt_begin;
01742 stmt_it != stmt_end;
01743 stmt_it++)
01744 {
01745 if (stmt_it == stmt_begin)
01746 fprintf(fp, "cr%d ==> {", i);
01747 else
01748 fputc(',', fp);
01749
01750 fprintf(fp, "SR %p", *stmt_it);
01751 }
01752 if (stmt_begin != stmt_end)
01753 fputs("}\n", fp);
01754 }
01755 fputc('\n', fp);
01756 }
01757 }
01758
01759
01760 VALNUM_TO_EXPR_LIST::VALNUM_TO_EXPR_LIST(const VN &vn, MEM_POOL *mpool):
01761 _map(vn.last_valnum().ordinal() + 1,
01762 EXPR_LIST(EXPRID_ALLOCATOR(mpool)),
01763 EXPRLIST_ALLOCATOR(mpool))
01764 {
01765 VN::EXPRID max_exprid = vn.last_exprid();
01766
01767 for (INT32 i = 0; i <= max_exprid; i++)
01768 {
01769 const VN_VALNUM valnum = vn.expr_valnum(i);
01770
01771 if (!valnum.is_top() && !valnum.is_bottom())
01772 _map[valnum.ordinal()].push_front(i);
01773 }
01774 }