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 #include "defs.h"
00037
00038 #include "pqs_cg.h"
00039 #include "pqs_cg_ia64.h"
00040 #include "pqs.h"
00041 #include "tracing.h"
00042
00043
00044 BOOL PQS_disabled=FALSE;
00045
00046
00047 BOOL PQS_Tracing;
00048
00049
00050 TN_MAP PQS_tn_map;
00051 OP_MAP PQS_op_map;
00052
00053 static void
00054 get_top_info(TOP x, PQS_ITYPE &itype, PQS_RELOPTYPE &relop)
00055 {
00056 relop = PQS_RELOPTYPE_OTHER;
00057 itype = PQS_ITYPE_INVALID;
00058
00059 switch (x) {
00060 case TOP_cmp4_eq_or_andcm:
00061 case TOP_cmp4_ge_or_andcm:
00062 case TOP_cmp4_gt_or_andcm:
00063 case TOP_cmp4_i_eq_or_andcm:
00064 case TOP_cmp4_i_ne_or_andcm:
00065 case TOP_cmp4_le_or_andcm:
00066 case TOP_cmp4_lt_or_andcm:
00067 case TOP_cmp4_ne_or_andcm:
00068 case TOP_cmp4_z1_ge_or_andcm:
00069 case TOP_cmp4_z1_gt_or_andcm:
00070 case TOP_cmp4_z1_le_or_andcm:
00071 case TOP_cmp4_z1_lt_or_andcm:
00072 case TOP_cmp4_z2_ge_or_andcm:
00073 case TOP_cmp4_z2_gt_or_andcm:
00074 case TOP_cmp4_z2_le_or_andcm:
00075 case TOP_cmp4_z2_lt_or_andcm:
00076 case TOP_cmp_eq_or_andcm:
00077 case TOP_cmp_ge_or_andcm:
00078 case TOP_cmp_gt_or_andcm:
00079 case TOP_cmp_i_eq_or_andcm:
00080 case TOP_cmp_i_ne_or_andcm:
00081 case TOP_cmp_le_or_andcm:
00082 case TOP_cmp_lt_or_andcm:
00083 case TOP_cmp_ne_or_andcm:
00084 case TOP_cmp_z1_ge_or_andcm:
00085 case TOP_cmp_z1_gt_or_andcm:
00086 case TOP_cmp_z1_le_or_andcm:
00087 case TOP_cmp_z1_lt_or_andcm:
00088 case TOP_cmp_z2_ge_or_andcm:
00089 case TOP_cmp_z2_gt_or_andcm:
00090 case TOP_cmp_z2_le_or_andcm:
00091 case TOP_cmp_z2_lt_or_andcm:
00092 case TOP_tbit_nz_or_andcm:
00093 case TOP_tbit_z_or_andcm:
00094 case TOP_tnat_nz_or_andcm:
00095 case TOP_tnat_z_or_andcm:
00096 itype = PQS_ITYPE_ORANDCM;
00097 break;
00098
00099 case TOP_cmp4_eq_and_orcm:
00100 case TOP_cmp4_ge_and_orcm:
00101 case TOP_cmp4_gt_and_orcm:
00102 case TOP_cmp4_i_eq_and_orcm:
00103 case TOP_cmp4_i_ne_and_orcm:
00104 case TOP_cmp4_le_and_orcm:
00105 case TOP_cmp4_lt_and_orcm:
00106 case TOP_cmp4_ne_and_orcm:
00107 case TOP_cmp4_z1_ge_and_orcm:
00108 case TOP_cmp4_z1_gt_and_orcm:
00109 case TOP_cmp4_z1_le_and_orcm:
00110 case TOP_cmp4_z1_lt_and_orcm:
00111 case TOP_cmp4_z2_ge_and_orcm:
00112 case TOP_cmp4_z2_gt_and_orcm:
00113 case TOP_cmp4_z2_le_and_orcm:
00114 case TOP_cmp4_z2_lt_and_orcm:
00115 case TOP_cmp_eq_and_orcm:
00116 case TOP_cmp_ge_and_orcm:
00117 case TOP_cmp_gt_and_orcm:
00118 case TOP_cmp_i_eq_and_orcm:
00119 case TOP_cmp_i_ne_and_orcm:
00120 case TOP_cmp_le_and_orcm:
00121 case TOP_cmp_lt_and_orcm:
00122 case TOP_cmp_ne_and_orcm:
00123 case TOP_cmp_z1_ge_and_orcm:
00124 case TOP_cmp_z1_gt_and_orcm:
00125 case TOP_cmp_z1_le_and_orcm:
00126 case TOP_cmp_z1_lt_and_orcm:
00127 case TOP_cmp_z2_ge_and_orcm:
00128 case TOP_cmp_z2_gt_and_orcm:
00129 case TOP_cmp_z2_le_and_orcm:
00130 case TOP_cmp_z2_lt_and_orcm:
00131 itype = PQS_ITYPE_ORANDCM;
00132 break;
00133
00134 case TOP_cmp4_eq_andcm:
00135 case TOP_cmp4_ge_andcm:
00136 case TOP_cmp4_gt_andcm:
00137 case TOP_cmp4_i_eq_andcm:
00138 case TOP_cmp4_i_ne_andcm:
00139 case TOP_cmp4_le_andcm:
00140 case TOP_cmp4_lt_andcm:
00141 case TOP_cmp4_ne_andcm:
00142 case TOP_cmp4_z1_ge_andcm:
00143 case TOP_cmp4_z1_gt_andcm:
00144 case TOP_cmp4_z1_le_andcm:
00145 case TOP_cmp4_z1_lt_andcm:
00146 case TOP_cmp4_z2_ge_andcm:
00147 case TOP_cmp4_z2_gt_andcm:
00148 case TOP_cmp4_z2_le_andcm:
00149 case TOP_cmp4_z2_lt_andcm:
00150 case TOP_cmp_eq_andcm:
00151 case TOP_cmp_ge_andcm:
00152 case TOP_cmp_gt_andcm:
00153 case TOP_cmp_i_eq_andcm:
00154 case TOP_cmp_i_ne_andcm:
00155 case TOP_cmp_le_andcm:
00156 case TOP_cmp_lt_andcm:
00157 case TOP_cmp_ne_andcm:
00158 case TOP_cmp_z1_ge_andcm:
00159 case TOP_cmp_z1_gt_andcm:
00160 case TOP_cmp_z1_le_andcm:
00161 case TOP_cmp_z1_lt_andcm:
00162 case TOP_cmp_z2_ge_andcm:
00163 case TOP_cmp_z2_gt_andcm:
00164 case TOP_cmp_z2_le_andcm:
00165 case TOP_cmp_z2_lt_andcm:
00166 itype = PQS_ITYPE_ANDCM;
00167 break;
00168
00169 case TOP_cmp4_eq_and:
00170 case TOP_cmp4_ge_and:
00171 case TOP_cmp4_gt_and:
00172 case TOP_cmp4_i_eq_and:
00173 case TOP_cmp4_i_ne_and:
00174 case TOP_cmp4_le_and:
00175 case TOP_cmp4_lt_and:
00176 case TOP_cmp4_ne_and:
00177 case TOP_cmp4_z1_ge_and:
00178 case TOP_cmp4_z1_gt_and:
00179 case TOP_cmp4_z1_le_and:
00180 case TOP_cmp4_z1_lt_and:
00181 case TOP_cmp4_z2_ge_and:
00182 case TOP_cmp4_z2_gt_and:
00183 case TOP_cmp4_z2_le_and:
00184 case TOP_cmp4_z2_lt_and:
00185 case TOP_cmp_eq_and:
00186 case TOP_cmp_ge_and:
00187 case TOP_cmp_gt_and:
00188 case TOP_cmp_i_eq_and:
00189 case TOP_cmp_i_ne_and:
00190 case TOP_cmp_le_and:
00191 case TOP_cmp_lt_and:
00192 case TOP_cmp_ne_and:
00193 case TOP_cmp_z1_ge_and:
00194 case TOP_cmp_z1_gt_and:
00195 case TOP_cmp_z1_le_and:
00196 case TOP_cmp_z1_lt_and:
00197 case TOP_cmp_z2_ge_and:
00198 case TOP_cmp_z2_gt_and:
00199 case TOP_cmp_z2_le_and:
00200 case TOP_cmp_z2_lt_and:
00201 case TOP_tbit_nz_and:
00202 case TOP_tbit_z_and:
00203 case TOP_tnat_nz_and:
00204 case TOP_tnat_z_and:
00205 itype = PQS_ITYPE_AND;
00206 break;
00207
00208 case TOP_cmp4_eq_orcm:
00209 case TOP_cmp4_ge_orcm:
00210 case TOP_cmp4_gt_orcm:
00211 case TOP_cmp4_i_eq_orcm:
00212 case TOP_cmp4_i_ne_orcm:
00213 case TOP_cmp4_le_orcm:
00214 case TOP_cmp4_lt_orcm:
00215 case TOP_cmp4_ne_orcm:
00216 case TOP_cmp4_z1_ge_orcm:
00217 case TOP_cmp4_z1_gt_orcm:
00218 case TOP_cmp4_z1_le_orcm:
00219 case TOP_cmp4_z1_lt_orcm:
00220 case TOP_cmp4_z2_ge_orcm:
00221 case TOP_cmp4_z2_gt_orcm:
00222 case TOP_cmp4_z2_le_orcm:
00223 case TOP_cmp4_z2_lt_orcm:
00224 case TOP_cmp_eq_orcm:
00225 case TOP_cmp_ge_orcm:
00226 case TOP_cmp_gt_orcm:
00227 case TOP_cmp_i_eq_orcm:
00228 case TOP_cmp_i_ne_orcm:
00229 case TOP_cmp_le_orcm:
00230 case TOP_cmp_lt_orcm:
00231 case TOP_cmp_ne_orcm:
00232 case TOP_cmp_z1_ge_orcm:
00233 case TOP_cmp_z1_gt_orcm:
00234 case TOP_cmp_z1_le_orcm:
00235 case TOP_cmp_z1_lt_orcm:
00236 case TOP_cmp_z2_ge_orcm:
00237 case TOP_cmp_z2_gt_orcm:
00238 case TOP_cmp_z2_le_orcm:
00239 case TOP_cmp_z2_lt_orcm:
00240 itype = PQS_ITYPE_ORCM;
00241 break;
00242
00243
00244 case TOP_cmp4_eq_or:
00245 case TOP_cmp4_ge_or:
00246 case TOP_cmp4_gt_or:
00247 case TOP_cmp4_i_eq_or:
00248 case TOP_cmp4_i_ne_or:
00249 case TOP_cmp4_le_or:
00250 case TOP_cmp4_lt_or:
00251 case TOP_cmp4_ne_or:
00252 case TOP_cmp4_z1_ge_or:
00253 case TOP_cmp4_z1_gt_or:
00254 case TOP_cmp4_z1_le_or:
00255 case TOP_cmp4_z1_lt_or:
00256 case TOP_cmp4_z2_ge_or:
00257 case TOP_cmp4_z2_gt_or:
00258 case TOP_cmp4_z2_le_or:
00259 case TOP_cmp4_z2_lt_or:
00260 case TOP_cmp_eq_or:
00261 case TOP_cmp_ge_or:
00262 case TOP_cmp_gt_or:
00263 case TOP_cmp_i_eq_or:
00264 case TOP_cmp_i_ne_or:
00265 case TOP_cmp_le_or:
00266 case TOP_cmp_lt_or:
00267 case TOP_cmp_ne_or:
00268 case TOP_cmp_z1_ge_or:
00269 case TOP_cmp_z1_gt_or:
00270 case TOP_cmp_z1_le_or:
00271 case TOP_cmp_z1_lt_or:
00272 case TOP_cmp_z2_ge_or:
00273 case TOP_cmp_z2_gt_or:
00274 case TOP_cmp_z2_le_or:
00275 case TOP_cmp_z2_lt_or:
00276 case TOP_tbit_nz_or:
00277 case TOP_tbit_z_or:
00278 case TOP_tnat_nz_or:
00279 case TOP_tnat_z_or:
00280 itype = PQS_ITYPE_OR;
00281 break;
00282
00283 case TOP_fcmp_ord_unc:
00284 case TOP_fcmp_unord_unc:
00285 case TOP_cmp4_eq_unc:
00286 case TOP_cmp4_ge_unc:
00287 case TOP_cmp4_geu_unc:
00288 case TOP_cmp4_gt_unc:
00289 case TOP_cmp4_gtu_unc:
00290 case TOP_cmp4_i_eq_unc:
00291 case TOP_cmp4_i_ge_unc:
00292 case TOP_cmp4_i_geu_unc:
00293 case TOP_cmp4_i_gt_unc:
00294 case TOP_cmp4_i_gtu_unc:
00295 case TOP_cmp4_i_le_unc:
00296 case TOP_cmp4_i_leu_unc:
00297 case TOP_cmp4_i_lt_unc:
00298 case TOP_cmp4_i_ltu_unc:
00299 case TOP_cmp4_i_ne_unc:
00300 case TOP_cmp4_le_unc:
00301 case TOP_cmp4_leu_unc:
00302 case TOP_cmp4_lt_unc:
00303 case TOP_cmp4_ltu_unc:
00304 case TOP_cmp4_ne_unc:
00305 case TOP_cmp_eq_unc:
00306 case TOP_cmp_ge_unc:
00307 case TOP_cmp_geu_unc:
00308 case TOP_cmp_gt_unc:
00309 case TOP_cmp_gtu_unc:
00310 case TOP_cmp_i_eq_unc:
00311 case TOP_cmp_i_ge_unc:
00312 case TOP_cmp_i_geu_unc:
00313 case TOP_cmp_i_gt_unc:
00314 case TOP_cmp_i_gtu_unc:
00315 case TOP_cmp_i_le_unc:
00316 case TOP_cmp_i_leu_unc:
00317 case TOP_cmp_i_lt_unc:
00318 case TOP_cmp_i_ltu_unc:
00319 case TOP_cmp_i_ne_unc:
00320 case TOP_cmp_le_unc:
00321 case TOP_cmp_leu_unc:
00322 case TOP_cmp_lt_unc:
00323 case TOP_cmp_ltu_unc:
00324 case TOP_cmp_ne_unc:
00325 case TOP_fclass_m_unc:
00326 case TOP_fclass_nm_unc:
00327 case TOP_fcmp_eq_unc:
00328 case TOP_fcmp_ge_unc:
00329 case TOP_fcmp_gt_unc:
00330 case TOP_fcmp_le_unc:
00331 case TOP_fcmp_lt_unc:
00332 case TOP_fcmp_neq_unc:
00333 case TOP_fcmp_nge_unc:
00334 case TOP_fcmp_ngt_unc:
00335 case TOP_fcmp_nle_unc:
00336 case TOP_fcmp_nlt_unc:
00337 case TOP_tbit_nz_unc:
00338 case TOP_tbit_z_unc:
00339 case TOP_tnat_nz_unc:
00340 case TOP_tnat_z_unc:
00341 itype = PQS_ITYPE_UNC;
00342 break;
00343
00344 case TOP_fcmp_ord:
00345 case TOP_fcmp_unord:
00346 case TOP_cmp4_eq:
00347 case TOP_cmp4_ge:
00348 case TOP_cmp4_geu:
00349 case TOP_cmp4_gt:
00350 case TOP_cmp4_gtu:
00351 case TOP_cmp4_i_eq:
00352 case TOP_cmp4_i_ge:
00353 case TOP_cmp4_i_geu:
00354 case TOP_cmp4_i_gt:
00355 case TOP_cmp4_i_gtu:
00356 case TOP_cmp4_i_le:
00357 case TOP_cmp4_i_leu:
00358 case TOP_cmp4_i_lt:
00359 case TOP_cmp4_i_ltu:
00360 case TOP_cmp4_i_ne:
00361 case TOP_cmp4_le:
00362 case TOP_cmp4_leu:
00363 case TOP_cmp4_lt:
00364 case TOP_cmp4_ltu:
00365 case TOP_cmp4_ne:
00366 case TOP_cmp_eq:
00367 case TOP_cmp_ge:
00368 case TOP_cmp_geu:
00369 case TOP_cmp_gt:
00370 case TOP_cmp_gtu:
00371 case TOP_cmp_i_eq:
00372 case TOP_cmp_i_ge:
00373 case TOP_cmp_i_geu:
00374 case TOP_cmp_i_gt:
00375 case TOP_cmp_i_gtu:
00376 case TOP_cmp_i_le:
00377 case TOP_cmp_i_leu:
00378 case TOP_cmp_i_lt:
00379 case TOP_cmp_i_ltu:
00380 case TOP_cmp_i_ne:
00381 case TOP_cmp_le:
00382 case TOP_cmp_leu:
00383 case TOP_cmp_lt:
00384 case TOP_cmp_ltu:
00385 case TOP_cmp_ne:
00386 case TOP_fclass_m:
00387 case TOP_fclass_nm:
00388 case TOP_fcmp_eq:
00389 case TOP_fcmp_ge:
00390 case TOP_fcmp_gt:
00391 case TOP_fcmp_le:
00392 case TOP_fcmp_lt:
00393 case TOP_fcmp_neq:
00394 case TOP_fcmp_nge:
00395 case TOP_fcmp_ngt:
00396 case TOP_fcmp_nle:
00397 case TOP_fcmp_nlt:
00398 case TOP_tbit_nz:
00399 case TOP_tbit_z:
00400 case TOP_tnat_nz:
00401 case TOP_tnat_z:
00402 itype = PQS_ITYPE_NORM;
00403 break;
00404
00405 case TOP_frcpa:
00406 case TOP_frsqrta:
00407 itype = PQS_ITYPE_DIVSQRT;
00408 break;
00409
00410 default:
00411 itype = PQS_ITYPE_NOPREDICATES;
00412 break;
00413 }
00414
00415
00416 switch (x) {
00417 case TOP_fcmp_neq:
00418 case TOP_fcmp_neq_unc:
00419 case TOP_cmp4_i_ne:
00420 case TOP_cmp4_i_ne_and:
00421 case TOP_cmp4_i_ne_and_orcm:
00422 case TOP_cmp4_i_ne_andcm:
00423 case TOP_cmp4_i_ne_or:
00424 case TOP_cmp4_i_ne_or_andcm:
00425 case TOP_cmp4_i_ne_orcm:
00426 case TOP_cmp4_i_ne_unc:
00427 case TOP_cmp4_ne:
00428 case TOP_cmp4_ne_and:
00429 case TOP_cmp4_ne_and_orcm:
00430 case TOP_cmp4_ne_andcm:
00431 case TOP_cmp4_ne_or:
00432 case TOP_cmp4_ne_or_andcm:
00433 case TOP_cmp4_ne_orcm:
00434 case TOP_cmp4_ne_unc:
00435 case TOP_cmp_i_ne:
00436 case TOP_cmp_i_ne_and:
00437 case TOP_cmp_i_ne_and_orcm:
00438 case TOP_cmp_i_ne_andcm:
00439 case TOP_cmp_i_ne_or:
00440 case TOP_cmp_i_ne_or_andcm:
00441 case TOP_cmp_i_ne_orcm:
00442 case TOP_cmp_i_ne_unc:
00443 case TOP_cmp_ne:
00444 case TOP_cmp_ne_and:
00445 case TOP_cmp_ne_and_orcm:
00446 case TOP_cmp_ne_andcm:
00447 case TOP_cmp_ne_or:
00448 case TOP_cmp_ne_or_andcm:
00449 case TOP_cmp_ne_orcm:
00450 case TOP_cmp_ne_unc:
00451 relop = PQS_RELOPTYPE_NE;
00452 break;
00453
00454 case TOP_cmp4_eq:
00455 case TOP_cmp4_eq_and:
00456 case TOP_cmp4_eq_and_orcm:
00457 case TOP_cmp4_eq_andcm:
00458 case TOP_cmp4_eq_or:
00459 case TOP_cmp4_eq_or_andcm:
00460 case TOP_cmp4_eq_orcm:
00461 case TOP_cmp4_eq_unc:
00462 case TOP_cmp4_i_eq:
00463 case TOP_cmp4_i_eq_and:
00464 case TOP_cmp4_i_eq_and_orcm:
00465 case TOP_cmp4_i_eq_andcm:
00466 case TOP_cmp4_i_eq_or:
00467 case TOP_cmp4_i_eq_or_andcm:
00468 case TOP_cmp4_i_eq_orcm:
00469 case TOP_cmp4_i_eq_unc:
00470 case TOP_cmp_eq:
00471 case TOP_cmp_eq_and:
00472 case TOP_cmp_eq_and_orcm:
00473 case TOP_cmp_eq_andcm:
00474 case TOP_cmp_eq_or:
00475 case TOP_cmp_eq_or_andcm:
00476 case TOP_cmp_eq_orcm:
00477 case TOP_cmp_eq_unc:
00478 case TOP_cmp_i_eq:
00479 case TOP_cmp_i_eq_and:
00480 case TOP_cmp_i_eq_and_orcm:
00481 case TOP_cmp_i_eq_andcm:
00482 case TOP_cmp_i_eq_or:
00483 case TOP_cmp_i_eq_or_andcm:
00484 case TOP_cmp_i_eq_orcm:
00485 case TOP_cmp_i_eq_unc:
00486 case TOP_fcmp_eq:
00487 case TOP_fcmp_eq_unc:
00488 relop = PQS_RELOPTYPE_EQ;
00489 break;
00490
00491 }
00492
00493 return;
00494 }
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511 PQS_ITYPE
00512 PQS_classify_instruction (PQS_OP inst, PQS_TN &qual, PQS_TN &p1, PQS_TN &p2, PQS_NODE_FLAGS &flags)
00513 {
00514 PQS_ITYPE result;
00515 PQS_RELOPTYPE relop;
00516 TN *op1,*op2;
00517 TOP topcode;
00518 flags = 0;
00519 qual = NULL;
00520 p1 = NULL;
00521 p2 = NULL;
00522
00523 topcode = OP_code(inst);
00524 get_top_info(topcode, result, relop);
00525
00526 if (OP_has_predicate(inst)) {
00527 qual = OP_opnd(inst,OP_PREDICATE_OPND);
00528 }
00529
00530
00531 if (relop == PQS_RELOPTYPE_EQ) {
00532 op1 = OP_opnd(inst,1);
00533 op2 = OP_opnd(inst,2);
00534 if (op1 == op2) {
00535 flags = PQS_FLAG_CONDITION_TRUE;
00536 }
00537 }
00538
00539 if (relop == PQS_RELOPTYPE_NE) {
00540 op1 = OP_opnd(inst,1);
00541 op2 = OP_opnd(inst,2);
00542 if (op1 == op2) {
00543 flags = PQS_FLAG_CONDITION_FALSE;
00544 }
00545 }
00546
00547
00548 if (result != PQS_ITYPE_NOPREDICATES) {
00549
00550 if (result == PQS_ITYPE_DIVSQRT) {
00551 p1 = OP_result(inst,1);
00552 } else {
00553 p1 = OP_result(inst,0);
00554 p2 = OP_result(inst,1);
00555 }
00556 }
00557
00558 return (result);
00559 }
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571 static PQS_MANAGER *pqsm=NULL;
00572
00573
00574 static PQS_TN_MAP_TYPE *
00575 get_tn_map(const TN *t)
00576 {
00577 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00578 if (m == NULL) {
00579 m = CXX_NEW(PQS_TN_MAP_TYPE,&PQS_mem_pool);
00580 TN_MAP_Set(pqsm->PQS_tn_map,(TN *) t,m);
00581 }
00582 return (m);
00583 }
00584
00585
00586
00587
00588
00589 void PQS_MANAGER::Init_TN_OP_Info(void)
00590 {
00591 PQS_TN_MAP_TYPE *p0_map;
00592 PQS_TN_P0 = True_TN;
00593 PQS_tn_map = TN_MAP_Create();
00594 PQS_op_map = OP_MAP32_Create();
00595 p0_map = CXX_NEW(PQS_TN_MAP_TYPE,&PQS_mem_pool);
00596 TN_MAP_Set(PQS_tn_map,PQS_TN_P0,p0_map);
00597 p0_map->last_def = PQS_IDX_TRUE;
00598 }
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609 PQS_MANAGER::~PQS_MANAGER()
00610 {
00611 TN_MAP_Delete(PQS_tn_map);
00612 OP_MAP_Delete(PQS_op_map);
00613 }
00614
00615
00616
00617
00618 void
00619 PQSCG_init(BB * first_bb)
00620 {
00621 BB *bb;
00622 OP *op;
00623
00624 if (pqsm || PQS_disabled) return;
00625
00626 PQS_Init_Memory();
00627 MEM_POOL_Push(&PQS_mem_pool);
00628 pqsm = CXX_NEW(PQS_MANAGER,&MEM_phase_pool);
00629 PQS_tn_map = pqsm->PQS_tn_map;
00630 PQS_op_map = pqsm->PQS_op_map;
00631
00632
00633 FOR_ALL_BBLIST_ITEMS(first_bb,bb) {
00634 FOR_ALL_BB_OPs_FWD(bb,op) {
00635 pqsm->PQS_Add_Instruction(op);
00636 }
00637 }
00638
00639
00640 if (Get_Trace(TP_PQS, 1)) {
00641 PQS_Tracing = TRUE;
00642 } else {
00643 PQS_Tracing = FALSE;
00644 }
00645
00646 if (Get_Trace (TKIND_IR,TP_PQS)) {
00647 pqsm->Print_all(TFile);
00648 }
00649
00650 }
00651
00652
00653 void
00654 PQSCG_term(void)
00655 {
00656 if (pqsm) {
00657 CXX_DELETE(pqsm,&MEM_phase_pool);
00658 MEM_POOL_Pop(&PQS_mem_pool);
00659 pqsm = NULL;
00660 }
00661 }
00662
00663 void
00664 PQSCG_reinit(BB * first_bb)
00665 {
00666 PQSCG_term();
00667 PQSCG_init(first_bb);
00668 }
00669
00670 BOOL
00671 PQSCG_pqs_valid(void)
00672 {
00673 return pqsm != NULL;
00674 }
00675
00676
00677 void
00678 PQSCG_add_instruction(PQS_OP op)
00679 {
00680 pqsm->PQS_Add_Instruction(op);
00681 }
00682
00683
00684
00685
00686
00687
00688
00689 BOOL
00690 PQSCG_sets_results_if_qual_true(PQS_OP op)
00691 {
00692 PQS_ITYPE itype;
00693 PQS_TN qual, p1, p2;
00694 PQS_NODE_FLAGS flags;
00695 BOOL result=FALSE;
00696
00697 itype = PQS_classify_instruction (op, qual, p1, p2, flags);
00698 switch (itype) {
00699 case PQS_ITYPE_NOPREDICATES:
00700 case PQS_ITYPE_NORM:
00701 case PQS_ITYPE_UNC:
00702 case PQS_ITYPE_DIVSQRT:
00703 result = TRUE;
00704 break;
00705
00706 case PQS_ITYPE_OR:
00707 case PQS_ITYPE_ORANDCM:
00708 case PQS_ITYPE_ANDCM:
00709 result = (flags & PQS_FLAG_CONDITION_TRUE) != 0;
00710 break;
00711
00712 case PQS_ITYPE_ORCM:
00713 case PQS_ITYPE_AND:
00714 case PQS_ITYPE_ANDORCM:
00715 result = (flags & PQS_FLAG_CONDITION_FALSE) != 0;
00716 break;
00717 }
00718
00719 return (result);
00720 }
00721
00722 void
00723 PQSCG_copy_tn_map(PQS_TN tn_out, PQS_TN tn_in)
00724 {
00725 PQS_TN_MAP_TYPE *m_in=get_tn_map(tn_in);
00726 PQS_TN_MAP_TYPE *m_out=get_tn_map(tn_out);
00727
00728
00729 *m_out = *m_in;
00730
00731 if (m_out->tn_to_use == NULL) {
00732 m_out->tn_to_use = tn_in;
00733 }
00734 }
00735
00736
00737
00738 MEM_POOL * PQSCG_get_mempool(void)
00739 {
00740 return &PQS_mem_pool;
00741 }
00742
00743
00744
00745
00746
00747
00748
00749 #define MAKE_SURE_PQSM_INTIALIZED Is_True(pqsm,("Predicate query system not yet intialized"))
00750
00751 BOOL PQSCG_is_disjoint(PQS_TN tn1, PQS_TN tn2){
00752 if (!pqsm) return (FALSE);
00753 return pqsm->PQS_is_disjoint(tn1,tn2);
00754 }
00755
00756 BOOL PQSCG_is_disjoint(PQS_TN_SET &tns1, PQS_TN_SET &tns2)
00757 {
00758 if (!pqsm) return (FALSE);
00759 return pqsm->PQS_is_disjoint(tns1,tns2);
00760 }
00761
00762 BOOL PQSCG_is_subset_of (PQS_TN tn1, PQS_TN tn2)
00763 {
00764 if ((tn1 == tn2) || tn2 == True_TN) return (TRUE);
00765 if (!pqsm) return (FALSE);
00766 return pqsm->PQS_is_subset_of (tn1, tn2);
00767 }
00768
00769 BOOL PQSCG_is_subset_of (PQS_TN tn1, PQS_TN_SET &tns2)
00770 {
00771 if (tns2.Is_Subset(True_TN) || tns2.Is_Subset(tn1)) return (TRUE);
00772 if (!pqsm) return (FALSE);
00773 return pqsm->PQS_is_subset_of (tn1, tns2);
00774 }
00775
00776 BOOL PQSCG_is_subset_of (PQS_TN_SET &tns1, PQS_TN_SET &tns2)
00777 {
00778 if (tns2.Is_Subset(True_TN) || tns2.Is_Subset(tns1)) return (TRUE);
00779 if (!pqsm) return (FALSE);
00780 return pqsm->PQS_is_subset_of (tns1, tns2);
00781 }
00782
00783
00784
00785
00786
00787
00788
00789 PQS_NODE_IDX PQS_TN_get_last_definition(const TN *t)
00790 {
00791 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00792 if (m) return m->last_def;
00793 return (PQS_IDX_NONE);
00794 }
00795
00796 PQS_NODE_IDX PQS_TN_used_as_qual_pred(const TN *t)
00797 {
00798 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00799 if (m) return m->used_as_qual_pred;
00800 return (FALSE);
00801 }
00802
00803 PQS_NODE_IDX PQS_TN_no_query(const TN *t)
00804 {
00805 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00806 if (m) return m->no_query;
00807 return (TRUE);
00808 }
00809
00810
00811
00812 void PQS_TN_set_last_definition(const TN *t, PQS_NODE_IDX p)
00813 {
00814 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00815 m->last_def = p;
00816 }
00817
00818 void PQS_TN_set_used_as_qual_pred(const TN *t)
00819 {
00820 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00821 m->used_as_qual_pred = TRUE;
00822 }
00823
00824 void PQS_TN_set_no_query(const TN *t)
00825 {
00826 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00827 m->no_query = TRUE;
00828 }
00829
00830
00831 PQS_TN
00832 PQS_TN_get_tn_to_use(const TN *t)
00833 {
00834 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00835 if (m->tn_to_use != NULL) {
00836 return m->tn_to_use;
00837 } else {
00838 return (PQS_TN) t;
00839 }
00840 }
00841
00842 void
00843 PQS_TN_set_tn_to_use(const TN *t, const TN *to_use)
00844 {
00845 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00846 m->tn_to_use = (PQS_TN) to_use;
00847 }
00848
00849 void
00850 PQS_OP_set_pqs_idx(OP *op, PQS_NODE_IDX p)
00851 {
00852 OP_MAP32_Set(pqsm->PQS_op_map,op,p);
00853 }
00854
00855
00856 PQS_NODE_IDX
00857 PQS_OP_get_pqs_idx(OP *op)
00858 {
00859 return OP_MAP32_Get(PQS_op_map,op);
00860 }
00861
00862
00863
00864
00865
00866 void dump_idx(PQS_NODE_IDX idx)
00867 {
00868 pqsm->Print_idx(idx);
00869 }