Open64 (mfef90, whirl2f, and IR tools)
TAG: version-openad; SVN changeset: 916
|
00001 /* 00002 00003 Copyright (C) 2000, 2001 Silicon Graphics, Inc. All Rights Reserved. 00004 00005 This program is free software; you can redistribute it and/or modify it 00006 under the terms of version 2 of the GNU General Public License as 00007 published by the Free Software Foundation. 00008 00009 This program is distributed in the hope that it would be useful, but 00010 WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00012 00013 Further, this software is distributed without any warranty that it is 00014 free of the rightful claim of any third person regarding infringement 00015 or the like. Any license provided herein, whether implied or 00016 otherwise, applies only to this software file. Patent licenses, if 00017 any, provided herein do not apply to combinations of this program with 00018 other software, or any other product whatsoever. 00019 00020 You should have received a copy of the GNU General Public License along 00021 with this program; if not, write the Free Software Foundation, Inc., 59 00022 Temple Place - Suite 330, Boston MA 02111-1307, USA. 00023 00024 Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky, 00025 Mountain View, CA 94043, or: 00026 00027 http://www.sgi.com 00028 00029 For further information regarding this notice, see: 00030 00031 http://oss.sgi.com/projects/GenInfo/NoticeExplan 00032 00033 */ 00034 00035 00036 /* ==================================================================== 00037 * ==================================================================== 00038 * 00039 * 00040 * Revision history: 00041 * 06-Feb-90 - Original Version 00042 * 01-Feb-91 - Copied for TP/Muse 00043 * 03-Feb-93 - Add enable flag to avoid system calls when not tracing. 00044 * 00045 * Description: 00046 * 00047 * This module provides phase/function timing for the Muse compiler. 00048 * It is based on the program-independent functionality provided by 00049 * resource.c (via resource.h). 00050 * 00051 * ==================================================================== 00052 * ==================================================================== 00053 */ 00054 00055 #include "defs.h" 00056 #include "resource.h" 00057 #include "timing.h" 00058 #include "tracing.h" 00059 #include "resource.h" 00060 00061 /* If this flag is FALSE, don't do anything: */ 00062 static BOOL Enabled = FALSE; 00063 00064 /* Array of timing accumulators: */ 00065 static RSTATE *timers[T_LAST+1]; 00066 #define Timer(i) timers[i] 00067 00068 /* Count of compilation units, so we can avoid doing a summary report 00069 * for a compilation consisting of a single unit: 00070 */ 00071 static INT CU_Count = 0; 00072 00073 /* ==================================================================== 00074 * 00075 * Reset_Timers 00076 * 00077 * Reset all of the timers for a new source file. 00078 * 00079 * ==================================================================== 00080 */ 00081 00082 void 00083 Reset_Timers (void) 00084 { 00085 INT i; 00086 00087 if ( Enabled ) { 00088 for ( i=0; i <= T_LAST; i++ ) Resource_Accum (Timer(i), RR_Clear); 00089 } 00090 } 00091 00092 /* ==================================================================== 00093 * 00094 * Initialize_Timing 00095 * 00096 * Initialize the timing structures used by the Muse compiler. In 00097 * particular, initialize the resource module (with its overall timer), 00098 * and allocate the timing accumulators used by the compiler. 00099 * 00100 * ==================================================================== 00101 */ 00102 00103 void 00104 Initialize_Timing ( BOOL enable ) 00105 { 00106 00107 if ( Enabled = enable ) { 00108 00109 /* Initialize the resource accounting module: */ 00110 Resource_Init (); 00111 00112 /* Allocate the timers: */ 00113 Timer ( T_BE_Comp ) = 00114 Resource_Alloc ( "Total Back End", NULL ); 00115 Timer ( T_BE_PU_Comp ) = 00116 Resource_Alloc ( "Back End on PU", NULL ); 00117 Timer ( T_BE_PU_CU ) = 00118 Resource_Alloc ( "Back End on PU", Timer(T_BE_PU_Comp) ); 00119 Timer ( T_ReadIR_Comp ) = 00120 Resource_Alloc ( " Reading IR", NULL ); 00121 Timer ( T_ReadIR_CU ) = 00122 Resource_Alloc ( " Reading IR", Timer(T_ReadIR_Comp) ); 00123 Timer ( T_Lower_Comp ) = 00124 Resource_Alloc ( " Lowering WHIRL", NULL ); 00125 Timer ( T_Lower_CU ) = 00126 Resource_Alloc ( " Lowering WHIRL", Timer(T_Lower_Comp) ); 00127 Timer ( T_ORI_Comp ) = 00128 Resource_Alloc ( " Olimit Region Insertion", NULL ); 00129 Timer ( T_ORI_CU ) = 00130 Resource_Alloc ( " Olimit Region Insertion", Timer(T_ORI_Comp) ); 00131 00132 Timer ( T_Preopt_Comp ) = 00133 Resource_Alloc ( "Pre-optimize", NULL ); 00134 Timer ( T_Preopt_CU ) = 00135 Resource_Alloc ( "Pre-optimize", Timer(T_Preopt_Comp) ); 00136 Timer ( T_Wopt_Comp ) = 00137 Resource_Alloc ( "Global optimize", NULL ); 00138 Timer ( T_Wopt_CU ) = 00139 Resource_Alloc ( "Global optimize", Timer(T_Wopt_Comp) ); 00140 Timer ( T_LNO_Comp ) = 00141 Resource_Alloc ( "Loop Nest Optimization", NULL ); 00142 Timer ( T_LNO_CU ) = 00143 Resource_Alloc ( "Loop Nest Optimization", Timer(T_LNO_Comp) ); 00144 00145 Timer ( T_W2C_Comp ) = 00146 Resource_Alloc ( "WHIRL To C", NULL ); 00147 Timer ( T_W2C_CU ) = 00148 Resource_Alloc ( "WHIRL To C", Timer(T_W2C_Comp) ); 00149 Timer ( T_W2F_Comp ) = 00150 Resource_Alloc ( "WHIRL To Fortran", NULL ); 00151 Timer ( T_W2F_CU ) = 00152 Resource_Alloc ( "WHIRL To Fortran", Timer(T_W2F_Comp) ); 00153 00154 Timer ( T_CodeGen_Comp ) = 00155 Resource_Alloc ( "Total Code Generator", NULL ); 00156 Timer ( T_CodeGen_CU ) = 00157 Resource_Alloc ( "Total Code Generator", Timer(T_CodeGen_Comp) ); 00158 00159 Timer ( T_GLRA_Comp ) = 00160 Resource_Alloc ( " Global Live Range Analysis", NULL ); 00161 Timer ( T_GLRA_CU ) = 00162 Resource_Alloc ( " Global Live Range Analysis", Timer(T_GLRA_Comp) ); 00163 Timer ( T_Localize_Comp ) = 00164 Resource_Alloc ( " Localize", NULL ); 00165 Timer ( T_Localize_CU ) = 00166 Resource_Alloc ( " Localize", Timer(T_Localize_Comp) ); 00167 Timer ( T_Expand_Comp ) = 00168 Resource_Alloc ( " Code Expansion", NULL ); 00169 Timer ( T_Expand_CU ) = 00170 Resource_Alloc ( " Code Expansion", Timer(T_Expand_Comp) ); 00171 Timer ( T_SWpipe_Comp ) = 00172 Resource_Alloc ( " Software pipelining", NULL ); 00173 Timer ( T_SWpipe_CU ) = 00174 Resource_Alloc ( " Software pipelining", Timer(T_SWpipe_Comp) ); 00175 Timer ( T_GCM_Comp ) = 00176 Resource_Alloc ( " Global Code Motion", NULL ); 00177 Timer ( T_GCM_CU ) = 00178 Resource_Alloc ( " Global Code Motion", Timer(T_GCM_Comp) ); 00179 Timer ( T_EBO_Comp ) = 00180 Resource_Alloc ( " Extended Block Optimization", NULL ); 00181 Timer ( T_EBO_CU ) = 00182 Resource_Alloc ( " Extended BLock Optimization", Timer(T_EBO_Comp) ); 00183 Timer ( T_CFLOW_Comp ) = 00184 Resource_Alloc ( " Control Flow Optimization", NULL ); 00185 Timer ( T_CFLOW_CU ) = 00186 Resource_Alloc ( " Control Flow Optimization", Timer(T_CFLOW_Comp) ); 00187 Timer ( T_Loop_Comp ) = 00188 Resource_Alloc ( " CG Loop", NULL ); 00189 Timer ( T_Loop_CU ) = 00190 Resource_Alloc ( " CG Loop", Timer(T_Loop_Comp) ); 00191 Timer ( T_Freq_Comp ) = 00192 Resource_Alloc ( " Compute Frequency", NULL ); 00193 Timer ( T_Freq_CU ) = 00194 Resource_Alloc ( " Compute Frequency", Timer(T_Freq_Comp) ); 00195 Timer ( T_HBF_Comp ) = 00196 Resource_Alloc ( " HyperBlock Formation", NULL ); 00197 Timer ( T_HBF_CU ) = 00198 Resource_Alloc ( " HyperBlock Formation", Timer(T_HBF_Comp) ); 00199 Timer ( T_Sched_Comp ) = 00200 Resource_Alloc ( " HyperBlock Scheduling", NULL ); 00201 Timer ( T_Sched_CU ) = 00202 Resource_Alloc ( " HyperBlock Scheduling", Timer(T_Sched_Comp) ); 00203 Timer ( T_THR_Comp ) = 00204 Resource_Alloc ( " Tree-Height Reduction", NULL ); 00205 Timer ( T_THR_CU ) = 00206 Resource_Alloc ( " Tree-Height Reduction", Timer(T_THR_Comp) ); 00207 Timer ( T_LRA_Comp ) = 00208 Resource_Alloc ( " Local Register Allocation", NULL ); 00209 Timer ( T_LRA_CU ) = 00210 Resource_Alloc ( " Local Register Allocation", Timer(T_LRA_Comp)); 00211 Timer ( T_GRA_Comp ) = 00212 Resource_Alloc ( " Global Register Allocation", NULL ); 00213 Timer ( T_GRA_CU ) = 00214 Resource_Alloc ( " Global Register Allocation", Timer(T_GRA_Comp)); 00215 Timer ( T_Emit_Comp ) = 00216 Resource_Alloc ( " Assembly Code Emission", NULL ); 00217 Timer ( T_Emit_CU ) = 00218 Resource_Alloc ( " Assembly Code Emission", Timer(T_Emit_Comp) ); 00219 Timer ( T_Region_Finalize_Comp ) = 00220 Resource_Alloc ( " Region Finalize", NULL ); 00221 Timer ( T_Region_Finalize_CU ) = 00222 Resource_Alloc ( " Region Finalize", Timer(T_Region_Finalize_Comp)); 00223 Timer ( T_CalcDom_Comp) = 00224 Resource_Alloc ( " Calculate_Dominators", NULL ); 00225 Timer ( T_CalcDom_CU) = 00226 Resource_Alloc ( " Calculate_Dominators", Timer(T_CalcDom_Comp)); 00227 00228 } 00229 } 00230 00231 /* ==================================================================== 00232 * 00233 * Clear_Timer / Start_Timer / Stop_Timer 00234 * 00235 * Clear, start, or stop a timing accumulator. 00236 * 00237 * ==================================================================== 00238 */ 00239 00240 #ifndef MONGOOSE_BE 00241 void 00242 Clear_Timer ( INT Timer_ID ) 00243 { 00244 if ( Enabled ) { 00245 Resource_Accum ( Timer(Timer_ID), RR_Clear ); 00246 } 00247 } 00248 #endif /* MONGOOSE_BE */ 00249 00250 void 00251 Start_Timer ( INT Timer_ID ) 00252 { 00253 if ( Enabled ) { 00254 Resource_Accum ( Timer(Timer_ID), RR_Start ); 00255 } 00256 } 00257 00258 void 00259 Stop_Timer ( INT Timer_ID ) 00260 { 00261 if ( Enabled ) { 00262 Resource_Accum ( Timer(Timer_ID), RR_Stop ); 00263 } 00264 } 00265 00266 double Get_User_Time(INT Timer_ID) 00267 { 00268 if (Enabled) { 00269 RSTATE *r; 00270 // Call Resource_Accum to update the RSTATE data structure 00271 Resource_Accum ( Timer(Timer_ID), RR_Stop ); 00272 Resource_Accum ( Timer(Timer_ID), RR_Start ); 00273 r = Timer(Timer_ID); 00274 TIME_INFO *utime = Get_Time ( r, RR_Delta_User ); 00275 return utime->secs + 0.000001 * utime->usecs; 00276 } 00277 return 0.0; 00278 } 00279 00280 /* ==================================================================== 00281 * 00282 * Add_Timer_To_Parent 00283 * 00284 * Add a timer's accumulated time to its parent and clear. 00285 * 00286 * ==================================================================== 00287 */ 00288 00289 static void 00290 Add_Timer_To_Parent ( INT Timer_ID ) 00291 { 00292 if ( Enabled ) { 00293 Resource_Accum ( Timer(Timer_ID), RR_End ); 00294 } 00295 } 00296 00297 00298 /* ==================================================================== 00299 * 00300 * Report_Delta_Time 00301 * 00302 * Report the delta times for a resource, in the format: 00303 * name nnn.nnnu nnn.nnns nnn.nne 00304 * 00305 * ==================================================================== 00306 */ 00307 00308 void 00309 Report_Delta_Time ( 00310 FILE *file, 00311 INT Timer_ID ) 00312 { 00313 char *name; 00314 TIME_INFO *utime, *stime, *etime; 00315 RSTATE *r = Timer(Timer_ID); 00316 INT mem; 00317 00318 if ( Enabled ) { 00319 name = Get_Timer_Name (r); 00320 utime = Get_Time ( r, RR_Delta_User ); 00321 stime = Get_Time ( r, RR_Delta_System ); 00322 etime = Get_Time ( r, RR_Delta_Elapsed ); 00323 mem = Get_Memory ( r, RR_Delta_Memory ); 00324 00325 #if (1) 00326 fprintf ( file, "%-32s %4d.%06du %4d.%06ds %4d.%06de", 00327 name, 00328 utime->secs, utime->usecs, 00329 stime->secs, stime->usecs, 00330 etime->secs, etime->usecs ); 00331 #else 00332 fprintf ( file, "%-32s %4d.%03du %4d.%03ds %4d.%02de", 00333 name, 00334 utime->secs, utime->usecs/1000, 00335 stime->secs, stime->usecs/1000, 00336 etime->secs, etime->usecs/10000 ); 00337 #endif 00338 if ( mem ) fprintf ( file, " %7dm", mem ); 00339 fprintf ( file, "\n" ); 00340 } 00341 } 00342 00343 void 00344 Report_CG_Region_Timing (FILE *file, char *name) 00345 { 00346 if ( ! Enabled ) return; 00347 if ( file == NULL || Get_Trace ( TKIND_INFO, TINFO_CTIME ) ) return; 00348 00349 fprintf ( file, "%s%s: CG Timing Report:\n\n", DBar, name); 00350 Report_Delta_Time ( file, T_CodeGen_CU ); 00351 Report_Delta_Time ( file, T_Expand_CU ); 00352 Report_Delta_Time ( file, T_Localize_CU ); 00353 Report_Delta_Time ( file, T_GLRA_CU ); 00354 Report_Delta_Time ( file, T_EBO_CU ); 00355 Report_Delta_Time ( file, T_CFLOW_CU ); 00356 Report_Delta_Time ( file, T_Loop_CU ); 00357 Report_Delta_Time ( file, T_CalcDom_CU ); 00358 Report_Delta_Time ( file, T_SWpipe_CU ); 00359 Report_Delta_Time ( file, T_Freq_CU ); 00360 Report_Delta_Time ( file, T_GRA_CU ); 00361 Report_Delta_Time ( file, T_LRA_CU ); 00362 Report_Delta_Time ( file, T_HBF_CU ); 00363 Report_Delta_Time ( file, T_Sched_CU ); 00364 Report_Delta_Time ( file, T_THR_CU ); 00365 Report_Delta_Time ( file, T_GCM_CU ); 00366 Report_Delta_Time ( file, T_Region_Finalize_CU ); 00367 fprintf ( file, "%s\n", DBar ); 00368 } 00369 00370 /* ==================================================================== 00371 * 00372 * Finish_BE_Timing 00373 * 00374 * Accumulate the compilation unit timers into their parent 00375 * accumulators and report the results if file is not NULL. 00376 * 00377 * ==================================================================== 00378 */ 00379 void 00380 Finish_BE_Timing ( 00381 FILE *file, 00382 char *name ) 00383 { 00384 if ( Enabled ) { 00385 /* Increment the compilation unit count: */ 00386 ++CU_Count; 00387 00388 /* Report if requested: */ 00389 if ( file != NULL && ! Get_Trace ( TKIND_INFO, TINFO_CTIME ) ) { 00390 fprintf ( file, 00391 "%s%s (#%d): Back End Timing Report:\n\n", 00392 DBar, name, CU_Count ); 00393 00394 Report_Delta_Time ( file, T_BE_PU_CU ); 00395 Report_Delta_Time ( file, T_ReadIR_CU ); 00396 Report_Delta_Time ( file, T_Lower_CU ); 00397 Report_Delta_Time ( file, T_ORI_CU ); 00398 00399 fprintf(file, "\n"); 00400 Report_Delta_Time ( file, T_Preopt_CU ); 00401 Report_Delta_Time ( file, T_LNO_CU ); 00402 Report_Delta_Time ( file, T_Wopt_CU ); 00403 Report_Delta_Time ( file, T_W2C_CU ); 00404 Report_Delta_Time ( file, T_W2F_CU ); 00405 00406 fprintf(file, "\n"); 00407 Report_Delta_Time ( file, T_CodeGen_CU ); 00408 Report_Delta_Time ( file, T_Expand_CU ); 00409 Report_Delta_Time ( file, T_Localize_CU ); 00410 Report_Delta_Time ( file, T_GLRA_CU ); 00411 Report_Delta_Time ( file, T_EBO_CU ); 00412 Report_Delta_Time ( file, T_CFLOW_CU ); 00413 Report_Delta_Time ( file, T_Loop_CU ); 00414 Report_Delta_Time ( file, T_CalcDom_CU); 00415 Report_Delta_Time ( file, T_SWpipe_CU ); 00416 Report_Delta_Time ( file, T_Freq_CU ); 00417 Report_Delta_Time ( file, T_GRA_CU ); 00418 Report_Delta_Time ( file, T_LRA_CU ); 00419 Report_Delta_Time ( file, T_HBF_CU ); 00420 Report_Delta_Time ( file, T_Sched_CU ); 00421 Report_Delta_Time ( file, T_THR_CU ); 00422 Report_Delta_Time ( file, T_GCM_CU ); 00423 Report_Delta_Time ( file, T_Emit_CU ); 00424 Report_Delta_Time ( file, T_Region_Finalize_CU ); 00425 fprintf ( file, "%s\n", DBar ); 00426 } 00427 00428 /* Add the per-CU times to the per-compilation times: */ 00429 Add_Timer_To_Parent ( T_BE_PU_CU ); 00430 Add_Timer_To_Parent ( T_ReadIR_CU ); 00431 Add_Timer_To_Parent ( T_Lower_CU ); 00432 Add_Timer_To_Parent ( T_ORI_CU ); 00433 00434 Add_Timer_To_Parent ( T_Preopt_CU ); 00435 Add_Timer_To_Parent ( T_LNO_CU ); 00436 Add_Timer_To_Parent ( T_Wopt_CU ); 00437 00438 Add_Timer_To_Parent ( T_W2C_CU ); 00439 Add_Timer_To_Parent ( T_W2F_CU ); 00440 00441 Add_Timer_To_Parent ( T_CodeGen_CU ); 00442 Add_Timer_To_Parent ( T_Expand_CU ); 00443 Add_Timer_To_Parent ( T_Localize_CU ); 00444 Add_Timer_To_Parent ( T_GLRA_CU ); 00445 Add_Timer_To_Parent ( T_EBO_CU ); 00446 Add_Timer_To_Parent ( T_CFLOW_CU ); 00447 Add_Timer_To_Parent ( T_Loop_CU ); 00448 Add_Timer_To_Parent ( T_CalcDom_CU ); 00449 Add_Timer_To_Parent ( T_SWpipe_CU ); 00450 Add_Timer_To_Parent ( T_Freq_CU ); 00451 Add_Timer_To_Parent ( T_GRA_CU ); 00452 Add_Timer_To_Parent ( T_LRA_CU ); 00453 Add_Timer_To_Parent ( T_HBF_CU ); 00454 Add_Timer_To_Parent ( T_Sched_CU ); 00455 Add_Timer_To_Parent ( T_THR_CU ); 00456 Add_Timer_To_Parent ( T_GCM_CU ); 00457 Add_Timer_To_Parent ( T_Emit_CU ); 00458 Add_Timer_To_Parent ( T_Region_Finalize_CU ); 00459 } 00460 } 00461 00462 /* ==================================================================== 00463 * 00464 * Finish_Compilation_Timing 00465 * 00466 * Report the compilation timings if file is not NULL. 00467 * 00468 * ==================================================================== 00469 */ 00470 00471 void 00472 Finish_Compilation_Timing ( 00473 FILE *file, 00474 char *source ) 00475 { 00476 if ( Enabled ) { 00477 /* Report if requested: */ 00478 if ( file != NULL ) { 00479 fprintf ( file, "%s\n%s: Compilation Timing Report\n", 00480 DBar, source ); 00481 00482 fprintf ( file, "\n" ); 00483 Report_Delta_Time ( file, T_BE_Comp ); 00484 fprintf ( file, "\n" ); 00485 Report_Delta_Time ( file, T_BE_PU_Comp ); 00486 Report_Delta_Time ( file, T_ReadIR_Comp ); 00487 Report_Delta_Time ( file, T_Lower_Comp ); 00488 Report_Delta_Time ( file, T_ORI_Comp ); 00489 00490 fprintf ( file, "\n" ); 00491 Report_Delta_Time ( file, T_Preopt_Comp ); 00492 Report_Delta_Time ( file, T_LNO_Comp ); 00493 Report_Delta_Time ( file, T_Wopt_Comp ); 00494 Report_Delta_Time ( file, T_W2C_Comp ); 00495 Report_Delta_Time ( file, T_W2F_Comp ); 00496 00497 fprintf ( file, "\n" ); 00498 Report_Delta_Time ( file, T_CodeGen_Comp ); 00499 Report_Delta_Time ( file, T_Expand_Comp ); 00500 Report_Delta_Time ( file, T_Localize_Comp ); 00501 Report_Delta_Time ( file, T_GLRA_Comp ); 00502 Report_Delta_Time ( file, T_EBO_Comp ); 00503 Report_Delta_Time ( file, T_CFLOW_Comp ); 00504 Report_Delta_Time ( file, T_Loop_Comp ); 00505 Report_Delta_Time ( file, T_CalcDom_Comp ); 00506 Report_Delta_Time ( file, T_SWpipe_Comp ); 00507 Report_Delta_Time ( file, T_Freq_Comp ); 00508 Report_Delta_Time ( file, T_GRA_Comp ); 00509 Report_Delta_Time ( file, T_LRA_Comp ); 00510 Report_Delta_Time ( file, T_HBF_Comp ); 00511 Report_Delta_Time ( file, T_Sched_Comp ); 00512 Report_Delta_Time ( file, T_THR_Comp ); 00513 Report_Delta_Time ( file, T_GCM_Comp ); 00514 Report_Delta_Time ( file, T_Emit_Comp ); 00515 Report_Delta_Time ( file, T_Region_Finalize_Comp ); 00516 fprintf ( file, "%s\n", DBar ); 00517 } 00518 } 00519 }