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
00060
00061
00062
00063
00064 #ifndef fb_info_INCLUDED
00065 #define fb_info_INCLUDED
00066
00067 #include "fb_freq.h"
00068 #include "fb_tnv.h"
00069
00070 #ifdef _INCLUDED_FROM_LIBINSTR_
00071 #include "vector.h"
00072
00073 using Instr::vector;
00074 #else
00075 #include <vector>
00076 #endif
00077
00078 #ifdef MONGOOSE_BE
00079
00080 #ifndef mempool_allocator_INCLUDED
00081 #include "mempool_allocator.h"
00082 #endif
00083
00084 #ifndef wn_INCLUDED
00085 #include "wn.h"
00086 #endif
00087
00088 #endif // MONGOOSE_BE
00089
00090 #define FB_TNV_FLAG_UNINIT -1
00091
00092
00093
00094 #if defined(TARG_SL)
00095 typedef INT32 FB_NUM_TYPE;
00096 #else
00097 typedef INT64 FB_NUM_TYPE;
00098 #endif
00099
00100 struct FB_Info_Invoke {
00101
00102 FB_FREQ freq_invoke;
00103
00104 FB_Info_Invoke( FB_FREQ invoke)
00105 : freq_invoke( invoke ) {}
00106
00107 FB_Info_Invoke() :
00108 freq_invoke( FB_FREQ_UNINIT ) {}
00109
00110 FB_FREQ& Get_Freq_Invoke() { return freq_invoke; };
00111
00112 void Print( FILE *fp ) const {
00113 fprintf( fp, "FB---> invoke = " );
00114 freq_invoke.Print( fp );
00115 }
00116
00117 void Print_simple (FILE *fp) const {
00118 fprintf( fp, "FB---> invoke = " );
00119 freq_invoke.Print_simple( fp );
00120 }
00121 };
00122
00123 #ifdef KEY
00124
00125 #define TNV 10
00126 struct FB_Info_Value {
00127 FB_NUM_TYPE num_values;
00128
00129 FB_FREQ exe_counter;
00130
00131 FB_NUM_TYPE value[TNV];
00132
00133 FB_FREQ freq[TNV];
00134
00135 FB_FREQ& Get_Exe_Counter(){ return exe_counter;}
00136 FB_FREQ* Get_Freq(){return freq;}
00137
00138 FB_Info_Value() : num_values(0), exe_counter(0) {}
00139
00140 FB_Info_Value( const FB_NUM_TYPE num, const FB_NUM_TYPE e, const FB_NUM_TYPE* v, const FB_NUM_TYPE* f ) {
00141
00142 num_values = MIN( TNV, num );
00143 exe_counter = e;
00144
00145 for( int i = 0; i < num_values; i++ ){
00146 value[i] = v[i];
00147 freq[i] = f[i];
00148 Is_True( exe_counter >= freq[i], ("Execution counter overflows.") );
00149 }
00150 }
00151
00152 FB_FREQ Total() const { return exe_counter; }
00153
00154 void Print( FILE* fp ) const {
00155 fprintf( fp, "execution counter: %d\n", (int)exe_counter.Value() );
00156 for( int i = 0; i < num_values; i++ ){
00157 fprintf( fp, "value %lld\t freq %f\n", value[i], freq[i].Value() );
00158 }
00159 }
00160 };
00161
00162 struct FB_Info_Value_FP_Bin {
00163 FB_FREQ exe_counter;
00164 FB_FREQ zopnd0;
00165 FB_FREQ zopnd1;
00166 FB_FREQ uopnd0;
00167 FB_FREQ uopnd1;
00168
00169 FB_Info_Value_FP_Bin() : exe_counter(0), zopnd0(0), zopnd1(0),
00170 uopnd0(0), uopnd1(0) {}
00171
00172 FB_Info_Value_FP_Bin( const FB_NUM_TYPE e, const FB_NUM_TYPE z0, const FB_NUM_TYPE z1,
00173 const FB_NUM_TYPE u0, const FB_NUM_TYPE u1 ) {
00174 exe_counter = e;
00175 zopnd0 = z0;
00176 zopnd1 = z1;
00177 uopnd0 = u0;
00178 uopnd1 = u1;
00179 }
00180
00181 FB_FREQ Total() const { return exe_counter; }
00182
00183 void Print( FILE* fp ) const {
00184 fprintf( fp, "execution counter: %d\n", (int)exe_counter.Value() );
00185 fprintf( fp, "operand 0 zero counter: %d\n", (int)zopnd0.Value() );
00186 fprintf( fp, "operand 1 zero counter: %d\n", (int)zopnd1.Value() );
00187 fprintf( fp, "operand 0 one counter: %d\n", (int)uopnd0.Value() );
00188 fprintf( fp, "operand 1 one counter: %d\n", (int)uopnd1.Value() );
00189 }
00190 };
00191 #endif
00192
00193 struct FB_Info_Branch {
00194
00195 FB_FREQ freq_taken;
00196
00197 FB_FREQ freq_not_taken;
00198
00199
00200 FB_FREQ& Get_Freq_Taken(){ return freq_taken;}
00201 FB_FREQ& Get_Freq_Not_Taken(){ return freq_not_taken;}
00202
00203 FB_Info_Branch( FB_FREQ taken, FB_FREQ not_taken )
00204 : freq_taken( taken ),
00205 freq_not_taken( not_taken ) {}
00206
00207 #ifdef MONGOOSE_BE
00208 FB_Info_Branch( FB_FREQ taken, FB_FREQ not_taken, OPERATOR opr )
00209 : freq_taken( opr != OPR_FALSEBR ? taken : not_taken ),
00210 freq_not_taken( opr != OPR_FALSEBR ? not_taken : taken ) {
00211
00212 Is_True( opr == OPR_TRUEBR || opr == OPR_FALSEBR
00213 || opr == OPR_IF || opr == OPR_CSELECT,
00214 ( "FB_Info_Branch found unexpected operator" ) );
00215 }
00216 #endif // MONGOOSE_BE
00217
00218 FB_Info_Branch()
00219 : freq_taken( FB_FREQ_UNINIT ),
00220 freq_not_taken( FB_FREQ_UNINIT ) {}
00221
00222 void Print( FILE *fp ) const {
00223 fprintf( fp, "FB---> taken = " );
00224 freq_taken.Print( fp );
00225 fprintf( fp, ", not_taken = " );
00226 freq_not_taken.Print( fp );
00227 }
00228
00229 void Print_simple( FILE *fp ) const {
00230 fprintf( fp, "FB---> taken = " );
00231 freq_taken.Print_simple( fp );
00232 fprintf( fp, ", not_taken = " );
00233 freq_not_taken.Print_simple( fp );
00234 }
00235 FB_FREQ Total() const {
00236 return ( freq_taken + freq_not_taken );
00237 }
00238 };
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 struct FB_Info_Loop {
00262
00263 FB_FREQ freq_zero;
00264 FB_FREQ freq_positive;
00265 FB_FREQ freq_out;
00266 FB_FREQ freq_back;
00267 FB_FREQ freq_exit;
00268 FB_FREQ freq_iterate;
00269
00270 #if defined (TARG_SL)
00271 FB_FREQ& Get_Freq_Zero() {return freq_zero;}
00272 FB_FREQ& Get_Freq_Positive() {return freq_positive;}
00273 FB_FREQ& Get_Freq_Out() {return freq_out;}
00274 FB_FREQ& Get_Freq_Back() {return freq_back;}
00275 FB_FREQ& Get_Freq_Exit() {return freq_exit;}
00276 FB_FREQ& Get_Freq_Iterate() {return freq_iterate;}
00277 #endif
00278
00279 FB_Info_Loop( FB_FREQ zero, FB_FREQ positive, FB_FREQ out, FB_FREQ back,
00280 FB_FREQ exit, FB_FREQ iterate )
00281 : freq_zero( zero ),
00282 freq_positive( positive ),
00283 freq_out( out ),
00284 freq_back( back ),
00285 freq_exit( exit ),
00286 freq_iterate( iterate ) {}
00287
00288 FB_Info_Loop( FB_FREQ zero, FB_FREQ positive, FB_FREQ out, FB_FREQ back )
00289 : freq_zero( zero ),
00290 freq_positive( positive ),
00291 freq_out( out ),
00292 freq_back( back ),
00293 freq_exit( zero + out ),
00294 freq_iterate( positive + back ) {}
00295
00296 FB_Info_Loop( FB_FREQ exit, FB_FREQ iterate )
00297 : freq_zero( FB_FREQ_UNKNOWN ),
00298 freq_positive( FB_FREQ_UNKNOWN ),
00299 freq_out( FB_FREQ_UNKNOWN ),
00300 freq_back( FB_FREQ_UNKNOWN ),
00301 freq_exit( exit ),
00302 freq_iterate( iterate ) {}
00303
00304 FB_Info_Loop()
00305 : freq_zero( FB_FREQ_UNINIT ),
00306 freq_positive( FB_FREQ_UNINIT ),
00307 freq_out( FB_FREQ_UNINIT ),
00308 freq_back( FB_FREQ_UNINIT ),
00309 freq_exit( FB_FREQ_UNINIT ),
00310 freq_iterate( FB_FREQ_UNINIT ) {}
00311
00312
00313 void Print( FILE *fp ) const {
00314 fprintf( fp, "FB---> zero = " );
00315 freq_zero.Print( fp );
00316 fprintf( fp, ", positive = " );
00317 freq_positive.Print( fp );
00318 fprintf( fp, ", out = " );
00319 freq_out.Print( fp );
00320 fprintf( fp, ", back = " );
00321 freq_back.Print( fp );
00322 fprintf( fp, "\n exit = " );
00323 freq_exit.Print( fp );
00324 fprintf( fp, ", iterate = " );
00325 freq_iterate.Print( fp );
00326 }
00327
00328 void Print_simple( FILE *fp ) const {
00329 fprintf( fp, "FB---> zero = " );
00330 freq_zero.Print_simple( fp );
00331 fprintf( fp, ", positive = " );
00332 freq_positive.Print_simple( fp );
00333 fprintf( fp, ", out = " );
00334 freq_out.Print( fp );
00335 fprintf( fp, ", back = " );
00336 freq_back.Print_simple( fp );
00337 fprintf( fp, "\n exit = " );
00338 freq_exit.Print_simple( fp );
00339 fprintf( fp, ", iterate = " );
00340 freq_iterate.Print_simple( fp );
00341 }
00342
00343 #if !( defined(TARG_SL) && defined(__SL__) )
00344 FB_FREQ Total() const {
00345 return ( freq_exit + freq_iterate );
00346 }
00347
00348 float Loop_lower_scale() const {
00349 FB_FREQ freq_scale = ( freq_zero + freq_positive ) / Total();
00350 if ( freq_scale.Known() )
00351 return freq_scale.Value();
00352 else
00353 return 0.1;
00354 }
00355
00356 #endif
00357 };
00358
00359 struct FB_Info_Circuit {
00360
00361 FB_FREQ freq_left;
00362 FB_FREQ freq_right;
00363 FB_FREQ freq_neither;
00364
00365 #if defined(TARG_SL)
00366 FB_FREQ& Get_Freq_Left(){return freq_left;}
00367 FB_FREQ& Get_Freq_Right(){return freq_right;}
00368 FB_FREQ& Get_Freq_Neither(){return freq_neither;}
00369 #endif
00370
00371 FB_Info_Circuit( FB_FREQ left, FB_FREQ right, FB_FREQ neither )
00372 : freq_left( left ),
00373 freq_right( right ),
00374 freq_neither( neither ) {}
00375
00376 FB_Info_Circuit()
00377 : freq_left( FB_FREQ_UNINIT ),
00378 freq_right( FB_FREQ_UNINIT ),
00379 freq_neither( FB_FREQ_UNINIT ) {}
00380
00381 void Print( FILE *fp ) const {
00382 fprintf( fp, "FB---> left = " );
00383 freq_left.Print( fp );
00384 fprintf( fp, ", right = " );
00385 freq_right.Print( fp );
00386 fprintf( fp, ", neither = " );
00387 freq_neither.Print( fp );
00388 }
00389
00390 void Print_simple( FILE *fp ) const {
00391 fprintf( fp, "FB---> left = " );
00392 freq_left.Print_simple( fp );
00393 fprintf( fp, ", right = " );
00394 freq_right.Print_simple( fp );
00395 fprintf( fp, ", neither = " );
00396 freq_neither.Print_simple( fp );
00397 }
00398
00399 FB_FREQ Total() const {
00400 return ( freq_left + freq_right + freq_neither );
00401 }
00402 };
00403
00404
00405 struct FB_Info_Call {
00406 FB_FREQ freq_entry;
00407 FB_FREQ freq_exit;
00408 BOOL in_out_same;
00409 BOOL dummy_buffer;
00410
00411
00412 #if defined(TARG_SL)
00413 FB_FREQ& Get_Freq_Entry(){return freq_entry;}
00414 FB_FREQ& Get_Freq_Exit(){return freq_exit;}
00415 #endif
00416
00417 FB_Info_Call( FB_FREQ entry, FB_FREQ exit, BOOL same = FALSE )
00418 : freq_entry( entry ),
00419 freq_exit( exit ),
00420 in_out_same( same ) {
00421 Is_True( freq_entry == freq_exit || ! in_out_same,
00422 ( "FEEDBACK::Annot_call: in_out_same failure" ) );
00423 }
00424
00425 FB_Info_Call( FB_FREQ entry_and_exit )
00426 : freq_entry( entry_and_exit ),
00427 freq_exit( entry_and_exit ),
00428 in_out_same( TRUE ) {}
00429
00430
00431 FB_Info_Call() :
00432 freq_entry(FB_FREQ_UNINIT),
00433 freq_exit(FB_FREQ_UNINIT),
00434 in_out_same(FALSE) {}
00435
00436 void Print( FILE *fp ) const {
00437 fprintf( fp, "FB---> entry = " );
00438 freq_entry.Print( fp );
00439 fprintf( fp, ", exit = " );
00440 freq_exit.Print( fp );
00441 fprintf( fp, ", in_out_same = %c", in_out_same ? 'Y' : 'N' );
00442 }
00443
00444 void Print_simple( FILE *fp ) const {
00445 fprintf( fp, "FB---> entry = " );
00446 freq_entry.Print_simple( fp );
00447 fprintf( fp, ", exit = " );
00448 freq_exit.Print_simple( fp );
00449 fprintf( fp, ", in_out_same = %c", in_out_same ? 'Y' : 'N' );
00450 }
00451
00452 };
00453
00454 struct FB_Info_Icall{
00455 FB_TNV tnv;
00456 FB_Info_Icall()
00457 {
00458 tnv._flag = FB_TNV_FLAG_UNINIT;
00459 }
00460 BOOL Is_uninit() const
00461 {
00462 return (tnv._flag == FB_TNV_FLAG_UNINIT);
00463 }
00464 void Print( FILE *fp) const {
00465 fprintf(fp, "FB--->Icall = ");
00466 tnv.Print( fp );
00467 }
00468 };
00469
00470 struct FB_Info_Switch {
00471
00472 vector<FB_FREQ> freq_targets;
00473
00474 FB_Info_Switch() {}
00475
00476 FB_Info_Switch( const vector<FB_FREQ>::size_type n )
00477 : freq_targets( vector<FB_FREQ>( n, FB_FREQ_UNINIT ) ) {}
00478
00479 FB_FREQ& operator[] ( const vector<FB_FREQ>::size_type n ) {
00480 if ( n >= freq_targets.size() ) {
00481
00482 vector<FB_FREQ>::size_type size = freq_targets.size();
00483 for (int i = 0; i < n - size + 1; i++)
00484 freq_targets.push_back (FB_FREQ_UNINIT);
00485 }
00486 return freq_targets[n];
00487 }
00488
00489 const FB_FREQ& operator[] ( const vector<FB_FREQ>::size_type n ) const {
00490 return ( n >= freq_targets.size() ? FB_FREQ_UNINIT : freq_targets[n] );
00491 }
00492
00493 vector<FB_FREQ>::size_type size() const {
00494 return freq_targets.size();
00495 }
00496
00497 vector<FB_FREQ>::const_reference back() const {
00498 return freq_targets.back();
00499 }
00500
00501 void pop_back() {
00502 freq_targets.pop_back();
00503 }
00504
00505 void Print( FILE *fp ) const {
00506 fprintf( fp, "FB---> targets = %d", (INT) freq_targets.size() );
00507 for ( INT t = 0; t < freq_targets.size(); t++ ) {
00508 fprintf( fp, ", %d: ", t );
00509 freq_targets[t].Print( fp );
00510 }
00511 }
00512
00513 void Print_simple( FILE *fp ) const {
00514 fprintf( fp, "FB---> targets = %d", (INT) freq_targets.size() );
00515 for ( INT t = 0; t < freq_targets.size(); t++ ) {
00516 fprintf( fp, ", %d: ", t );
00517 freq_targets[t].Print_simple( fp );
00518 }
00519 }
00520
00521 FB_FREQ Total() const {
00522 vector<FB_FREQ>::const_iterator iter;
00523 FB_FREQ freq = FB_FREQ_ZERO;
00524 for ( iter = freq_targets.begin(); iter != freq_targets.end(); iter++ ) {
00525 freq += *iter;
00526 }
00527 return freq;
00528 }
00529 };
00530
00531 struct FB_Info_Edge {
00532
00533 FB_FREQ freq_edge;
00534
00535 FB_Info_Edge( FB_FREQ freq)
00536 : freq_edge( freq ) {}
00537
00538 FB_Info_Edge() :
00539 freq_edge( FB_FREQ_UNINIT ) {}
00540
00541 void Print( FILE *fp ) const {
00542 fprintf( fp, "FB---> Edge = " );
00543 freq_edge.Print( fp );
00544 }
00545 };
00546
00547 #ifndef KEY
00548 struct FB_Info_Value {
00549 FB_TNV tnv;
00550 void Print( FILE *fp) const {
00551 fprintf(fp, "FB--->Value = ");
00552 tnv.Print( fp );
00553 }
00554 };
00555 #endif
00556
00557 struct FB_Info_Stride{
00558 FB_TNV tnv;
00559 void Print( FILE *fp) const {
00560 fprintf(fp, "FB--->Stride = ");
00561 tnv.Print( fp );
00562 }
00563 };
00564
00565
00566 template <class T>
00567 void
00568 FB_Info_Print (const T& info, const char* name, FILE *fp)
00569 {
00570 size_t size = info.size ();
00571
00572 if (size != 0)
00573 fprintf (fp, "%s Profile:\n", name);
00574 for (size_t i = 0; i < size; i++) {
00575 fprintf(fp, "\t%s id = %ld\t", name, i);
00576 info[i].Print (fp);
00577 fputc ('\n', fp);
00578 }
00579 }
00580
00581
00582
00583
00584 #ifdef MONGOOSE_BE
00585
00586 typedef vector<FB_Info_Invoke, mempool_allocator<FB_Info_Invoke> >
00587 FB_Invoke_Vector;
00588 typedef vector<FB_Info_Branch, mempool_allocator<FB_Info_Branch> >
00589 FB_Branch_Vector;
00590 typedef vector<FB_Info_Loop, mempool_allocator<FB_Info_Loop> >
00591 FB_Loop_Vector;
00592 typedef vector<FB_Info_Circuit, mempool_allocator<FB_Info_Circuit> >
00593 FB_Circuit_Vector;
00594 typedef vector<FB_Info_Call, mempool_allocator<FB_Info_Call> >
00595 FB_Call_Vector;
00596 typedef vector<FB_Info_Icall, mempool_allocator<FB_Info_Icall> >
00597 FB_Icall_Vector;
00598 typedef vector<FB_Info_Switch, mempool_allocator<FB_Info_Switch> >
00599 FB_Switch_Vector;
00600 typedef vector<FB_Info_Edge, mempool_allocator<FB_Info_Edge> >
00601 FB_Edge_Vector;
00602 typedef vector<FB_Info_Value, mempool_allocator<FB_Info_Value> >
00603 FB_Value_Vector;
00604 #ifdef KEY
00605 typedef vector<FB_Info_Value_FP_Bin, mempool_allocator<FB_Info_Value_FP_Bin> >
00606 FB_Value_FP_Bin_Vector;
00607 #endif
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618 #define FB_IO_ESCAPE_EDGES_MAX 3
00619
00620 enum FB_EDGE_TYPE {
00621 FB_EDGE_UNINIT = 0,
00622 FB_EDGE_INCOMING = 1,
00623 FB_EDGE_OUTGOING = 2,
00624 FB_EDGE_ENTRY_OUTGOING = 3,
00625 FB_EDGE_BRANCH_TAKEN = 4,
00626 FB_EDGE_BRANCH_NOT_TAKEN = 5,
00627 FB_EDGE_LOOP_ZERO = 6,
00628 FB_EDGE_LOOP_POSITIVE = 7,
00629 FB_EDGE_LOOP_OUT = 8,
00630 FB_EDGE_LOOP_BACK = 9,
00631 FB_EDGE_LOOP_EXIT = 10,
00632 FB_EDGE_LOOP_ITERATE = 11,
00633 FB_EDGE_CIRCUIT_LEFT = 12,
00634 FB_EDGE_CIRCUIT_RIGHT = 13,
00635 FB_EDGE_CIRCUIT_NEITHER = 14,
00636 FB_EDGE_CALL_INCOMING = 15,
00637 FB_EDGE_CALL_OUTGOING = 16,
00638 FB_EDGE_CALL_INOUTSAME = 17,
00639 FB_EDGE_IO_OUTGOING = 18,
00640 FB_EDGE_IO_ESCAPE_BASE = 19,
00641 FB_EDGE_SWITCH_DEFAULT = 22,
00642 FB_EDGE_SWITCH_BASE = 23
00643 };
00644
00645
00646
00647
00648 #define FB_EDGE_IO_ESCAPE(br) ( FB_EDGE_TYPE( FB_EDGE_IO_ESCAPE_BASE + (br) ) )
00649
00650 #define FB_EDGE_SWITCH(br) ( FB_EDGE_TYPE( FB_EDGE_SWITCH_BASE + (br) ) )
00651 #define FB_EDGE_SWITCH_INDEX(typ) ( INT32( (typ) - FB_EDGE_SWITCH_BASE + 1 ) )
00652
00653 #define FB_EDGE_TYPE_NAME_LENGTH 20 // buffer length required for
00654
00655
00656 extern const char *FB_EDGE_NAMES[];
00657
00658 void FB_EDGE_TYPE_fprintf( FILE *fp, const FB_EDGE_TYPE fb_type );
00659 INT FB_EDGE_TYPE_sprintf( char *buffer, const FB_EDGE_TYPE fb_type );
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670 #define fb_opr_cases_invoke \
00671 case OPR_LABEL: \
00672 case OPR_GOTO: \
00673 case OPR_MSTORE: \
00674 case OPR_FUNC_ENTRY: \
00675 case OPR_ALTENTRY: \
00676 case OPR_RETURN: \
00677 case OPR_RETURN_VAL
00678
00679
00680 inline bool FB_valid_opr_invoke(const WN *wn) {
00681 OPERATOR opr = WN_operator( wn );
00682 switch ( opr ) {
00683 fb_opr_cases_invoke:
00684 return true;
00685 case OPR_PRAGMA:
00686 return ( WN_pragma( wn ) == WN_PRAGMA_PREAMBLE_END );
00687 default:
00688 return false;
00689 }
00690 }
00691
00692
00693
00694
00695
00696
00697
00698
00699 #define fb_opr_cases_branch \
00700 case OPR_TRUEBR: \
00701 case OPR_FALSEBR: \
00702 case OPR_IF: \
00703 case OPR_CSELECT
00704
00705 inline bool FB_valid_opr_branch(const WN *wn) {
00706 OPERATOR opr = WN_operator( wn );
00707 switch ( opr ) {
00708 fb_opr_cases_branch:
00709 return true;
00710 default:
00711 return false;
00712 }
00713 }
00714
00715
00716
00717
00718 #define fb_opr_cases_loop \
00719 case OPR_DO_LOOP: \
00720 case OPR_WHILE_DO: \
00721 case OPR_DO_WHILE
00722
00723 inline bool FB_valid_opr_loop(const WN *wn) {
00724 OPERATOR opr = WN_operator( wn );
00725 switch ( opr ) {
00726 fb_opr_cases_loop:
00727 return true;
00728 default:
00729 return false;
00730 }
00731 }
00732
00733 #ifdef KEY
00734
00735
00736 #define fb_opr_cases_value \
00737 case OPR_DIV: \
00738 case OPR_REM: \
00739 case OPR_MOD
00740 #define fb_opr_cases_value_fp_bin \
00741 case OPR_MPY
00742
00743 inline bool FB_valid_opr_value(const WN *wn) {
00744 OPERATOR opr = WN_operator( wn );
00745 switch ( opr ) {
00746 fb_opr_cases_value:
00747 return true;
00748 fb_opr_cases_value_fp_bin:
00749 return true;
00750 default:
00751 return false;
00752 }
00753 }
00754 #endif
00755
00756
00757
00758
00759
00760
00761
00762 #define fb_opr_cases_circuit \
00763 case OPR_CAND: \
00764 case OPR_CIOR
00765
00766 inline bool FB_valid_opr_circuit(const WN *wn) {
00767 OPERATOR opr = WN_operator( wn );
00768 switch ( opr ) {
00769 fb_opr_cases_circuit:
00770 return true;
00771 default:
00772 return false;
00773 }
00774 }
00775
00776
00777
00778
00779 #if defined(TARG_SL) && defined(TARG_SL2)
00780 #define fb_opr_cases_call \
00781 case OPR_PICCALL: \
00782 case OPR_CALL: \
00783 case OPR_ICALL: \
00784 case OPR_INTRINSIC_CALL: \
00785 case OPR_IO: \
00786 case OPR_REGION
00787 #else
00788 #define fb_opr_cases_call \
00789 case OPR_PICCALL: \
00790 case OPR_CALL: \
00791 case OPR_ICALL: \
00792 case OPR_INTRINSIC_CALL: \
00793 case OPR_IO
00794 #endif
00795
00796 inline bool FB_valid_opr_call(const WN *wn) {
00797 OPERATOR opr = WN_operator( wn );
00798 switch ( opr ) {
00799 fb_opr_cases_call:
00800 return true;
00801 default:
00802 return false;
00803 }
00804 }
00805
00806
00807
00808
00809
00810
00811
00812 #define fb_opr_cases_switch \
00813 case OPR_SWITCH: \
00814 case OPR_COMPGOTO: \
00815 case OPR_XGOTO
00816
00817 inline bool FB_valid_opr_switch (const WN *wn) {
00818 OPERATOR opr = WN_operator( wn );
00819 switch ( opr ) {
00820 fb_opr_cases_switch:
00821 return true;
00822 #if defined (TARG_SL) && defined(TARG_SL2)
00823 case OPR_SL2_FORK_MAJOR:
00824 case OPR_SL2_FORK_MINOR:
00825 return TRUE;
00826 #endif
00827 default:
00828 return false;
00829 }
00830 }
00831
00832 #endif // MONGOOSE_BE
00833
00834
00835 #endif