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 #ifdef USE_PCH
00060 #include "opt_pch.h"
00061 #endif // USE_PCH
00062 #pragma hdrstop
00063
00064
00065 #ifdef _KEEP_RCS_ID
00066 #define opt_wn_CXX "opt_wn.cxx"
00067 static char *rcs_id = opt_wn_CXX"$Revision: 1.31 $";
00068 #endif
00069
00070 #include <sys/types.h>
00071 #if ! defined(BUILD_OS_DARWIN)
00072 #include <elf.h>
00073 #endif
00074 #include "defs.h"
00075 #include "tracing.h"
00076 #include "mempool.h"
00077 #include "opt_base.h"
00078 #include "topcode.h"
00079
00080 #include "wn.h"
00081 #include "wn_util.h"
00082 #include "pu_info.h"
00083 #include "stab.h"
00084 #include "w2op.h"
00085 #include "stblock.h"
00086 #include "region_util.h"
00087 #include "opt_wn.h"
00088 #include "ir_reader.h"
00089 #include "opt_sym.h"
00090 #include "stab.h"
00091 #include "opt_htable.h"
00092 #include "opt_mu_chi.h"
00093 #include "dep_graph.h"
00094 #include "pf_cg.h"
00095 #include "opt_alias_interface.h"
00096 #include "opt_points_to.h"
00097 #include "opt_alias_rule.h"
00098 #include "config.h"
00099 #include "config_opt.h"
00100 #include "opt_cvtl_rule.h"
00101 #include "opt_main.h"
00102
00103
00104 STMT_ITER::STMT_ITER(WN *f)
00105 {
00106 head = cur = f;
00107 for (tail = f; WN_next(tail) != NULL; tail = WN_next(tail));
00108 }
00109
00110 void
00111 STMT_ITER::Print( FILE *fp )
00112 {
00113 for (First(); !Is_Empty(); Next()) {
00114 if (OPCODE_is_scf(WN_opcode(Cur())))
00115 fdump_wn_no_st( fp, Cur() );
00116 else
00117 fdump_tree_no_st( fp, Cur() );
00118 }
00119 }
00120
00121 void
00122 STMT_CONTAINER::Insert_before(WN *me, WN *wn)
00123 {
00124
00125 WN *p, *n;
00126 if (me == NULL) return;
00127 p = WN_prev(me); n = me;
00128 if (p) {
00129 WN_next(p) = wn;
00130 WN_prev(wn) = p;
00131 }
00132 WN_prev(n) = wn;
00133 WN_next(wn) = n;
00134 if (me == head) head = wn;
00135 }
00136
00137 void
00138 STMT_CONTAINER::Insert_after (WN *me, WN *wn)
00139 {
00140
00141 WN *p, *n;
00142 if (me == NULL) return;
00143 p = me; n = WN_next(me);
00144 WN_next(p) = wn;
00145 WN_prev(wn) = p;
00146 if (n) {
00147 WN_prev(n) = wn;
00148 WN_next(wn) = n;
00149 }
00150 if (me == tail) tail = wn;
00151 }
00152
00153 void
00154 STMT_CONTAINER::Insert_lst_before(WN *me, WN *wn_f, WN *wn_l)
00155 {
00156
00157 WN *p, *n;
00158 if (me == NULL) return;
00159 if (wn_f == NULL) {
00160
00161 Is_True(wn_l == NULL,
00162 ("STMT_CONTAINER::Insert_lst_before: wn_l non-null") );
00163 return;
00164 }
00165 p = WN_prev(me); n = me;
00166 if (p) WN_next(p) = wn_f;
00167 WN_prev(wn_f) = p;
00168 WN_prev(n) = wn_l;
00169 WN_next(wn_l) = n;
00170 if (me == head) head = wn_f;
00171 }
00172
00173 void
00174 STMT_CONTAINER::Insert_lst_after (WN *me, WN *wn_f, WN *wn_l)
00175 {
00176
00177 WN *p, *n;
00178 if (me == NULL) return;
00179 if (wn_f == NULL) {
00180
00181 Is_True(wn_l == NULL,
00182 ("STMT_CONTAINER::Insert_lst_after: wn_l non-null") );
00183 return;
00184 }
00185 p = me; n = WN_next(me);
00186 WN_next(p) = wn_f;
00187 WN_prev(wn_f) = p;
00188 if (n) WN_prev(n) = wn_l;
00189 WN_next(wn_l) = n;
00190 if (me == tail) tail = wn_l;
00191 }
00192
00193 void
00194 STMT_CONTAINER::Remove(WN *me)
00195 {
00196
00197 WN *p, *n;
00198 if (me == NULL) return;
00199 p = WN_prev(me); n = WN_next(me);
00200 if (p) WN_next(p) = n;
00201 if (n) WN_prev(n) = p;
00202
00203 WN_prev(me) = NULL;
00204 WN_next(me) = NULL;
00205 if (me == head)
00206 head = n;
00207 if (me == tail)
00208 tail = p;
00209 }
00210
00211 void
00212 STMT_CONTAINER::Print(FILE *fp)
00213 {
00214 STMT_ITER stmt_iter(head, tail);
00215 stmt_iter.Print(fp);
00216 }
00217
00218
00219 WN *WN_copy(WN *wn)
00220 {
00221 return WN_COPY_Tree(wn);
00222 }
00223
00224 MTYPE Mtype_from_class_size(MTYPE t1, MTYPE t2)
00225
00226
00227 {
00228 Is_True(t1 != MTYPE_BS && t2 != MTYPE_BS,
00229 ("Mtype_from_class_size: MTYPE_BS not handled here."));
00230 if ((MTYPE_type_class(t1) & MTYPE_CLASS_UNSIGNED_INTEGER) == 0)
00231 return t1;
00232 #ifdef KEY
00233 if (MTYPE_is_vector(t1))
00234 return t1;
00235 #endif
00236 if (MTYPE_signed(t1))
00237 switch (MTYPE_size_best(t2)) {
00238 case 8: return MTYPE_I1;
00239 case 16: return MTYPE_I2;
00240 case 32: return MTYPE_I4;
00241 case 64: return MTYPE_I8;
00242 default: Is_True(FALSE, ("WN_mtype_from_class_size: unrecognized bit size for mtype"));
00243 }
00244 else
00245 switch (MTYPE_size_best(t2)) {
00246 case 8: return MTYPE_U1;
00247 case 16: return MTYPE_U2;
00248 case 32: return MTYPE_U4;
00249 case 64: return MTYPE_U8;
00250 default: Is_True(FALSE, ("WN_mtype_from_class_size: unrecognized bit size for mtype"));
00251 }
00252 return MTYPE_V;
00253 }
00254
00255 BOOL WN_has_chi(const WN *wn, const REGION_LEVEL region_level)
00256 {
00257 const OPCODE opc = WN_opcode(wn);
00258 if (opc == OPC_REGION) {
00259 Is_True(region_level > RL_UNKNOWN && region_level < RL_LAST,
00260 ("WN_has_chi, region_level out of bounds"));
00261 RID *rid = REGION_get_rid(wn);
00262 Is_True(rid != NULL, ("WN_has_chi, NULL RID"));
00263 if (RID_TYPE_mp(rid) || RID_TYPE_eh(rid) ||
00264
00265 region_level == RL_LNO_PREOPT || region_level == RL_PREOPT ||
00266 region_level == RL_IPA_PREOPT)
00267 return FALSE;
00268 else
00269 return TRUE;
00270 }
00271 return OPCODE_has_chi(opc);
00272 }
00273
00274 BOOL OPERATOR_has_chi( OPERATOR opr )
00275 {
00276 switch ( opr ) {
00277 case OPR_ISTORE:
00278 case OPR_ISTOREX:
00279 case OPR_ISTBITS:
00280 case OPR_MSTORE:
00281 case OPR_STID:
00282 case OPR_STBITS:
00283 case OPR_CALL:
00284 case OPR_ICALL:
00285 case OPR_INTRINSIC_CALL:
00286 case OPR_IO:
00287 case OPR_FORWARD_BARRIER:
00288 case OPR_BACKWARD_BARRIER:
00289 case OPR_DEALLOCA:
00290 case OPR_OPT_CHI:
00291 case OPR_REGION:
00292 case OPR_ASM_STMT:
00293 return TRUE;
00294 default:
00295 return FALSE;
00296 }
00297 }
00298
00299 BOOL OPCODE_has_chi( OPCODE opc )
00300 {
00301 return OPERATOR_has_chi(OPCODE_operator(opc));
00302 }
00303
00304
00305
00306 BOOL WN_has_mu( const WN *wn, const REGION_LEVEL region_level )
00307 {
00308 const OPCODE opc = WN_opcode(wn);
00309 switch ( OPCODE_operator(opc) ) {
00310 #ifdef KEY
00311 case OPR_ASM_STMT:
00312 #endif
00313 case OPR_ILOAD:
00314 case OPR_ILDBITS:
00315 case OPR_ILOADX:
00316 case OPR_MLOAD:
00317 case OPR_CALL:
00318 case OPR_ICALL:
00319 case OPR_INTRINSIC_CALL:
00320 case OPR_IO:
00321 case OPR_RETURN:
00322 case OPR_RETURN_VAL:
00323 case OPR_FORWARD_BARRIER:
00324 case OPR_BACKWARD_BARRIER:
00325 case OPR_REGION_EXIT:
00326 #ifdef KEY
00327 case OPR_GOTO_OUTER_BLOCK:
00328 #endif
00329 return TRUE;
00330 case OPR_REGION:
00331 {
00332 Is_True(region_level > RL_UNKNOWN && region_level < RL_LAST,
00333 ("WN_has_mu, region_level out of bounds"));
00334 RID *rid = REGION_get_rid(wn);
00335 Is_True(rid != NULL, ("WN_has_mu(), NULL rid"));
00336 if (RID_TYPE_mp(rid) || RID_TYPE_eh(rid) ||
00337
00338 region_level == RL_LNO_PREOPT || region_level == RL_PREOPT ||
00339 region_level == RL_IPA_PREOPT)
00340 return FALSE;
00341 else
00342 return TRUE;
00343 }
00344 case OPR_PARM:
00345 #if defined(TARG_SL)
00346 return (WN_Parm_By_Reference(wn) || WN_Parm_Dereference(wn));
00347 #else
00348 return (WN_Parm_By_Reference(wn));
00349 #endif
00350 default:
00351 return FALSE;
00352 }
00353 }
00354
00355
00356 BOOL OPERATOR_has_mu( OPERATOR opr )
00357 {
00358 switch ( opr ) {
00359 #ifdef KEY
00360 case OPR_ASM_STMT:
00361 #endif
00362 case OPR_ILOAD:
00363 case OPR_ILDBITS:
00364 case OPR_ILOADX:
00365 case OPR_MLOAD:
00366 case OPR_CALL:
00367 case OPR_ICALL:
00368 case OPR_INTRINSIC_CALL:
00369 case OPR_IO:
00370 case OPR_RETURN:
00371 case OPR_RETURN_VAL:
00372 case OPR_FORWARD_BARRIER:
00373 case OPR_BACKWARD_BARRIER:
00374 case OPR_REGION:
00375 case OPR_REGION_EXIT:
00376 return TRUE;
00377 case OPR_PARM:
00378 return TRUE;
00379 default:
00380 return FALSE;
00381 }
00382 }
00383
00384 BOOL OPCODE_has_mu( OPCODE opc )
00385 {
00386 return OPERATOR_has_mu(OPCODE_operator(opc));
00387 }
00388
00389 static WN_MAP _wn_flag_map;
00390
00391 void WN_init_flags(MEM_POOL *pool)
00392 {
00393 _wn_flag_map = WN_MAP32_Create(pool);
00394 }
00395
00396 void WN_fini_flags(void)
00397 {
00398 WN_MAP_Delete(_wn_flag_map);
00399 }
00400
00401
00402
00403 INT32 Wn_flags(const WN *wn)
00404 {
00405 return WN_MAP32_Get(_wn_flag_map, wn);
00406 }
00407
00408
00409
00410 void Set_wn_flags(WN *wn, INT32 flags)
00411 {
00412 WN_MAP32_Set(_wn_flag_map, wn, flags);
00413 }
00414
00415
00416
00417
00418 BOOL WN_has_ver(const WN *wn)
00419 {
00420 OPERATOR opr = WN_operator(wn);
00421 return (OPERATOR_is_scalar_load (opr) || OPERATOR_is_scalar_store (opr));
00422 }
00423
00424
00425
00426 BOOL OPERATOR_has_aux(const OPERATOR opr)
00427 {
00428 return (OPERATOR_is_scalar_load (opr) ||
00429 OPERATOR_is_scalar_store (opr) ||
00430 opr == OPR_LDA);
00431 }
00432
00433 BOOL OPCODE_has_aux(const OPCODE opc)
00434 {
00435 return OPERATOR_has_aux(OPCODE_operator(opc));
00436 }
00437
00438
00439
00440 extern BOOL WN_has_aux(const WN *wn)
00441 {
00442 OPERATOR opr = WN_operator(wn);
00443 return OPERATOR_has_aux(opr);
00444 }
00445
00446 ST *WN_sym(const WN *wn)
00447 {
00448 Is_True((Wn_flags(wn) & WN_FLAG_ST_TYPE) == WN_ST_IS_SYM,
00449 ("WN_st is not of type ST."));
00450 return WN_st(wn);
00451 }
00452
00453
00454 AUX_ID WN_aux(const WN *wn)
00455 {
00456 Is_True((Wn_flags(wn) & WN_FLAG_ST_TYPE) == WN_ST_IS_AUX,
00457 ("WN_st is not of type AUX."));
00458 return (AUX_ID) WN_st_idx(wn);
00459 }
00460
00461
00462 VER_ID WN_ver(const WN *wn)
00463 {
00464 Is_True((Wn_flags(wn) & WN_FLAG_ST_TYPE) == WN_ST_IS_VER,
00465 ("WN_st is not of type VER."));
00466 return (VER_ID) WN_st_idx(wn);
00467 }
00468
00469
00470
00471
00472 void WN_set_aux(WN *wn, AUX_ID s)
00473 {
00474 #ifdef Is_True_On
00475 Set_wn_flags(wn, (Wn_flags(wn) & ~WN_FLAG_ST_TYPE) | WN_ST_IS_AUX);
00476 #endif
00477 WN_st_idx(wn) = (ST_IDX) s;
00478 }
00479
00480
00481
00482 void WN_set_ver(WN *wn, VER_ID v)
00483 {
00484 #ifdef Is_True_On
00485 Set_wn_flags(wn, (Wn_flags(wn) & ~WN_FLAG_ST_TYPE) | WN_ST_IS_VER);
00486 #endif
00487 WN_st_idx(wn) = (ST_IDX) v;
00488 }
00489
00490 void WN_copy_stmap(WN *src, WN *dst)
00491 {
00492 INT i;
00493 for (i = 0; i < WN_MAP_MAX; i++) {
00494 if (Current_Map_Tab->_is_used[i]) {
00495 switch (Current_Map_Tab->_kind[i]) {
00496 case WN_MAP_KIND_VOIDP: {
00497 WN_MAP_Set(i, dst, WN_MAP_Get(i, src));
00498 break;
00499 }
00500 case WN_MAP_KIND_INT32: {
00501 WN_MAP32_Set(i, dst, WN_MAP32_Get(i, src));
00502 break;
00503 }
00504 case WN_MAP_KIND_INT64: {
00505 WN_MAP64_Set(i, dst, WN_MAP64_Get(i, src));
00506 break;
00507 }
00508 default:
00509 Is_True(FALSE, ("WN_copy_stmap: unknown map kind"));
00510 }
00511 }
00512 }
00513 if (!OPCODE_is_leaf(WN_opcode(src)))
00514 for (i = 0; i < WN_kid_count(src); i++)
00515 WN_copy_stmap(WN_kid(src, i), WN_kid(dst, i));
00516 }
00517
00518
00519
00520 INT32 Get_mtype_class(MTYPE mtype)
00521 {
00522 INT32 mclass = MTYPE_type_class(mtype);
00523
00524 if (mclass == MTYPE_CLASS_UNSIGNED)
00525 mclass = MTYPE_CLASS_INTEGER;
00526
00527 if (mclass == MTYPE_CLASS_UNSIGNED_INTEGER)
00528 mclass = MTYPE_CLASS_INTEGER;
00529 return mclass;
00530 }
00531
00532
00533
00534
00535
00536
00537
00538
00539 extern OPCODE
00540 Ldid_from_mtype( MTYPE mtype )
00541 {
00542 switch ( mtype ) {
00543 case MTYPE_I1: return OPC_I4I1LDID;
00544 case MTYPE_I2: return OPC_I4I2LDID;
00545 case MTYPE_I4: return OPC_I4I4LDID;
00546 case MTYPE_I8: return OPC_I8I8LDID;
00547 case MTYPE_U1: return OPC_U4U1LDID;
00548 case MTYPE_U2: return OPC_U4U2LDID;
00549 case MTYPE_U4: return OPC_U4U4LDID;
00550 case MTYPE_U8: return OPC_U8U8LDID;
00551 case MTYPE_F4: return OPC_F4F4LDID;
00552 case MTYPE_F8: return OPC_F8F8LDID;
00553 #if defined(TARG_IA64)
00554 case MTYPE_F10: return OPC_F10F10LDID;
00555 #endif
00556 case MTYPE_FQ: return OPC_FQFQLDID;
00557 case MTYPE_C4: return OPC_C4C4LDID;
00558 case MTYPE_C8: return OPC_C8C8LDID;
00559 #ifdef TARG_IA64
00560 case MTYPE_C10: return OPC_C10C10LDID;
00561 #endif
00562 case MTYPE_CQ: return OPC_CQCQLDID;
00563 #if defined(TARG_X8664) || defined(VECTOR_MTYPES)
00564 case MTYPE_V16I1: return OPC_V16I1V16I1LDID;
00565 case MTYPE_V16I2: return OPC_V16I2V16I2LDID;
00566 case MTYPE_V16I4: return OPC_V16I4V16I4LDID;
00567 case MTYPE_V16I8: return OPC_V16I8V16I8LDID;
00568 case MTYPE_V16F4: return OPC_V16F4V16F4LDID;
00569 case MTYPE_V16F8: return OPC_V16F8V16F8LDID;
00570 case MTYPE_V16C4: return OPC_V16C4V16C4LDID;
00571 case MTYPE_V16C8: return OPC_V16C8V16C8LDID;
00572 case MTYPE_V8I1: return OPC_V8I1V8I1LDID;
00573 case MTYPE_V8I2: return OPC_V8I2V8I2LDID;
00574 case MTYPE_V8I4: return OPC_V8I4V8I4LDID;
00575 case MTYPE_V8F4: return OPC_V8F4V8F4LDID;
00576 case MTYPE_M8I1: return OPC_M8I1M8I1LDID;
00577 case MTYPE_M8I2: return OPC_M8I2M8I2LDID;
00578 case MTYPE_M8I4: return OPC_M8I4M8I4LDID;
00579 case MTYPE_M8F4: return OPC_M8F4M8F4LDID;
00580 #endif
00581
00582 case MTYPE_B:
00583 case MTYPE_F16:
00584 case MTYPE_STRING:
00585 case MTYPE_M:
00586 case MTYPE_V:
00587 FmtAssert( FALSE, ("Ldid_from_mtype: bad mtype: %s",
00588 Mtype_Name(mtype)) );
00589 return OPCODE_UNKNOWN;
00590
00591 case MTYPE_UNKNOWN:
00592 default:
00593 FmtAssert( FALSE, ("Ldid_from_mtype: unknown mtype: %d", mtype) );
00594 return OPCODE_UNKNOWN;
00595 }
00596 }
00597
00598
00599
00600
00601
00602 extern MTYPE
00603 Mtype_from_mtype_class_and_size( INT mtype_class, INT bytes )
00604 {
00605 #if defined(TARG_X8664) || defined(VECTOR_MTYPES)
00606 if ( mtype_class & MTYPE_CLASS_VECTOR ) {
00607 if ( ( mtype_class & MTYPE_CLASS_SVECTOR ) == MTYPE_CLASS_SVECTOR ) {
00608 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00609 switch ( bytes ) {
00610 case 1: return MTYPE_V8I1;
00611 case 2: return MTYPE_V8I2;
00612 case 4: return MTYPE_V8I4;
00613 }
00614 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00615 if ( bytes == 4 )
00616 return MTYPE_V8F4;
00617 }
00618 } else if ( ( mtype_class & MTYPE_CLASS_MVECTOR ) == MTYPE_CLASS_MVECTOR ) {
00619 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00620 switch ( bytes ) {
00621 case 1: return MTYPE_M8I1;
00622 case 2: return MTYPE_M8I2;
00623 case 4: return MTYPE_M8I4;
00624 }
00625 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00626 if ( bytes == 4 )
00627 return MTYPE_M8F4;
00628 }
00629 } else
00630 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00631 switch ( bytes ) {
00632 case 1: return MTYPE_V16I1;
00633 case 2: return MTYPE_V16I2;
00634 case 4: return MTYPE_V16I4;
00635 case 8: return MTYPE_V16I8;
00636 }
00637 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00638 switch ( bytes ) {
00639 case 4: return MTYPE_V16F4;
00640 case 8: return MTYPE_V16F8;
00641 case 16: return MTYPE_V16C8;
00642 }
00643 }
00644 FmtAssert( FALSE,
00645 ("Mtype_from_mtype_class_and_size: unknown type"));
00646 } else
00647 #endif
00648
00649 if ( (mtype_class & MTYPE_CLASS_UNSIGNED) ||
00650 Only_Unsigned_64_Bit_Ops && ! Delay_U64_Lowering && (mtype_class & MTYPE_CLASS_INTEGER) ) {
00651 switch ( bytes ) {
00652 case 1: return MTYPE_U1;
00653 case 2: return MTYPE_U2;
00654 case 4: return MTYPE_U4;
00655 case 8: return MTYPE_U8;
00656 }
00657 }
00658 else if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00659 switch ( bytes ) {
00660 case 1: return MTYPE_I1;
00661 case 2: return MTYPE_I2;
00662 case 4: return MTYPE_I4;
00663 case 8: return MTYPE_I8;
00664 }
00665 }
00666 else if ( mtype_class & MTYPE_CLASS_COMPLEX ) {
00667 switch ( bytes ) {
00668 case 8: return MTYPE_C4;
00669 case 16: return MTYPE_C8;
00670 #if defined(TARG_IA64)
00671 case 32: return MTYPE_C10;
00672 #else
00673 case 24:
00674 case 32: return MTYPE_CQ;
00675 #endif
00676 }
00677 }
00678 else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00679 switch ( bytes ) {
00680 case 4: return MTYPE_F4;
00681 case 8: return MTYPE_F8;
00682 #if defined(TARG_IA64)
00683 case 16: return MTYPE_F10;
00684 #else
00685 case 12:
00686 case 16: return MTYPE_FQ;
00687 #endif
00688 }
00689 }
00690
00691 return MTYPE_UNKNOWN;
00692 }
00693
00694
00695
00696
00697
00698
00699
00700
00701 extern OPCODE
00702 Ldid_from_mtype_class_and_size( INT mtype_class, INT bytes )
00703 {
00704 #if defined(TARG_X8664) || defined(VECTOR_MTYPES)
00705 if ( mtype_class & MTYPE_CLASS_VECTOR ) {
00706 if ( ( mtype_class & MTYPE_CLASS_SVECTOR ) == MTYPE_CLASS_SVECTOR ) {
00707 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00708 switch ( bytes ) {
00709 case 1: return OPC_V8I1V8I1LDID;
00710 case 2: return OPC_V8I2V8I2LDID;
00711 case 4: return OPC_V8I4V8I4LDID;
00712 }
00713 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00714 if ( bytes == 4 )
00715 return OPC_V8F4V8F4LDID;
00716 }
00717 } else if ( ( mtype_class & MTYPE_CLASS_MVECTOR ) == MTYPE_CLASS_MVECTOR ) {
00718 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00719 switch ( bytes ) {
00720 case 1: return OPC_M8I1M8I1LDID;
00721 case 2: return OPC_M8I2M8I2LDID;
00722 case 4: return OPC_M8I4M8I4LDID;
00723 }
00724 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00725 if ( bytes == 4 )
00726 return OPC_M8F4M8F4LDID;
00727 }
00728 } else
00729 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00730 switch ( bytes ) {
00731 case 1: return OPC_V16I1V16I1LDID;
00732 case 2: return OPC_V16I2V16I2LDID;
00733 case 4: return OPC_V16I4V16I4LDID;
00734 case 8: return OPC_V16I8V16I8LDID;
00735 }
00736 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00737 switch ( bytes ) {
00738 case 4: return OPC_V16F4V16F4LDID;
00739 case 8: return OPC_V16F8V16F8LDID;
00740 case 16: return OPC_V16C8V16C8LDID;
00741 }
00742 }
00743 FmtAssert( FALSE,
00744 ("Ldid_from_mtype_class_and_size: unknown type"));
00745 } else
00746 #endif
00747
00748 if ( (mtype_class & MTYPE_CLASS_UNSIGNED) ||
00749 Only_Unsigned_64_Bit_Ops && ! Delay_U64_Lowering && (mtype_class & MTYPE_CLASS_INTEGER) ) {
00750 switch ( bytes ) {
00751 case 1: return OPC_U4U1LDID;
00752 case 2: return OPC_U4U2LDID;
00753 case 4: return OPC_U4U4LDID;
00754 case 8: return OPC_U8U8LDID;
00755 }
00756 }
00757 else if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00758 switch ( bytes ) {
00759 case 1: return OPC_I4I1LDID;
00760 case 2: return OPC_I4I2LDID;
00761 case 4: return OPC_I4I4LDID;
00762 case 8: return OPC_I8I8LDID;
00763 }
00764 }
00765 else if ( mtype_class & MTYPE_CLASS_COMPLEX ) {
00766 switch ( bytes ) {
00767 case 8: return OPC_C4C4LDID;
00768 case 16: return OPC_C8C8LDID;
00769 #if defined(TARG_IA64)
00770 case 32: return OPC_C10C10LDID;
00771 #else
00772 case 24:
00773 case 32: return OPC_CQCQLDID;
00774 #endif
00775 }
00776 }
00777 else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00778 switch ( bytes ) {
00779 case 4: return OPC_F4F4LDID;
00780 case 8: return OPC_F8F8LDID;
00781 #if defined(TARG_IA64)
00782 case 16: return OPC_F10F10LDID;
00783 #else
00784 case 12:
00785 case 16: return OPC_FQFQLDID;
00786 #endif
00787 }
00788 }
00789
00790
00791 FmtAssert( FALSE,
00792 ("Ldid_from_mtype_class_and_size: unknown class/size: %d/%d",
00793 mtype_class, bytes) );
00794 return OPCODE_UNKNOWN;
00795 }
00796
00797
00798
00799
00800 extern OPCODE
00801 Stid_from_mtype_class_and_size( INT mtype_class, INT bytes )
00802 {
00803 #if defined(TARG_X8664) || defined(VECTOR_MTYPES)
00804 if ( mtype_class & MTYPE_CLASS_VECTOR ) {
00805 if ( ( mtype_class & MTYPE_CLASS_SVECTOR ) == MTYPE_CLASS_SVECTOR ) {
00806 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00807 switch ( bytes ) {
00808 case 1: return OPC_V8I1STID;
00809 case 2: return OPC_V8I2STID;
00810 case 4: return OPC_V8I4STID;
00811 }
00812 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00813 if ( bytes == 4 )
00814 return OPC_V8F4STID;
00815 }
00816 } else if ( ( mtype_class & MTYPE_CLASS_MVECTOR ) == MTYPE_CLASS_MVECTOR ) {
00817 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00818 switch ( bytes ) {
00819 case 1: return OPC_M8I1STID;
00820 case 2: return OPC_M8I2STID;
00821 case 4: return OPC_M8I4STID;
00822 }
00823 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00824 if ( bytes == 4 )
00825 return OPC_M8F4STID;
00826 }
00827 } else
00828 if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00829 switch ( bytes ) {
00830 case 1: return OPC_V16I1STID;
00831 case 2: return OPC_V16I2STID;
00832 case 4: return OPC_V16I4STID;
00833 case 8: return OPC_V16I8STID;
00834 }
00835 } else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00836 switch ( bytes ) {
00837 case 4: return OPC_V16F4STID;
00838 case 8: return OPC_V16F8STID;
00839 case 16: return OPC_V16C8STID;
00840 }
00841 }
00842 FmtAssert( FALSE,
00843 ("Stid_from_mtype_class_and_size: unknown type"));
00844 } else
00845 #endif
00846
00847 if ( (mtype_class & MTYPE_CLASS_UNSIGNED) ||
00848 Only_Unsigned_64_Bit_Ops && ! Delay_U64_Lowering && (mtype_class & MTYPE_CLASS_INTEGER) ) {
00849 switch ( bytes ) {
00850 case 1: return OPC_U1STID;
00851 case 2: return OPC_U2STID;
00852 case 4: return OPC_U4STID;
00853 case 8: return OPC_U8STID;
00854 }
00855 }
00856 else if ( mtype_class & MTYPE_CLASS_INTEGER ) {
00857 switch ( bytes ) {
00858 case 1: return OPC_I1STID;
00859 case 2: return OPC_I2STID;
00860 case 4: return OPC_I4STID;
00861 case 8: return OPC_I8STID;
00862 }
00863 }
00864 else if ( mtype_class & MTYPE_CLASS_COMPLEX ) {
00865 switch ( bytes ) {
00866 case 8: return OPC_C4STID;
00867 case 16: return OPC_C8STID;
00868 #if defined(TARG_IA64)
00869 case 32: return OPC_C10STID;
00870 #else
00871 case 24:
00872 case 32: return OPC_CQSTID;
00873 #endif
00874 }
00875 }
00876 else if ( mtype_class & MTYPE_CLASS_FLOAT ) {
00877 switch ( bytes ) {
00878 case 4: return OPC_F4STID;
00879 case 8: return OPC_F8STID;
00880 #if defined(TARG_IA64)
00881 case 16: return OPC_F10STID;
00882 #else
00883 case 12:
00884 case 16: return OPC_FQSTID;
00885 #endif
00886 }
00887 }
00888
00889
00890 FmtAssert( FALSE,
00891 ("Stid_from_mtype_class_and_size: unknown class/size: %d/%d",
00892 mtype_class, bytes) );
00893 return OPCODE_UNKNOWN;
00894 }
00895
00896
00897
00898 void
00899 Init_lno_info_for_main_emitter(void)
00900 {
00901 if (Current_Dep_Graph != NULL)
00902 Current_Dep_Graph->Clear_Map();
00903 }
00904
00905
00906
00907 void
00908 Print_dep_graph(FILE *fp)
00909 {
00910 if (Current_Dep_Graph != NULL)
00911 Current_Dep_Graph->Print(fp);
00912 }
00913
00914
00915
00916 INT32
00917 WN_get_dep_graph_vertex(WN *wn)
00918 {
00919 if (Current_Dep_Graph != NULL)
00920 return Current_Dep_Graph->Get_Vertex(wn);
00921 else
00922 return 0;
00923 }
00924
00925
00926
00927 void
00928 WN_detach_wn_from_dep_graph(INT32 vertex)
00929 {
00930 if (Current_Dep_Graph != NULL && vertex != 0)
00931 Current_Dep_Graph->Clear_Map_For_Vertex((VINDEX16) vertex);
00932 }
00933
00934
00935
00936 void
00937 WN_add_lno_info(WN *wn, CODEREP *cr)
00938 {
00939 Is_True(OPCODE_is_load(WN_opcode(wn)) || OPCODE_is_store(WN_opcode(wn)),
00940 ("opcode is not load/store."));
00941 if (Current_Dep_Graph != NULL && cr->Kind() == CK_IVAR) {
00942 VINDEX16 vertex = OPCODE_is_load(WN_opcode(wn)) ?
00943 cr->Ivar_occ()->Lno_dep_vertex_load() :
00944 cr->Ivar_occ()->Lno_dep_vertex_store() ;
00945 if (vertex != 0 && Current_Dep_Graph != NULL) {
00946 if (Current_Dep_Graph->Get_Wn(vertex) == NULL)
00947 Current_Dep_Graph->Set_Wn(vertex, wn);
00948 else {
00949 VINDEX16 newvertex = Current_Dep_Graph->Add_Vertex(wn);
00950 BOOL ok = Current_Dep_Graph->Copy_Vertex(vertex, newvertex);
00951 if (!ok) {
00952 Current_Dep_Graph->Erase_Graph();
00953 Current_Dep_Graph = NULL;
00954 }
00955 }
00956 }
00957 }
00958 PF_POINTER *pf;
00959 if ((pf = cr->Ivar_occ()->Pf_pointer()) != NULL) {
00960 if (!VISITED_EM(pf)) {
00961 SET_VISITED_EM(pf);
00962 if (PF_PTR_wn_pref_1L(pf) != NULL) {
00963 PF_PTR_wn_pref_1L(pf) = ((STMTREP *) PF_PTR_wn_pref_1L(pf))->Prefetch_wn();
00964 WN_MAP_Set(WN_MAP_PREFETCH, PF_PTR_wn_pref_1L(pf), pf);
00965 }
00966 if (PF_PTR_wn_pref_2L(pf) != NULL) {
00967 PF_PTR_wn_pref_2L(pf) = ((STMTREP *) PF_PTR_wn_pref_2L(pf))->Prefetch_wn();
00968 WN_MAP_Set(WN_MAP_PREFETCH, PF_PTR_wn_pref_2L(pf), pf);
00969 }
00970 WN_MAP_Set(WN_MAP_PREFETCH, wn, pf);
00971 }
00972 }
00973 }
00974
00975
00976
00977 void
00978 WN_dup_dep_vertex(WN *oldwn, WN *newwn)
00979 {
00980 Is_True(OPCODE_is_load(WN_opcode(oldwn)) || OPCODE_is_store(WN_opcode(oldwn)),
00981 ("opcode is not load/store."));
00982 Is_True(OPCODE_is_load(WN_opcode(newwn)) || OPCODE_is_store(WN_opcode(newwn)),
00983 ("opcode is not load/store."));
00984 if (Current_Dep_Graph != NULL) {
00985 VINDEX16 vertex = Current_Dep_Graph->Get_Vertex(oldwn);
00986 if (vertex != 0) {
00987 VINDEX16 newvertex = Current_Dep_Graph->Add_Vertex(newwn);
00988 BOOL ok = Current_Dep_Graph->Copy_Vertex(vertex, newvertex);
00989 if (!ok) {
00990 Current_Dep_Graph->Erase_Graph();
00991 Current_Dep_Graph = NULL;
00992 }
00993 }
00994 }
00995 }
00996
00997
00998
00999 PF_POINTER *WN_get_pf_pointer(WN *wn)
01000 {
01001 return (PF_POINTER *) WN_MAP_Get (WN_MAP_PREFETCH, wn);
01002 }
01003
01004
01005
01006 void Print_pf_pointer(FILE *fp, PF_POINTER *p)
01007 {
01008 fprintf(fp, "\tpref1=0x%p trip1=%d ", PF_PTR_wn_pref_1L(p), PF_PTR_lrnum_1L(p));
01009 fprintf(fp, "pref2=0x%p trip2=%d\n", PF_PTR_wn_pref_2L(p), PF_PTR_lrnum_2L(p));
01010 }
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021 #ifdef KEY
01022 #include <ext/hash_map>
01023
01024 struct TY_IDX_EQ
01025 {
01026 bool operator() (const TY_IDX ty1, const TY_IDX ty2) const
01027 {
01028 return TY_IDX_index (ty1) == TY_IDX_index (ty2);
01029 }
01030 };
01031
01032 static hash_map<const TY_IDX, INT, __gnu_cxx::hash<TY_IDX>, TY_IDX_EQ> TY_volatility;
01033
01034 #define STRUCT_HAS_VOLATILITY_COMPUTED 1
01035 #define STRUCT_HAS_VOLATILE 2
01036
01037 BOOL
01038 Lod_TY_is_volatile(TY_IDX ty)
01039 {
01040 if (ty == TY_IDX_ZERO) return FALSE;
01041 if (TY_is_volatile(ty)) return TRUE;
01042 if (TY_kind(ty) == KIND_STRUCT) {
01043 if (TY_volatility[ty] & STRUCT_HAS_VOLATILITY_COMPUTED)
01044 return TY_volatility[ty] & STRUCT_HAS_VOLATILE;
01045 if (!TY_fld (ty).Is_Null ()) {
01046 FLD_ITER fld_iter = Make_fld_iter (TY_fld (ty));
01047 do {
01048 TY_IDX fld_ty = FLD_type (fld_iter);
01049 if (Lod_TY_is_volatile(fld_ty)) {
01050 TY_volatility[ty] = STRUCT_HAS_VOLATILITY_COMPUTED | STRUCT_HAS_VOLATILE;
01051 return TRUE;
01052 }
01053 } while (!FLD_last_field (fld_iter++));
01054 TY_volatility[ty] = STRUCT_HAS_VOLATILITY_COMPUTED;
01055 }
01056 }
01057 return FALSE;
01058 }
01059 #else
01060 BOOL
01061 Lod_TY_is_volatile(TY_IDX ty)
01062 {
01063 if (ty == TY_IDX_ZERO) return FALSE;
01064 if (TY_is_volatile(ty)) return TRUE;
01065 if (TY_kind(ty) == KIND_STRUCT) {
01066 if (!TY_fld (ty).Is_Null ()) {
01067 FLD_ITER fld_iter = Make_fld_iter (TY_fld (ty));
01068 do {
01069 TY_IDX fld_ty = FLD_type (fld_iter);
01070 if (Lod_TY_is_volatile(fld_ty))
01071 return TRUE;
01072 } while (!FLD_last_field (fld_iter++));
01073 }
01074 }
01075 return FALSE;
01076 }
01077 #endif // KEY
01078
01079
01080
01081 BOOL
01082 Ilod_TY_is_volatile(TY_IDX ty)
01083 {
01084 if (ty == TY_IDX_ZERO) return FALSE;
01085 if (TY_is_volatile(ty)) return TRUE;
01086 return Lod_TY_is_volatile(TY_pointed(ty));
01087 }
01088
01089
01090
01091 INT64
01092 WN_get_const_val(WN *wn)
01093 {
01094 Is_True(WN_operator(wn) == OPR_INTCONST,
01095 ("WN_get_const_val: must be OPR_INTCONST"));
01096 union {
01097 mINT64 i8;
01098 mUINT64 u8;
01099 struct {
01100 mINT32 hi;
01101 mINT32 lo;
01102 } i4;
01103 struct {
01104 mUINT32 uhi;
01105 mUINT32 ulo;
01106 } u4;
01107 struct {
01108 mINT16 s4;
01109 mINT16 s3;
01110 mINT16 s2;
01111 mINT16 s1;
01112 } i2;
01113 struct {
01114 mUINT16 us4;
01115 mUINT16 us3;
01116 mUINT16 us2;
01117 mUINT16 us1;
01118 } u2;
01119 struct {
01120 mINT8 b8;
01121 mINT8 b7;
01122 mINT8 b6;
01123 mINT8 b5;
01124 mINT8 b4;
01125 mINT8 b3;
01126 mINT8 b2;
01127 mINT8 b1;
01128 } i1;
01129 struct {
01130 mINT8 ub8;
01131 mINT8 ub7;
01132 mINT8 ub6;
01133 mINT8 ub5;
01134 mINT8 ub4;
01135 mINT8 ub3;
01136 mINT8 ub2;
01137 mINT8 ub1;
01138 } u1;
01139 } val;
01140
01141 val.i8 = WN_const_val(wn);
01142 #if 0
01143 MTYPE rtype = WN_rtype(wn);
01144 switch (rtype) {
01145 case MTYPE_I1:
01146 return (INT64) val.i1.b1;
01147 case MTYPE_I2:
01148 return (INT64) val.i2.s1;
01149 case MTYPE_I4:
01150 return (INT64) val.i4.lo;
01151 case MTYPE_I8:
01152 return (INT64) val.i8;
01153 case MTYPE_U1:
01154 return (INT64) val.u1.ub1;
01155 case MTYPE_U2:
01156 return (INT64) val.u2.us1;
01157 case MTYPE_U4:
01158 return (INT64) val.u4.ulo;
01159 case MTYPE_U8:
01160 return (INT64) val.u8;
01161 }
01162 #endif
01163 return val.i8;
01164 }
01165
01166
01167 UINT Actual_data_size(CODEREP *cr, OPT_STAB *opt_stab, INT &signess)
01168 {
01169 signess = 0;
01170 MTYPE rtype = cr->Dtyp();
01171 INT actual_size;
01172
01173 if ((MTYPE_type_class(rtype) & MTYPE_CLASS_INTEGER) == 0)
01174 return MTYPE_size_min(rtype);
01175
01176 switch (cr->Kind()) {
01177 case CK_CONST:
01178 {
01179 INT64 val = cr->Const_val();
01180 if ( (val & 0xFFFFFFFFFFFFFF80ll) == 0 ) {
01181 signess |= (SIGN_1_EXTD | SIGN_0_EXTD);
01182 return 8;
01183 } else if ( (val & 0xFFFFFFFFFFFFFF00ll) == 0 ) {
01184 signess |= SIGN_0_EXTD;
01185 return 8;
01186 } else if ( (val & 0xFFFFFFFFFFFFFF80ll) == 0xFFFFFFFFFFFFFF80ll ) {
01187 signess |= SIGN_1_EXTD;
01188 return 8;
01189 } else if ( (val & 0xFFFFFFFFFFFF8000ll) == 0 ) {
01190 signess |= (SIGN_1_EXTD | SIGN_0_EXTD);
01191 return 16;
01192 } else if ( (val & 0xFFFFFFFFFFFF0000ll) == 0 ) {
01193 signess |= SIGN_0_EXTD;
01194 return 16;
01195 } else if ( (val & 0xFFFFFFFFFFFF8000ll) == 0xFFFFFFFFFFFF8000ll ) {
01196 signess |= SIGN_1_EXTD;
01197 return 16;
01198 } else if ( (val & 0xFFFFFFFF80000000ll) == 0 ) {
01199 signess |= (SIGN_1_EXTD | SIGN_0_EXTD);
01200 return 32;
01201 } else if ( (val & 0xFFFFFFFF00000000ll) == 0 ) {
01202 signess |= SIGN_0_EXTD;
01203 return 32;
01204 } else if ( (val & 0xFFFFFFFF80000000ll) == 0xFFFFFFFF80000000ll ) {
01205 signess |= SIGN_1_EXTD;
01206 return 32;
01207 }
01208 return MTYPE_size_min(rtype);
01209 }
01210 case CK_OP:
01211 {
01212 switch ( cr->Opr() ) {
01213 case OPR_CVTL:
01214 if (MTYPE_is_signed(rtype)) signess |= SIGN_1_EXTD;
01215 if (MTYPE_is_unsigned(rtype)) signess |= SIGN_0_EXTD;
01216 return cr->Offset();
01217 case OPR_CVT:
01218 {
01219 switch ( cr->Op() ) {
01220 case OPC_I4I8CVT:
01221 case OPC_U4I8CVT:
01222 case OPC_I4U8CVT:
01223 case OPC_U4U8CVT:
01224 #ifdef TARG_X8664
01225 signess |= SIGN_0_EXTD;
01226 #else
01227 signess |= SIGN_1_EXTD;
01228 #endif
01229 return MTYPE_size_min(rtype);
01230 case OPC_I8U4CVT:
01231 case OPC_U8U4CVT:
01232 signess |= SIGN_0_EXTD;
01233 return MTYPE_size_min(cr->Dsctyp());
01234 default:
01235 break;
01236 }
01237 return MTYPE_size_min(rtype);
01238 }
01239 case OPR_BAND:
01240 {
01241 INT k0s = 0;
01242 INT k1s = 0;
01243 actual_size = MTYPE_size_min(rtype);
01244 INT kid0_size = Actual_data_size(cr->Opnd(0), opt_stab, k0s);
01245 INT kid1_size = Actual_data_size(cr->Opnd(1), opt_stab, k1s);
01246 if (k0s & SIGN_0_EXTD) actual_size = MIN(actual_size, kid0_size);
01247 if (k1s & SIGN_0_EXTD) actual_size = MIN(actual_size, kid1_size);
01248 if (actual_size < MTYPE_size_min(rtype)) {
01249 signess |= SIGN_0_EXTD;
01250 return actual_size;
01251 }
01252 return MTYPE_size_min(rtype);
01253 }
01254 case OPR_ASHR:
01255 case OPR_LSHR:
01256 {
01257
01258 CODEREP *bits = cr->Opnd(1);
01259
01260
01261 if ( bits->Kind() == CK_CONST ) {
01262 UINT bit_cnt = bits->Const_val();
01263 if (MTYPE_size_min(rtype) == 32)
01264 bit_cnt &= 0x1F;
01265 else
01266 bit_cnt &= 0x3F;
01267
01268 INT ks = 0;
01269 actual_size = Actual_data_size(cr->Opnd(0), opt_stab, ks);
01270 actual_size -= bit_cnt;
01271 if (actual_size < 0) actual_size = 0;
01272 if (cr->Opr() == OPR_ASHR) {
01273 signess |= SIGN_1_EXTD;
01274 } else {
01275 signess |= SIGN_0_EXTD;
01276 }
01277 if (actual_size > MTYPE_size_min(rtype))
01278 actual_size = MTYPE_size_min(rtype);
01279 return actual_size;
01280 }
01281 break;
01282 }
01283 default:
01284 ;
01285 }
01286 break;
01287 }
01288 case CK_VAR:
01289 {
01290 AUX_STAB_ENTRY *aux_entry = opt_stab->Aux_stab_entry(cr->Aux_id());
01291 if (ST_class(aux_entry->St()) == CLASS_PREG) {
01292 if (aux_entry->Value_size() > 0) {
01293 if (aux_entry->Is_sign_extd()) signess |= SIGN_1_EXTD;
01294 if (aux_entry->Is_zero_extd()) signess |= SIGN_0_EXTD;
01295 return aux_entry->Value_size();
01296 } else
01297 return MTYPE_size_min(rtype);
01298 } else {
01299 if (cr->Is_sign_extd())
01300 signess |= SIGN_1_EXTD;
01301 else
01302 signess |= SIGN_0_EXTD;
01303 return aux_entry->Bit_size() ?
01304 cr->Bit_size () : MTYPE_size_min(cr->Dsctyp());
01305 }
01306 }
01307 case CK_IVAR:
01308 {
01309 if (OPERATOR_is_scalar_iload (cr->Opr())) {
01310 if (cr->Is_sign_extd())
01311 signess |= SIGN_1_EXTD;
01312 else
01313 signess |= SIGN_0_EXTD;
01314 return cr->Opr() == OPR_ILDBITS ?
01315 cr->I_bit_size () : MTYPE_size_min(cr->Dsctyp());
01316 }
01317 }
01318 }
01319
01320 return MTYPE_size_min(rtype);
01321 }
01322
01323
01324
01325
01326
01327
01328 extern TY_IDX
01329 Identity_assignment_type( AUX_STAB_ENTRY *sym, OPT_PHASE phase )
01330 {
01331 ST *st = sym->St();
01332 TY_IDX ty = ST_type(st);
01333
01334
01335
01336
01337
01338 while (TY_kind(ty) == KIND_ARRAY && sym->Byte_size() < TY_size(ty))
01339 ty = TY_AR_etype(ty);
01340
01341 #ifdef KEY // bug 3091: avoid generating bad identity assignments for bitfields
01342 if (phase != MAINOPT_PHASE && sym->Field_id() != 0 && sym->Bit_size() > 0 &&
01343 Is_Structure_Type(ty))
01344 return ty;
01345 #endif
01346
01347
01348 if ( sym->Byte_size() != TY_size(ty) )
01349 return TY_IDX_ZERO;
01350
01351
01352
01353
01354 if ( ! Is_Simple_Type( ty ) ) {
01355 MTYPE mtype;
01356
01357 if (sym->Mtype()==MTYPE_M || MTYPE_is_vector(sym->Mtype()))
01358 mtype = sym->Mtype();
01359 else {
01360 mtype = Mtype_from_mtype_class_and_size(sym->Mclass(),
01361 sym->Byte_size());
01362 #ifdef KEY // bug 8186
01363 if (MTYPE_is_unsigned(sym->Mtype()))
01364 mtype = Mtype_TransferSign(MTYPE_U4, mtype);
01365 #endif
01366 }
01367
01368 if ( mtype == MTYPE_UNKNOWN )
01369 return TY_IDX_ZERO;
01370
01371 TY_IDX newty = MTYPE_To_TY(mtype);
01372
01373
01374 if ( TY_align(ty) == TY_align(newty) )
01375 ty = newty;
01376 else
01377 return TY_IDX_ZERO;
01378 }
01379
01380 return ty;
01381 }
01382
01383
01384
01385
01386 WN *
01387 Create_identity_assignment(AUX_STAB_ENTRY *sym, AUX_ID aux_id, TY_IDX ty)
01388 {
01389 ST *st = sym->St();
01390 OPCODE ldidop;
01391 OPCODE stidop;
01392
01393 if (sym->Mtype() == MTYPE_M) {
01394 ldidop = OPCODE_make_op(OPR_LDID, sym->Mtype(), sym->Mtype());
01395 stidop = OPCODE_make_op(OPR_STID, MTYPE_V, sym->Mtype());
01396 } else {
01397 #if defined(TARG_X8664) || defined(VECTOR_MTYPES)
01398 TYPE_ID type = sym->Mtype();
01399 INT bytes = sym->Byte_size();
01400 switch (type) {
01401 case MTYPE_M8I1:
01402 case MTYPE_V8I1:
01403 case MTYPE_V16I1: bytes = 1; break;
01404 case MTYPE_M8I2:
01405 case MTYPE_V8I2:
01406 case MTYPE_V16I2: bytes = 2; break;
01407 case MTYPE_M8I4:
01408 case MTYPE_M8F4:
01409 case MTYPE_V8I4:
01410 case MTYPE_V8F4:
01411 case MTYPE_V16I4:
01412 case MTYPE_V16F4: bytes = 4; break;
01413 case MTYPE_V16I8:
01414 case MTYPE_V16F8: bytes = 8; break;
01415 case MTYPE_V16C8: bytes = 16; break;
01416 }
01417 ldidop = Ldid_from_mtype_class_and_size(sym->Mclass(), bytes);
01418 stidop = Stid_from_mtype_class_and_size(sym->Mclass(), bytes);
01419 if (MTYPE_is_unsigned(sym->Mtype())) {
01420 ldidop = OPCODE_make_op(OPR_LDID,
01421 Mtype_TransferSign(MTYPE_U4,OPCODE_rtype(ldidop)),
01422 Mtype_TransferSign(MTYPE_U4,OPCODE_desc(ldidop)));
01423 stidop = OPCODE_make_op(OPR_STID, MTYPE_V,
01424 Mtype_TransferSign(MTYPE_U4,OPCODE_desc(ldidop)));
01425 }
01426 #else
01427 ldidop = Ldid_from_mtype_class_and_size(sym->Mclass(), sym->Byte_size());
01428 stidop = Stid_from_mtype_class_and_size(sym->Mclass(), sym->Byte_size());
01429 #endif
01430 }
01431
01432 WN *rhs = WN_CreateLdid( ldidop, sym->St_ofst(), st, ty );
01433 WN *copy = WN_CreateStid( stidop, sym->St_ofst(), st, ty, rhs);
01434
01435 if (sym->Bit_size () > 0) {
01436 if (sym->Field_id() == 0) {
01437 WN_set_operator (rhs, OPR_LDBITS);
01438 WN_set_bit_offset_size (rhs, sym->Bit_ofst (), sym->Bit_size ());
01439
01440 WN_set_operator (copy, OPR_STBITS);
01441 WN_set_bit_offset_size (copy, sym->Bit_ofst (), sym->Bit_size ());
01442 }
01443 else {
01444 WN_set_desc(rhs, MTYPE_BS);
01445 WN_set_desc(copy, MTYPE_BS);
01446 #ifdef KEY // bug 3091: get field id, offset field and ty from a good WN
01447
01448 WN_set_field_id(rhs, WN_field_id(sym->Wn()));
01449 WN_load_offset(rhs) = WN_offset(sym->Wn());
01450 WN_set_ty(rhs, WN_ty(sym->Wn()));
01451 WN_set_field_id(copy, WN_field_id(sym->Wn()));
01452 WN_load_offset(copy) = WN_offset(sym->Wn());
01453 WN_set_ty(copy, WN_ty(sym->Wn()));
01454 #endif
01455 }
01456 }
01457 WN_set_aux(rhs, aux_id);
01458 WN_set_aux(copy, aux_id);
01459 return copy;
01460 }
01461
01462
01463
01464
01465
01466 READ_WRITE
01467 Get_MP_modref(const WN *pragma_list, const POINTS_TO *pt,
01468 const ALIAS_RULE *rule)
01469 {
01470 Warn_todo("Get_MP_modref: need to reimplement once the problem is fully understood.");
01471
01472 POINTS_TO pt2;
01473 ST *st, *base;
01474 mINT64 ofst;
01475
01476
01477
01478
01479 if (IS_FORTRAN && pt->Const() && pt->Base_is_fixed() && ST_sclass(pt->Base()) == SCLASS_FORMAL)
01480 return READ;
01481
01482 for (WN *wn = WN_first(pragma_list); wn != NULL; wn = WN_next(wn)) {
01483 Is_True(WN_pragma(wn) == WN_PRAGMA_ACCESSED_ID, ("Get_MP_modref: not WN_PRAGMA_ACCESSED_ID."));
01484 st = WN_st(wn);
01485 if (st != NULL) {
01486 if ((WN_pragma_arg2(wn) & (ACCESSED_LOAD|ACCESSED_STORE)) != 0) {
01487 pt2.Init();
01488 pt2.Set_expr_kind(EXPR_IS_ADDR);
01489 pt2.Set_ofst_kind(OFST_IS_FIXED);
01490 pt2.Set_base_kind(BASE_IS_FIXED);
01491 Expand_ST_into_base_and_ofst(st, 0, &base, &ofst);
01492 pt2.Set_base(base);
01493 pt2.Set_byte_ofst(ofst);
01494 pt2.Set_byte_size(TY_size(ST_type(st)));
01495 pt2.Set_bit_ofst_size(0, 0);
01496 pt2.Set_named();
01497
01498
01499
01500 if (rule->Aliased_Memop(pt, &pt2)) {
01501
01502 if (IS_FORTRAN && ST_sclass(st) == SCLASS_FORMAL)
01503 return READ;
01504 else
01505 return READ_AND_WRITE;
01506 }
01507 }
01508 if ((WN_pragma_arg2(wn) & (ACCESSED_ILOAD|ACCESSED_ISTORE)) != 0) {
01509 pt2.Init();
01510 pt2.Set_expr_kind(EXPR_IS_ADDR);
01511 pt2.Set_ofst_kind(OFST_IS_FIXED);
01512 pt2.Set_base_kind(BASE_IS_FIXED);
01513 if (IS_FORTRAN && ST_sclass(st) == SCLASS_FORMAL && Alias_Pointer_Parms) {
01514 pt2.Set_F_param();
01515 pt2.Set_based_sym(st);
01516 pt2.Set_base_kind(BASE_IS_UNKNOWN);
01517 pt2.Set_global();
01518 pt2.Set_named();
01519 }
01520 if (rule->Aliased_Memop(pt, &pt2)) {
01521 return READ_AND_WRITE;
01522 }
01523 }
01524 }
01525 }
01526 return NO_READ_NO_WRITE;
01527 }
01528
01529
01530
01531
01532 WN *
01533 Get_MP_accessed_id_list(const ST *st)
01534 {
01535 PU_Info *pu_info;
01536 for (pu_info = PU_Info_child(Current_PU_Info);
01537 pu_info != NULL;
01538 pu_info = PU_Info_next(pu_info)) {
01539 if (PU_Info_proc_sym(pu_info) == ST_st_idx(st) &&
01540 PU_Info_state(pu_info, WT_TREE) == Subsect_InMem)
01541 return WN_func_varrefs(PU_Info_tree_ptr(pu_info));
01542 }
01543 return NULL;
01544 }
01545
01546
01547 BOOL
01548 Op_can_be_propagated(OPCODE op, OPT_PHASE phase)
01549 {
01550
01551
01552
01553
01554 if (phase != MAINOPT_PHASE && !WOPT_Enable_Copy_Prop_LNO_Ops &&
01555 MTYPE_IS_INTEGER(OPCODE_rtype(op)) &&
01556 (OPCODE_operator(op) == OPR_DIV || OPCODE_operator(op) == OPR_REM))
01557 return FALSE;
01558
01559 OPERATOR opr = OPCODE_operator(op);
01560 if (!WOPT_Enable_CSE_FP_comparison &&
01561 (opr == OPR_EQ || opr == OPR_NE ||
01562 opr == OPR_LT || opr == OPR_LE ||
01563 opr == OPR_GT || opr == OPR_GE) &&
01564 MTYPE_is_float(OPCODE_desc(op)))
01565 return FALSE;
01566
01567 return TRUE;
01568 }
01569
01570
01571 extern BOOL
01572 Is_region_with_pragma(WN *wn, WN_PRAGMA_ID pragma_id)
01573 {
01574 wn = WN_region_pragmas(wn);
01575 STMT_ITER stmt_iter;
01576 WN *stmt;
01577
01578
01579 FOR_ALL_ELEM (stmt, stmt_iter, Init(WN_first(wn), WN_last(wn))) {
01580 if (WN_operator(stmt) == OPR_PRAGMA &&
01581 (WN_pragma(stmt) == pragma_id))
01582 return TRUE;
01583 }
01584 return FALSE;
01585 }
01586
01587
01588 BOOL Is_hi_sign_extended(MTYPE result_ty, MTYPE desc_ty)
01589 {
01590 Is_True(MTYPE_is_integral(result_ty),
01591 ("Is_hi_sign_extended: handles integral type only"));
01592 #ifdef TARG_NVISA
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603
01604
01605 if (MTYPE_size_min(desc_ty) == MTYPE_size_min(MTYPE_I4)
01606 && MTYPE_size_min(result_ty) == MTYPE_size_min(MTYPE_I4))
01607 return FALSE;
01608 #endif
01609 #ifndef TARG_X8664
01610 if (MTYPE_size_min(desc_ty) < MTYPE_size_min(result_ty) &&
01611 (MTYPE_size_min(result_ty) == MTYPE_size_min(MTYPE_I4) ||
01612 MTYPE_is_signed(result_ty)))
01613 return TRUE;
01614
01615 if (MTYPE_is_signed(result_ty)) return TRUE;
01616
01617 if (MTYPE_size_min(result_ty) == MTYPE_size_min(MTYPE_I4)) return TRUE;
01618
01619 return FALSE;
01620 #else
01621 if (MTYPE_size_min(desc_ty) < MTYPE_size_min(result_ty) &&
01622 (MTYPE_size_min(result_ty) == MTYPE_size_min(MTYPE_I4) ||
01623 ! MTYPE_is_signed(result_ty)))
01624 return FALSE;
01625
01626 if (! MTYPE_is_signed(result_ty)) return FALSE;
01627
01628 if (MTYPE_size_min(result_ty) == MTYPE_size_min(MTYPE_I4)) return FALSE;
01629
01630 return TRUE;
01631 #endif
01632 }
01633
01634 BOOL Is_lo_sign_extended(MTYPE result_ty, MTYPE desc_ty)
01635 {
01636 Is_True(MTYPE_is_integral(result_ty),
01637 ("Is_lo_sign_extended: handles integral type only"));
01638 #ifndef TARG_X8664
01639 if (MTYPE_size_min(desc_ty) < MTYPE_size_min(result_ty) &&
01640 MTYPE_is_signed(desc_ty))
01641 return TRUE;
01642
01643 if (MTYPE_is_signed(result_ty)) return TRUE;
01644
01645 return FALSE;
01646 #else
01647 if (MTYPE_size_min(desc_ty) < MTYPE_size_min(result_ty) &&
01648 ! MTYPE_is_signed(desc_ty))
01649 return FALSE;
01650
01651 if (! MTYPE_is_signed(result_ty)) return FALSE;
01652
01653 return TRUE;
01654 #endif
01655 }
01656
01657
01658 MTYPE
01659 Type_for_saved_load(BOOL hi_ever_sign_extended,
01660 BOOL lo_ever_sign_extended,
01661 MTYPE lod_type)
01662 {
01663 if (hi_ever_sign_extended) {
01664 if (lo_ever_sign_extended) {
01665 if (MTYPE_size_min(lod_type) == MTYPE_size_min(MTYPE_I4))
01666 return MTYPE_I4;
01667 else
01668 return MTYPE_I8;
01669 }
01670 else {
01671 if (MTYPE_size_min(lod_type) == MTYPE_size_min(MTYPE_I4))
01672 return MTYPE_U4;
01673 else
01674 return MTYPE_U8;
01675 }
01676 }
01677 Is_True(lo_ever_sign_extended == FALSE,
01678 ("Type_for_saved_load: do not expect to see lo_ever_sign_extended"));
01679 if (MTYPE_size_min(lod_type) == MTYPE_size_min(MTYPE_I4))
01680 return MTYPE_U4;
01681 else
01682 return MTYPE_U8;
01683 }
01684
01685 void
01686 Connect_cr_wn(WN_MAP *cr_wn_map, CODEREP *cr, WN *wn)
01687 {
01688 WN_MAP_Set( *cr_wn_map, wn, cr );
01689 }
01690
01691
01692
01693
01694 BOOL OPERATOR_is_fake(OPERATOR oper)
01695 {
01696 return (OPERATOR_is_call(oper) ||
01697 oper == OPR_FORWARD_BARRIER ||
01698 oper == OPR_BACKWARD_BARRIER ||
01699 oper == OPR_ASM_STMT ||
01700 oper == OPR_DEALLOCA);
01701 }
01702
01703 BOOL OPCODE_is_fake(OPCODE opc)
01704 {
01705 return OPERATOR_is_fake(OPCODE_operator(opc));
01706 }
01707
01708 BOOL OPERATOR_is_volatile(OPERATOR oper)
01709 {
01710 return (oper == OPR_ALLOCA ||
01711 oper == OPR_DEALLOCA ||
01712 oper == OPR_FORWARD_BARRIER ||
01713 oper == OPR_BACKWARD_BARRIER ||
01714
01715
01716
01717
01718 oper == OPR_ASM_STMT ||
01719 oper == OPR_ASM_INPUT ||
01720 OPERATOR_is_call(oper));
01721 }
01722
01723
01724 BOOL OPCODE_is_volatile(OPCODE opc)
01725 {
01726 return OPERATOR_is_volatile(OPCODE_operator(opc));
01727 }