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 #include "math.h"
00039 #include "limits.h"
00040 #include "defs.h"
00041 #include "erglob.h"
00042 #include "tracing.h"
00043 #include "mempool.h"
00044 #include "cg.h"
00045 #include "cgir.h"
00046 #include "op_list.h"
00047 #include "ti_res_count.h"
00048 #include "register.h"
00049 #include "config.h"
00050 #include "tn_prop.h"
00051 #include "bb.h"
00052 #include "cgtarget.h"
00053 #include "cg_loop_scc_prop.h"
00054 #include "cg_loop_scc.h"
00055 #include "cg_loop.h"
00056
00057 #include "cg_loop_mii.h"
00058
00059 INT32 CG_LOOP_min_ii;
00060 INT32 CG_LOOP_res_min_ii;
00061 #ifdef TARG_IA64
00062 INT32 CG_LOOP_rec_min_ii_with_dspec;
00063 #endif
00064
00065 INT32 CG_LOOP_rec_min_ii;
00066
00067 static INT trace_mii = -1;
00068 static CG_LOOP_SCC *scc;
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 static void Trace_Begin_Min_II(BB *bb)
00079 {
00080 if ( trace_mii ) {
00081 #pragma mips_frequency_hint NEVER
00082 if ( trace_mii < 0 ) {
00083 trace_mii = Get_Trace(TP_CGLOOP,0x2000,bb);
00084 if ( !trace_mii ) return;
00085 }
00086 fprintf(TFile,"<cg_loop_mii> Begin %s Min II calculation for loop at line %d\n",
00087 Get_Error_Phase(), BB_Loop_Lineno(bb));
00088 }
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 static void Trace_End_Min_II(void)
00101 {
00102 if ( trace_mii ) {
00103 #pragma mips_frequency_hint NEVER
00104 fprintf(TFile,"<cg_loop_mii> CG_LOOP_min_ii %d\n",CG_LOOP_min_ii);
00105 }
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 static void Trace_Begin_Min_II_Resource(void)
00118 {
00119 if ( trace_mii ) {
00120 #pragma mips_frequency_hint NEVER
00121 fprintf(TFile,"<cg_loop_mii> Min resource II [");
00122 fflush(TFile);
00123 }
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 static INT32 pmin_ii;
00136
00137 static void Trace_Min_II_Resource_Pre_LOH(TI_RES_COUNT *res_counts)
00138 {
00139 pmin_ii = CG_LOOP_min_ii;
00140
00141 if ( trace_mii ) {
00142 #pragma mips_frequency_hint NEVER
00143 fprintf(TFile,"OK] %d",CG_LOOP_min_ii);
00144 fprintf(TFile,"\n<cg_loop_mii> ");
00145
00146 TI_RES_COUNT_Print(TFile, res_counts);
00147 fprintf(TFile,"\n");
00148 }
00149 }
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 static void Trace_Min_II_Resource_LOH(
00161 INT32 loh_mii
00162 )
00163 {
00164 if ( trace_mii
00165 && pmin_ii < loh_mii
00166 ) {
00167 #pragma mips_frequency_hint NEVER
00168 pmin_ii = loh_mii;
00169 fprintf(TFile,"<cg_loop_mii> Min LOH resource II %d",loh_mii);
00170
00171 #if 0
00172 fprintf(TFile, " (");
00173 Print_Resource_Vec(CG_LOOP_critical_loh_resource_vec,
00174 CG_LOOP_critical_loh_resource_count);
00175 fprintf(TFile, ")");
00176 #endif
00177 fprintf(TFile,"\n");
00178 }
00179 }
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 static void Trace_Begin_Min_II_Scc(
00191 BB *bb,
00192 CG_LOOP_SCC *s
00193 )
00194 {
00195 if ( trace_mii ) {
00196 #pragma mips_frequency_hint NEVER
00197 if ( trace_mii < 0 ) {
00198 trace_mii = Get_Trace(TP_CGLOOP,0x2000,bb);
00199 if ( !trace_mii ) return;
00200 }
00201
00202 scc = s;
00203
00204 fprintf(TFile,"<cg_loop_mii> Min recurrence II after scc #%d [",
00205 CG_LOOP_SCC_id(scc));
00206 fflush(TFile);
00207 }
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 static void Trace_End_Min_II_Scc(void)
00224 {
00225 if ( trace_mii ) {
00226 #pragma mips_frequency_hint NEVER
00227 fprintf(TFile,"OK] %d\n",CG_LOOP_min_ii);
00228
00229 if ( CG_LOOP_SCC_member_count(scc) > 1 )
00230 CG_LOOP_SCC_Print(scc);
00231 }
00232 }
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 inline INT
00244 Ceiling_Divide(
00245 INT x,
00246 INT y
00247 )
00248 {
00249 Is_True(y != 0,("Divide by 0"));
00250
00251 return (x + y - 1) / y;
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 static void
00264 Calculate_Min_Resource_II(
00265 BB *loop_body,
00266 OP_LIST *loop_overhead,
00267 BOOL ignore_prefetches,
00268 BOOL ignore_prefetch_strides
00269 )
00270 {
00271 TI_RES_COUNT *res_counts;
00272 OP *op;
00273 OP_LIST *loh_l;
00274
00275 Trace_Begin_Min_II_Resource();
00276
00277
00278
00279 res_counts = TI_RES_COUNT_Alloc(&MEM_local_nz_pool);
00280
00281
00282
00283
00284 for ( op = BB_first_op(loop_body); op != NULL; op = OP_next(op) ) {
00285 if (!OP_loh(op)) {
00286 TOP opc = OP_code(op);
00287 if (OP_prefetch(op)) {
00288 if (!ignore_prefetches) {
00289 if (ignore_prefetch_strides) {
00290 TI_RES_COUNT_Add_Op_Resources(res_counts, opc);
00291 } else {
00292 double stride = CG_LOOP_Prefetch_Stride(op);
00293 TI_RES_COUNT_Add_Op_Resources_Scaled(res_counts, opc, 1.0/stride);
00294 }
00295 }
00296 } else {
00297 TI_RES_COUNT_Add_Op_Resources(res_counts, opc);
00298 }
00299 }
00300 }
00301
00302 CG_LOOP_min_ii = TI_RES_COUNT_Min_II(res_counts);
00303
00304 Trace_Min_II_Resource_Pre_LOH(res_counts);
00305
00306
00307
00308
00309
00310
00311 for ( loh_l = loop_overhead; loh_l; loh_l = OP_LIST_rest(loh_l) ) {
00312 INT32 iv_update_mii;
00313 OP *loh = OP_LIST_first(loh_l);
00314
00315 TI_RES_COUNT_Add_Op_Resources(res_counts,OP_code(loh));
00316 iv_update_mii = (INT32)ceil(TI_RES_COUNT_Min_Cycles(res_counts));
00317
00318 Set_OP_loh_mii(loh,iv_update_mii);
00319 Trace_Min_II_Resource_LOH(iv_update_mii);
00320 }
00321 }
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 typedef struct cost {
00389 INT latency;
00390 INT omega;
00391 } COST;
00392
00393 #define COST_latency(x) ((x)->latency)
00394 #define COST_omega(x) ((x)->omega)
00395
00396 typedef struct cost_vec {
00397 INT length;
00398 INT alloc_length;
00399 COST *costs;
00400 } COST_VEC;
00401
00402 #define COST_VEC_length(x) ((x)->length)
00403 #define COST_VEC_alloc_length(x) ((x)->alloc_length)
00404 #define COST_VEC_costs(x) ((x)->costs)
00405
00406 #define COST_VEC_cost(x,i) (COST_VEC_costs(x)[(i)])
00407 #define COST_VEC_latency(x,i) COST_latency(&COST_VEC_cost(x,i))
00408 #define COST_VEC_omega(x,i) COST_omega(&COST_VEC_cost(x,i))
00409
00410 typedef struct cost_table {
00411 INT n;
00412 COST_VEC cost_vecs[1];
00413 } COST_TABLE;
00414
00415 #define COST_TABLE_n(x) ((x)->n)
00416 #define COST_TABLE_cost_vecs(x) ((x)->cost_vecs)
00417
00418 #define COST_TABLE_cost_vec(x,i,j) \
00419 (&COST_TABLE_cost_vecs(x)[((i) * COST_TABLE_n(x)) + j])
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431 static void
00432 COST_VEC_Initialize(
00433 COST_VEC *self
00434 )
00435 {
00436 INT initial_length = 4;
00437
00438 COST_VEC_length(self) = 0;
00439 COST_VEC_alloc_length(self) = initial_length;
00440
00441 COST_VEC_costs(self) = TYPE_MEM_POOL_ALLOC_N(COST,
00442 &MEM_local_nz_pool,
00443 initial_length);
00444 }
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455 static void
00456 COST_VEC_Add_Cost(
00457 COST_VEC *cost_vec,
00458 INT omega,
00459 INT latency
00460 )
00461 {
00462 INT length = COST_VEC_length(cost_vec);
00463
00464 if (length == COST_VEC_alloc_length(cost_vec)) {
00465 INT i;
00466 INT new_length = length * 2;
00467 COST *new_vec = TYPE_MEM_POOL_ALLOC_N(COST,
00468 &MEM_local_nz_pool,
00469 new_length);
00470 COST *old_vec = COST_VEC_costs(cost_vec);
00471
00472 for ( i = 0; i < length; ++i ) {
00473 *(new_vec + i) = *(old_vec + i);
00474 }
00475
00476 COST_VEC_alloc_length(cost_vec) = new_length;
00477 COST_VEC_costs(cost_vec) = new_vec;
00478 }
00479
00480 COST_VEC_omega(cost_vec,length) = omega;
00481 COST_VEC_latency(cost_vec,length) = latency;
00482 COST_VEC_length(cost_vec) = length + 1;
00483 }
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495 static void
00496 COST_TABLE_Add_Cost(
00497 COST_TABLE *self,
00498 INT i,
00499 INT j,
00500 INT omega,
00501 INT latency
00502 ) {
00503 COST_VEC_Add_Cost(COST_TABLE_cost_vec(self,i,j),omega,latency);
00504 }
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514 static COST_TABLE*
00515 COST_TABLE_Alloc(
00516 INT n
00517 )
00518 {
00519 INT i;
00520 COST_TABLE *result;
00521 INT nxn = n * n;
00522
00523
00524
00525
00526 result = (COST_TABLE *) L_Alloc( sizeof(COST_TABLE)
00527 + sizeof(COST_VEC) * ((nxn) - 1));
00528
00529 COST_TABLE_n(result) = n;
00530
00531 for ( i = 0; i < nxn; ++i )
00532 COST_VEC_Initialize(&COST_TABLE_cost_vecs(result)[i]);
00533
00534 return result;
00535 }
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546 static void
00547 Calculate_Component_Direct_Costs_And_Min_Recurrence_II(
00548 CG_LOOP_SCC *scc,
00549 COST_TABLE *costs
00550 )
00551 {
00552 INT i;
00553 INT n = CG_LOOP_SCC_member_count(scc);
00554
00555 for ( i = 0; i < n; ++i ) {
00556 ARC_LIST *succ_arcs;
00557 OP *op = CG_LOOP_SCC_member(scc,i);
00558
00559 for ( succ_arcs = OP_succs(op);
00560 succ_arcs != NULL;
00561 succ_arcs = ARC_LIST_rest(succ_arcs)
00562 ) {
00563 ARC *succ_arc = ARC_LIST_first(succ_arcs);
00564 OP *succ_op = ARC_succ(succ_arc);
00565
00566 Is_True(op == ARC_pred(succ_arc),
00567 ("Thought ARC_pred == ARC_pred"));
00568
00569 if ( OP_scc(succ_op) == scc ) {
00570
00571 COST_TABLE_Add_Cost(costs,OP_scc_index(op),
00572 OP_scc_index(succ_op),
00573 ARC_omega(succ_arc),
00574 CGTARG_ARC_Sched_Latency(succ_arc));
00575
00576
00577
00578
00579 if ( succ_op == op ) {
00580 Set_CG_LOOP_SCC_rec_mii(scc,
00581 Max(CG_LOOP_SCC_rec_mii(scc),
00582 Ceiling_Divide(CGTARG_ARC_Sched_Latency(succ_arc),
00583 ARC_omega(succ_arc))));
00584 CG_LOOP_min_ii = Max(CG_LOOP_min_ii, CG_LOOP_SCC_rec_mii(scc));
00585 }
00586 }
00587 }
00588 }
00589 }
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601 static BOOL
00602 Is_Max_Cost(
00603 INT omega,
00604 INT latency,
00605 COST_VEC *cv,
00606 INT32 min_ii,
00607 INT offset
00608 )
00609 {
00610 INT i;
00611 INT len = COST_VEC_length(cv);
00612 COST *cp = COST_VEC_costs(cv);
00613
00614 for ( i = offset; i < len; ++i ) {
00615 INT cvomega = COST_omega(cp + i);
00616 INT cvlatency = COST_latency(cp + i);
00617
00618
00619
00620
00621 if ( (omega == cvomega && latency <= cvlatency)
00622 || omega > cvomega
00623 && (latency - cvlatency) <= ((omega - cvomega) * min_ii)
00624 ) {
00625 return FALSE;
00626 }
00627 }
00628 return TRUE;
00629 }
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644 static void
00645 Add_Maximal_Costs(
00646 COST_VEC *cvij,
00647 COST_VEC *cvik,
00648 COST_VEC *cvkj,
00649 INT32 min_ii
00650 )
00651 {
00652 INT i, j;
00653 COST *cvij_costs;
00654 INT cvij_length;
00655 COST *cvik_costs = COST_VEC_costs(cvik);
00656 COST *cvkj_costs = COST_VEC_costs(cvkj);
00657 INT cvik_length = COST_VEC_length(cvik);
00658 INT cvkj_length = COST_VEC_length(cvkj);
00659
00660
00661
00662
00663
00664 for ( i = 0; i < cvik_length; ++i ) {
00665 COST *cpik = cvik_costs + i;
00666 INT ikomega = COST_omega(cpik);
00667 INT iklatency = COST_latency(cpik);
00668
00669 for ( j = 0; j < cvkj_length; ++j ) {
00670 COST *cpkj = cvkj_costs + j;
00671 INT kjomega = COST_omega(cpkj);
00672 INT kjlatency = COST_latency(cpkj);
00673 INT ikjomega = ikomega + kjomega;
00674 INT ikjlatency = iklatency + kjlatency;
00675
00676 if ( Is_Max_Cost(ikjomega,ikjlatency,cvij,min_ii,0) )
00677 COST_VEC_Add_Cost(cvij,ikjomega,ikjlatency);
00678 }
00679 }
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691 cvij_costs = COST_VEC_costs(cvij);
00692 cvij_length = COST_VEC_length(cvij);
00693
00694 for ( i = cvij_length - 1; i >= 0; --i ) {
00695 COST *cpij = cvij_costs + i;
00696 INT omega = COST_omega(cpij);
00697 INT latency = COST_latency(cpij);
00698
00699 if ( ! Is_Max_Cost(omega,latency,cvij,min_ii,i+1) ) {
00700
00701
00702 if ( i != cvij_length - 1 ) {
00703 COST *ij_last = cvij_costs + (cvij_length - 1);
00704
00705 *cpij = *ij_last;
00706 }
00707
00708
00709 --cvij_length;
00710 }
00711 }
00712
00713 COST_VEC_length(cvij) = cvij_length;
00714 }
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728 static void
00729 Maximize_Min_II(
00730 CG_LOOP_SCC *scc,
00731 COST_VEC *cv1,
00732 COST_VEC *cv2
00733 )
00734 {
00735 INT i, j;
00736 COST *cp1 = COST_VEC_costs(cv1);
00737 COST *cp2 = COST_VEC_costs(cv2);
00738 INT len1 = COST_VEC_length(cv1);
00739 INT len2 = COST_VEC_length(cv2);
00740 INT mii = CG_LOOP_min_ii;
00741 INT scc_mii = CG_LOOP_SCC_rec_mii(scc);
00742
00743 for ( i = 0; i < len1; ++i ) {
00744 INT omega1 = COST_omega(cp1 + i);
00745 INT latency1 = COST_latency(cp1 + i);
00746
00747 for ( j = 0; j < len2; ++j) {
00748 INT omega2 = COST_omega(cp2 + j);
00749 INT latency2 = COST_latency(cp2 + j);
00750 INT path_mii = Ceiling_Divide(latency1+latency2, omega1+omega2);
00751 scc_mii = Max(scc_mii, path_mii);
00752 mii = Max(mii, path_mii);
00753 }
00754 }
00755
00756 CG_LOOP_min_ii = mii;
00757 #ifdef TARG_IA64
00758 CG_LOOP_rec_min_ii = Max(CG_LOOP_rec_min_ii, scc_mii);
00759 #else
00760 CG_LOOP_rec_min_ii = scc_mii;
00761 #endif
00762 Set_CG_LOOP_SCC_rec_mii(scc,scc_mii);
00763 }
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776 static void
00777 Calculate_Component_Max_Costs_And_Min_Recurrence_II(
00778 CG_LOOP_SCC *scc
00779 )
00780 {
00781 INT i, j, k;
00782 COST_TABLE *costs;
00783 INT n = CG_LOOP_SCC_member_count(scc);
00784
00785 MEM_POOL_Push(&MEM_local_nz_pool);
00786
00787
00788
00789
00790
00791
00792 costs = COST_TABLE_Alloc(n);
00793
00794 Calculate_Component_Direct_Costs_And_Min_Recurrence_II(scc,costs);
00795
00796
00797 for ( k = 0 ; k < n; ++k ) {
00798 for ( i = 0; i < n; ++i ) {
00799 for ( j = 0; j < n; ++j ) {
00800 INT32 min_ii;
00801
00802
00803
00804
00805
00806 if (i == j && j == k) continue;
00807
00808 #if 0
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819 min_ii = LS_enable_fix_recurrences ?
00820 Max(LS_res_min_ii, CG_LOOP_SCC_rec_mii(scc)) : LS_min_ii;
00821 #else
00822 min_ii = CG_LOOP_min_ii;
00823 #endif
00824
00825
00826
00827
00828
00829
00830 Add_Maximal_Costs(COST_TABLE_cost_vec(costs,i,j),
00831 COST_TABLE_cost_vec(costs,i,k),
00832 COST_TABLE_cost_vec(costs,k,j),
00833 min_ii);
00834
00835
00836
00837
00838
00839 Maximize_Min_II(scc,
00840 COST_TABLE_cost_vec(costs,i,j),
00841 COST_TABLE_cost_vec(costs,j,i));
00842 }
00843 }
00844 }
00845
00846
00847
00848
00849 for ( i = 0; i < n; ++i ) {
00850 OP *iop = CG_LOOP_SCC_member(scc,i);
00851
00852 for ( j = 0; j < n; ++j ) {
00853 OP *jop = CG_LOOP_SCC_member(scc,j);
00854 COST_VEC *cv = COST_TABLE_cost_vec(costs,i,j);
00855 INT cv_length = COST_VEC_length(cv);
00856
00857 for ( k = 0; k < cv_length; ++k ) {
00858 CG_LOOP_Add_SCC_Arc(iop,jop,COST_VEC_omega(cv,k),
00859 COST_VEC_latency(cv,k));
00860 }
00861 }
00862 }
00863
00864 MEM_POOL_Pop(&MEM_local_nz_pool);
00865 }
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878 static void
00879 Calculate_Self_Recurrence_Min_II(
00880 CG_LOOP_SCC* scc,
00881 BOOL ignore_non_def_mem_deps
00882 )
00883 {
00884 ARC_LIST *succs;
00885 OP *self = CG_LOOP_SCC_member(scc,0);
00886
00887
00888
00889
00890 if ( OP_loh(self) )
00891 return;
00892
00893 for ( succs = OP_succs(CG_LOOP_SCC_member(scc,0));
00894 succs != NULL;
00895 succs = ARC_LIST_rest(succs)
00896 ) {
00897 ARC *succ_arc = ARC_LIST_first(succs);
00898
00899 if ( ARC_succ(succ_arc) == ARC_pred(succ_arc) &&
00900 (!ignore_non_def_mem_deps || !ARC_is_mem(succ_arc) ||
00901 ARC_is_definite(succ_arc))
00902 ) {
00903
00904 Is_True(((INT) ARC_omega(succ_arc)) > 0,
00905 ("Unexpected non-positive omega in self recurrence."));
00906
00907 Set_CG_LOOP_SCC_rec_mii(scc,Max(CG_LOOP_SCC_rec_mii(scc),
00908 Ceiling_Divide(CGTARG_ARC_Sched_Latency(succ_arc),
00909 ARC_omega(succ_arc))));
00910 CG_LOOP_rec_min_ii = Max(CG_LOOP_rec_min_ii, CG_LOOP_SCC_rec_mii(scc));
00911 CG_LOOP_min_ii = Max(CG_LOOP_min_ii, CG_LOOP_SCC_rec_mii(scc));
00912 }
00913 }
00914 }
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924 void
00925 CG_LOOP_Calculate_Min_Recurrence_II(BB *loop_body, BOOL ignore_non_def_mem_deps)
00926 {
00927 CG_LOOP_SCC *scc;
00928 CG_LOOP_SCC *scc_fp;
00929
00930
00931
00932
00933
00934
00935 for ( scc = CG_LOOP_SCC_Vec, scc_fp = scc + CG_LOOP_SCC_Count;
00936 scc < scc_fp;
00937 ++scc
00938 ) {
00939
00940 Trace_Begin_Min_II_Scc(loop_body,scc);
00941
00942 Set_CG_LOOP_SCC_rec_mii(scc,0);
00943
00944 if ( CG_LOOP_SCC_member_count(scc) > 1 )
00945 Calculate_Component_Max_Costs_And_Min_Recurrence_II(scc);
00946 else
00947 Calculate_Self_Recurrence_Min_II(scc, ignore_non_def_mem_deps);
00948
00949 Trace_End_Min_II_Scc();
00950 }
00951 }
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961 void
00962 CG_LOOP_Calculate_Min_Resource_II(
00963 BB *loop_body,
00964 OP_LIST *loop_overhead,
00965 BOOL ignore_prefetches,
00966 BOOL ignore_prefetch_strides
00967 )
00968 {
00969 INT32 special_min_ii;
00970
00971 Trace_Begin_Min_II(loop_body);
00972
00973 MEM_POOL_Push(&MEM_local_nz_pool);
00974
00975 Calculate_Min_Resource_II(loop_body, loop_overhead,
00976 ignore_prefetches, ignore_prefetch_strides);
00977
00978 special_min_ii = CGTARG_Special_Min_II(loop_body, trace_mii);
00979 CG_LOOP_min_ii = MAX(CG_LOOP_min_ii, special_min_ii);
00980
00981 CG_LOOP_res_min_ii = CG_LOOP_min_ii;
00982
00983 MEM_POOL_Pop(&MEM_local_nz_pool);
00984
00985 Trace_End_Min_II();
00986 }
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996 void
00997 CG_LOOP_Calculate_Max_Costs_And_Min_II(
00998 BB *loop_body,
00999 OP_LIST *loop_overhead,
01000 BOOL ignore_prefetches,
01001 BOOL ignore_prefetch_strides,
01002 BOOL ignore_non_def_mem_deps
01003 )
01004 {
01005 INT32 special_min_ii;
01006
01007 Trace_Begin_Min_II(loop_body);
01008
01009 MEM_POOL_Push(&MEM_local_nz_pool);
01010
01011 Calculate_Min_Resource_II(loop_body, loop_overhead,
01012 ignore_prefetches, ignore_prefetch_strides);
01013 special_min_ii = CGTARG_Special_Min_II(loop_body, trace_mii);
01014 CG_LOOP_min_ii = MAX(CG_LOOP_min_ii, special_min_ii);
01015
01016 CG_LOOP_res_min_ii = CG_LOOP_min_ii;
01017 CG_LOOP_Calculate_Min_Recurrence_II(loop_body, ignore_non_def_mem_deps);
01018
01019 MEM_POOL_Pop(&MEM_local_nz_pool);
01020
01021 Trace_End_Min_II();
01022 }