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=TRUE;
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 return;
00060 }
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 PQS_ITYPE
00078 PQS_classify_instruction (PQS_OP inst, PQS_TN &qual, PQS_TN &p1, PQS_TN &p2, PQS_NODE_FLAGS &flags)
00079 {
00080 PQS_ITYPE result;
00081 PQS_RELOPTYPE relop;
00082 TN *op1,*op2;
00083 TOP topcode;
00084 flags = 0;
00085 qual = NULL;
00086 p1 = NULL;
00087 p2 = NULL;
00088
00089 topcode = OP_code(inst);
00090 get_top_info(topcode, result, relop);
00091
00092 if (OP_has_predicate(inst)) {
00093 qual = OP_opnd(inst,OP_PREDICATE_OPND);
00094 }
00095
00096
00097 if (relop == PQS_RELOPTYPE_EQ) {
00098 op1 = OP_opnd(inst,1);
00099 op2 = OP_opnd(inst,2);
00100 if (op1 == op2) {
00101 flags = PQS_FLAG_CONDITION_TRUE;
00102 }
00103 }
00104
00105 if (relop == PQS_RELOPTYPE_NE) {
00106 op1 = OP_opnd(inst,1);
00107 op2 = OP_opnd(inst,2);
00108 if (op1 == op2) {
00109 flags = PQS_FLAG_CONDITION_FALSE;
00110 }
00111 }
00112
00113
00114 if (result != PQS_ITYPE_NOPREDICATES) {
00115
00116 if (result == PQS_ITYPE_DIVSQRT) {
00117 p1 = OP_result(inst,1);
00118 } else {
00119 p1 = OP_result(inst,0);
00120 p2 = OP_result(inst,1);
00121 }
00122 }
00123
00124 return (result);
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 static PQS_MANAGER *pqsm=NULL;
00138
00139
00140 static PQS_TN_MAP_TYPE *
00141 get_tn_map(const TN *t)
00142 {
00143 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00144 if (m == NULL) {
00145 m = CXX_NEW(PQS_TN_MAP_TYPE,&PQS_mem_pool);
00146 TN_MAP_Set(pqsm->PQS_tn_map,(TN *) t,m);
00147 }
00148 return (m);
00149 }
00150
00151
00152
00153
00154
00155 void PQS_MANAGER::Init_TN_OP_Info(void)
00156 {
00157 PQS_TN_MAP_TYPE *p0_map;
00158 PQS_TN_P0 = True_TN;
00159 PQS_tn_map = TN_MAP_Create();
00160 PQS_op_map = OP_MAP32_Create();
00161 p0_map = CXX_NEW(PQS_TN_MAP_TYPE,&PQS_mem_pool);
00162 TN_MAP_Set(PQS_tn_map,PQS_TN_P0,p0_map);
00163 p0_map->last_def = PQS_IDX_TRUE;
00164 }
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 PQS_MANAGER::~PQS_MANAGER()
00176 {
00177 TN_MAP_Delete(PQS_tn_map);
00178 OP_MAP_Delete(PQS_op_map);
00179 }
00180
00181
00182
00183
00184 void
00185 PQSCG_init(BB * first_bb)
00186 {
00187 BB *bb;
00188 OP *op;
00189
00190 if (pqsm || PQS_disabled) return;
00191
00192 PQS_Init_Memory();
00193 MEM_POOL_Push(&PQS_mem_pool);
00194 pqsm = CXX_NEW(PQS_MANAGER,&MEM_phase_pool);
00195 PQS_tn_map = pqsm->PQS_tn_map;
00196 PQS_op_map = pqsm->PQS_op_map;
00197
00198
00199 FOR_ALL_BBLIST_ITEMS(first_bb,bb) {
00200 FOR_ALL_BB_OPs_FWD(bb,op) {
00201 pqsm->PQS_Add_Instruction(op);
00202 }
00203 }
00204
00205
00206 if (Get_Trace(TP_PQS, 1)) {
00207 PQS_Tracing = TRUE;
00208 } else {
00209 PQS_Tracing = FALSE;
00210 }
00211
00212 if (Get_Trace (TKIND_IR,TP_PQS)) {
00213 pqsm->Print_all(TFile);
00214 }
00215
00216 }
00217
00218
00219 void
00220 PQSCG_term(void)
00221 {
00222 if (pqsm) {
00223 CXX_DELETE(pqsm,&MEM_phase_pool);
00224 MEM_POOL_Pop(&PQS_mem_pool);
00225 pqsm = NULL;
00226 }
00227 }
00228
00229 void
00230 PQSCG_reinit(BB * first_bb)
00231 {
00232 PQSCG_term();
00233 PQSCG_init(first_bb);
00234 }
00235
00236 BOOL
00237 PQSCG_pqs_valid(void)
00238 {
00239 return pqsm != NULL;
00240 }
00241
00242
00243 void
00244 PQSCG_add_instruction(PQS_OP op)
00245 {
00246 pqsm->PQS_Add_Instruction(op);
00247 }
00248
00249
00250
00251
00252
00253
00254
00255 BOOL
00256 PQSCG_sets_results_if_qual_true(PQS_OP op)
00257 {
00258 PQS_ITYPE itype;
00259 PQS_TN qual, p1, p2;
00260 PQS_NODE_FLAGS flags;
00261 BOOL result=FALSE;
00262
00263 itype = PQS_classify_instruction (op, qual, p1, p2, flags);
00264 switch (itype) {
00265 case PQS_ITYPE_NOPREDICATES:
00266 case PQS_ITYPE_NORM:
00267 case PQS_ITYPE_UNC:
00268 case PQS_ITYPE_DIVSQRT:
00269 result = TRUE;
00270 break;
00271
00272 case PQS_ITYPE_OR:
00273 case PQS_ITYPE_ORANDCM:
00274 case PQS_ITYPE_ANDCM:
00275 result = (flags & PQS_FLAG_CONDITION_TRUE) != 0;
00276 break;
00277
00278 case PQS_ITYPE_ORCM:
00279 case PQS_ITYPE_AND:
00280 case PQS_ITYPE_ANDORCM:
00281 result = (flags & PQS_FLAG_CONDITION_FALSE) != 0;
00282 break;
00283 }
00284
00285 return (result);
00286 }
00287
00288 void
00289 PQSCG_copy_tn_map(PQS_TN tn_out, PQS_TN tn_in)
00290 {
00291 PQS_TN_MAP_TYPE *m_in=get_tn_map(tn_in);
00292 PQS_TN_MAP_TYPE *m_out=get_tn_map(tn_out);
00293
00294
00295 *m_out = *m_in;
00296
00297 if (m_out->tn_to_use == NULL) {
00298 m_out->tn_to_use = tn_in;
00299 }
00300 }
00301
00302
00303
00304 MEM_POOL * PQSCG_get_mempool(void)
00305 {
00306 return &PQS_mem_pool;
00307 }
00308
00309
00310
00311
00312
00313
00314
00315 #define MAKE_SURE_PQSM_INTIALIZED Is_True(pqsm,("Predicate query system not yet intialized"))
00316
00317 BOOL PQSCG_is_disjoint(PQS_TN tn1, PQS_TN tn2){
00318 if (!pqsm) return (FALSE);
00319 return pqsm->PQS_is_disjoint(tn1,tn2);
00320 }
00321
00322 BOOL PQSCG_is_disjoint(PQS_TN_SET &tns1, PQS_TN_SET &tns2)
00323 {
00324 if (!pqsm) return (FALSE);
00325 return pqsm->PQS_is_disjoint(tns1,tns2);
00326 }
00327
00328 BOOL PQSCG_is_subset_of (PQS_TN tn1, PQS_TN tn2)
00329 {
00330 if ((tn1 == tn2) || tn2 == True_TN) return (TRUE);
00331 if (!pqsm) return (FALSE);
00332 return pqsm->PQS_is_subset_of (tn1, tn2);
00333 }
00334
00335 BOOL PQSCG_is_subset_of (PQS_TN tn1, PQS_TN_SET &tns2)
00336 {
00337 if (tns2.Is_Subset(True_TN) || tns2.Is_Subset(tn1)) return (TRUE);
00338 if (!pqsm) return (FALSE);
00339 return pqsm->PQS_is_subset_of (tn1, tns2);
00340 }
00341
00342 BOOL PQSCG_is_subset_of (PQS_TN_SET &tns1, PQS_TN_SET &tns2)
00343 {
00344 if (tns2.Is_Subset(True_TN) || tns2.Is_Subset(tns1)) return (TRUE);
00345 if (!pqsm) return (FALSE);
00346 return pqsm->PQS_is_subset_of (tns1, tns2);
00347 }
00348
00349
00350
00351
00352
00353
00354
00355 PQS_NODE_IDX PQS_TN_get_last_definition(const TN *t)
00356 {
00357 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00358 if (m) return m->last_def;
00359 return (PQS_IDX_NONE);
00360 }
00361
00362 PQS_NODE_IDX PQS_TN_used_as_qual_pred(const TN *t)
00363 {
00364 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00365 if (m) return m->used_as_qual_pred;
00366 return (FALSE);
00367 }
00368
00369 PQS_NODE_IDX PQS_TN_no_query(const TN *t)
00370 {
00371 PQS_TN_MAP_TYPE *m = (PQS_TN_MAP_TYPE *) TN_MAP_Get(pqsm->PQS_tn_map,t);
00372 if (m) return m->no_query;
00373 return (TRUE);
00374 }
00375
00376
00377
00378 void PQS_TN_set_last_definition(const TN *t, PQS_NODE_IDX p)
00379 {
00380 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00381 m->last_def = p;
00382 }
00383
00384 void PQS_TN_set_used_as_qual_pred(const TN *t)
00385 {
00386 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00387 m->used_as_qual_pred = TRUE;
00388 }
00389
00390 void PQS_TN_set_no_query(const TN *t)
00391 {
00392 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00393 m->no_query = TRUE;
00394 }
00395
00396
00397 PQS_TN
00398 PQS_TN_get_tn_to_use(const TN *t)
00399 {
00400 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00401 if (m->tn_to_use != NULL) {
00402 return m->tn_to_use;
00403 } else {
00404 return (PQS_TN) t;
00405 }
00406 }
00407
00408 void
00409 PQS_TN_set_tn_to_use(const TN *t, const TN *to_use)
00410 {
00411 PQS_TN_MAP_TYPE *m=get_tn_map(t);
00412 m->tn_to_use = (PQS_TN) to_use;
00413 }
00414
00415 void
00416 PQS_OP_set_pqs_idx(OP *op, PQS_NODE_IDX p)
00417 {
00418 OP_MAP32_Set(pqsm->PQS_op_map,op,p);
00419 }
00420
00421
00422 PQS_NODE_IDX
00423 PQS_OP_get_pqs_idx(OP *op)
00424 {
00425 return OP_MAP32_Get(PQS_op_map,op);
00426 }
00427
00428
00429
00430
00431
00432 void dump_idx(PQS_NODE_IDX idx)
00433 {
00434 pqsm->Print_idx(idx);
00435 }