diff options
author | Gary Oblock <gary@amperecomputing.com> | 2020-09-30 20:52:13 -0700 |
---|---|---|
committer | Gary Oblock <gary@amperecomputing.com> | 2020-09-30 20:52:13 -0700 |
commit | 57144bf898341a43b28ab07957e001e88f647cee (patch) | |
tree | df4749ce84bbd086dd3de04c9aac408ccf3a820e | |
parent | b3d40163972ceb6d443d91a5054900ea5dfdfa5b (diff) |
Something to test to mcf for performance qualification.
-rw-r--r-- | gcc/ipa-str-reorg-instance-interleave.c | 489 | ||||
-rw-r--r-- | gcc/ipa-structure-reorg.h | 2 |
2 files changed, 127 insertions, 364 deletions
diff --git a/gcc/ipa-str-reorg-instance-interleave.c b/gcc/ipa-str-reorg-instance-interleave.c index 769e65a55ae..f171359b661 100644 --- a/gcc/ipa-str-reorg-instance-interleave.c +++ b/gcc/ipa-str-reorg-instance-interleave.c @@ -109,10 +109,10 @@ static basic_block make_bb ( char *, basic_block); */ // These are dummy values tha alway result the reorganization -#define SINGLE_POOL_RAW_SKIP_IT 0.0 -#define SINGLE_POOL_RAW_DO_IT_ALWAYS 0.0 -#define SINGLE_POOL_ABS_SKIP_IT 0.0 -#define SINGLE_POOL_ABS_DO_IT_ALWAYS 0.0 +#define SINGLE_POOL_RAW_SKIP_IT 0.10 +#define SINGLE_POOL_RAW_DO_IT_ALWAYS 0.90 +#define SINGLE_POOL_ABS_SKIP_IT 0.05 +#define SINGLE_POOL_ABS_DO_IT_ALWAYS 0.10 int str_reorg_instance_interleave_qual ( Info *info) @@ -2087,6 +2087,8 @@ reorg_perf_qual ( Info *info) // TBD This is where we need to remember // each germane access const char *s = optrans_to_str( optran); + // Commenting out these 3 debug commands causes a + // regression //DEBUG_A(", %s\n", s); if ( tri != NULL ) { @@ -2094,7 +2096,10 @@ reorg_perf_qual ( Info *info) //DEBUG_F(print_reorg, stderr, 0, tri); } else - //DEBUG("\n"); + { + //DEBUG("\n"); + ; + } switch ( optran) { case ReorgOpT_Indirect: @@ -2139,13 +2144,13 @@ reorg_perf_qual ( Info *info) } //DEBUG_L("Dumping acc_info:\n"); - //for ( auto aci = acc_info.begin (); aci != acc_info.end (); aci++ ) - // { - // DEBUG_A("variable:\n"); - // DEBUG_F( tell_me_about_ssa_name, (*aci).access, debug_indenting + 4); - // DEBUG_A("field: "); - // DEBUG_F( flexible_print, stderr, (*aci).field, 1, (dump_flags_t)0); - // } + for ( auto aci = acc_info.begin (); aci != acc_info.end (); aci++ ) + { + //DEBUG_A("variable:\n"); + //DEBUG_F( tell_me_about_ssa_name, (*aci).access, debug_indenting + 4); + //DEBUG_A("field: "); + //DEBUG_F( flexible_print, stderr, (*aci).field, 1, (dump_flags_t)0); + } //DEBUG_A("before sort: \n"); //DEBUG_F(print_acc_infos, stderr, acc_info ); @@ -2203,31 +2208,52 @@ reorg_perf_qual ( Info *info) print_var_infos ( stderr, var_info); + // + // Model the performance + // + DEBUG_A("Model The Performance\n"); + // Originally this was done per bb but now it has to be per // loop. TBD But perf_bb is per loop so we need something similar // per loop. -#if 1 for ( auto pvi = var_info.begin (); pvi != var_info.end (); pvi++ ) { // 676 //tree base_type = base_type_of( pvi->rep_access.access); ReorgType_t *ri = pvi->rep_access->reorg; + // Reorg accounting + DEBUG_L("\n"); + DEBUG_A("Reorg Accounting\n"); + if( ri != NULL ) { double reorg_nca = 0.0; + DEBUG_A(" for: "); + DEBUG_F( flexible_print, stderr, ri->gcc_type, 1, (dump_flags_t)0); + + INDENT(4); for ( auto fldi = pvi->fields.begin (); fldi != pvi->fields.end (); fldi++ ) { unsigned HOST_WIDE_INT fld_width = tree_to_uhwi ( DECL_SIZE ( *fldi)); - reorg_nca += loop_count * alignment_effect ( fld_width); + double effect = alignment_effect ( fld_width); + double product = loop_count * effect; + reorg_nca += product; + DEBUG_A("Add loop_count * effect (%d * %f = %f) to reorg_nca (now %f)\n", + loop_count, effect, product, reorg_nca); } + INDENT(-4); ri->instance_interleave.reorg_perf += reorg_nca; + DEBUG_A("Add reorg_nca (%f) to reorg_perf (now %e)\n", + reorg_nca, ri->instance_interleave.reorg_perf); } // 699 -// add regular accounting look 2229 2321 // regular accounting + DEBUG_L("\n"); + DEBUG_A("Regular Accounting\n"); + double regular_nca = 0.0; sbitmap cache_model = sbitmap_alloc(1); @@ -2267,6 +2293,8 @@ reorg_perf_qual ( Info *info) param_l1_cache_line_size) + 1; + DEBUG_L("\n"); + DEBUG_A("cache len = %d\n", len); // TBD Does this clear the bits??? It needs to. // Each bit represents a cache line. @@ -2284,8 +2312,14 @@ reorg_perf_qual ( Info *info) // why this is here and what it does. Sigh... unsigned HOST_WIDE_INT base_offset = tree_to_uhwi ( DECL_FIELD_OFFSET( field_ex)); - // Access accounting + DEBUG_L("\n"); + DEBUG_A("For field_ex: "); + DEBUG_F( flexible_print, stderr, field_ex, 0, (dump_flags_t)0); + DEBUG(", nrbo %d, base_offset %d\n", nrbo, base_offset); + // Access accounting + + INDENT(4); for ( auto fldi = pv2i->fields.begin (); fldi != pv2i->fields.end (); fldi++ ) { @@ -2293,17 +2327,27 @@ reorg_perf_qual ( Info *info) unsigned HOST_WIDE_INT fld_width, fld_offset; fld_width = tree_to_uhwi ( DECL_SIZE ( field)); fld_offset = tree_to_uhwi ( DECL_FIELD_OFFSET ( field)); + DEBUG_A("Field: "); + DEBUG_F( flexible_print, stderr, field, 0, (dump_flags_t)0); + DEBUG(", width = %d, offset = %d\n", fld_width, fld_offset); int chari; + INDENT(4); for ( chari = 0; chari < fld_width; chari++ ) { int loc = (chari + fld_offset + base_offset) / param_l1_cache_line_size; + DEBUG_A("loc: %d\n", loc); bitmap_set_bit ( cache_model, loc); } + INDENT(-4); } - - accum += bitmap_count_bits ( cache_model); + INDENT(-4); + unsigned bcount = bitmap_count_bits ( cache_model); + accum += bcount; + DEBUG_L("\n"); + DEBUG_A("Add popcount of cache (%d) to accum (now %f)\n", + bcount, accum); bitmap_clear ( cache_model); } } @@ -2311,337 +2355,38 @@ reorg_perf_qual ( Info *info) { nrbo = 1; accum++; + DEBUG_L("\n"); + DEBUG_A("nrbo = 1, increment accum to %f\n", accum); } + #if 1 + double amount = accum / nrbo; + double product = amount * loop_count; + regular_nca += product; + DEBUG_L("\n"); + DEBUG_A("Add loop_count*accum/nrbo (%f*%f/%d = %f) to regular_nca (now %e)\n", + loop_count, accum, nrbo, product, regular_nca); + #else double amount = accum / nrbo; regular_nca += amount; + DEBUG_L("\n"); + DEBUG_A("Add accum/nrbo (%f/%d = %f) to regular_nca (now %e)\n", + accum, nrbo, amount, regular_nca); + #endif } // 739 sbitmap_free ( cache_model); if( ri != NULL ) { ri->instance_interleave.regular_perf += regular_nca; cache_accesses_noreorg += regular_nca; + DEBUG_L("\n"); + DEBUG_A("Add regular_nca (%f) to regular_perf (now %e)", + regular_nca, ri->instance_interleave.regular_perf); + DEBUG_A(" and to cache_accesses_noreorg (now %e)\n", + cache_accesses_noreorg); } else { cache_accesses += regular_nca; } } // end for prop_var - -#else - for ( auto pvi = var_info.begin (); pvi != var_info.end (); pvi++ ) - { // 676 - //tree base_type = base_type_of( pvi->rep_access.access); - ReorgType_t *ri = pvi->rep_access->reorg; - // Reorg accounting - if( ri != NULL ) - { - double reorg_nca = 0.0; - - for ( auto fldi = pvi->fields.begin (); fldi != pvi->fields.end (); fldi++ ) - { - unsigned HOST_WIDE_INT fld_width = - tree_to_uhwi ( DECL_SIZE ( *fldi)); - reorg_nca += loop_count * alignment_effect ( fld_width); - } - ri->instance_interleave.reorg_perf += reorg_nca; -////////////////// DIFFERENCES START HERE - } // 699 - - // regular accounting - double regular_nca = 0.0; - sbitmap cache_model = sbitmap_alloc(1); - - for( auto pv2i = var_info.begin (); pv2i != var_info.end (); pv2i++ ) - { // 704 - tree access = pv2i->rep_access->base_info.acc_base; - tree base_type; // = base_type_of ( access); - if ( pv2i->rep_access->reorg != NULL ) { - base_type = pv2i->rep_access->reorg->gcc_type; - } - else - { - if ( TREE_TYPE ( access ) != NULL ) - { - base_type = base_type_of ( access); - } - else - { - gcc_assert (0); - } - } - - Bool base_type_isa_decl = DECL_P ( base_type ); - - // create a tiny model of the cache big - // enough for this record. - tree base_type_size = base_type_isa_decl ? - DECL_SIZE ( base_type ) - : - TYPE_SIZE ( base_type); - - unsigned HOST_WIDE_INT len = - (( tree_to_uhwi ( base_type_size) - + - param_l1_cache_line_size -1) - / - param_l1_cache_line_size) - + - 1; - - // TBD Does this clear the bits??? It needs to. - // Each bit represents a cache line. - cache_model = sbitmap_resize( cache_model, (unsigned) len, 0); - double accum = 0.0; - int nrbo = 0; - if ( base_type_isa_decl ) - { - for ( auto field_ex = TYPE_FIELDS ( base_type); - field_ex; - field_ex = DECL_CHAIN ( field_ex) ) - { - nrbo++; - // Looking back on my design I don't have a clue - // why this is here and what it does. Sigh... - unsigned HOST_WIDE_INT base_offset = - tree_to_uhwi ( DECL_FIELD_OFFSET( field_ex)); - // Access accounting - - for ( auto fldi = pv2i->fields.begin (); - fldi != pv2i->fields.end (); fldi++ ) - { - tree field = *fldi; - unsigned HOST_WIDE_INT fld_width, fld_offset; - fld_width = tree_to_uhwi ( DECL_SIZE ( field)); - fld_offset = tree_to_uhwi ( DECL_FIELD_OFFSET ( field)); - int chari; - for ( chari = 0; chari < fld_width; chari++ ) - { - int loc = (chari + fld_offset + base_offset) - / - param_l1_cache_line_size; - bitmap_set_bit ( cache_model, loc); - } - } - - accum += bitmap_count_bits ( cache_model); - bitmap_clear ( cache_model); - } - } - else - { - nrbo = 1; - accum++; - } - double amount = accum / nrbo; - regular_nca += amount; - } // 739 - sbitmap_free ( cache_model); - - if( ri != NULL ) { - ri->instance_interleave.regular_perf += regular_nca; - cache_accesses_noreorg += regular_nca; - } // 699 - - // regular accounting - double regular_nca = 0.0; - sbitmap cache_model = sbitmap_alloc(1); - - for( auto pv2i = var_info.begin (); pv2i != var_info.end (); pv2i++ ) - { // 704 - tree access = pv2i->rep_access->base_info.acc_base; - tree base_type; // = base_type_of ( access); - if ( pv2i->rep_access->reorg != NULL ) - { - base_type = pv2i->rep_access->reorg->gcc_type; - } - else - { - if ( TREE_TYPE ( access ) != NULL ) - { - base_type = base_type_of ( access); - } - else - { - gcc_assert (0); - } - } - - bool base_type_isa_decl = DECL_P ( base_type ); - - // create a tiny model of the cache big - // enough for this record. - tree base_type_size = base_type_isa_decl ? - DECL_SIZE ( base_type ) - : - TYPE_SIZE ( base_type); - - unsigned HOST_WIDE_INT len = - (( tree_to_uhwi ( base_type_size) - + - param_l1_cache_line_size -1) - / - param_l1_cache_line_size) - + - 1; - - // TBD Does this clear the bits??? It needs to. - // Each bit represents a cache line. - cache_model = sbitmap_resize( cache_model, (unsigned) len, 0); - double accum = 0.0; - int nrbo = 0; - if ( base_type_isa_decl ) - { - for ( auto field_ex = TYPE_FIELDS ( base_type); - field_ex; - field_ex = DECL_CHAIN ( field_ex) ) - { - nrbo++; - // Looking back on my design I don't have a clue - // why this is here and what it does. Sigh... - unsigned HOST_WIDE_INT base_offset = - tree_to_uhwi ( DECL_FIELD_OFFSET( field_ex)); - // Access accounting - - for ( auto fldi = pv2i->fields.begin (); - fldi != pv2i->fields.end (); fldi++ ) - { - tree field = *fldi; - unsigned HOST_WIDE_INT fld_width, fld_offset; - fld_width = tree_to_uhwi ( DECL_SIZE ( field)); - fld_offset = tree_to_uhwi ( DECL_FIELD_OFFSET ( field)); - int chari; - for ( chari = 0; chari < fld_width; chari++ ) - { - int loc = (chari + fld_offset + base_offset) - / - param_l1_cache_line_size; - bitmap_set_bit ( cache_model, loc); - } - } - - accum += bitmap_count_bits ( cache_model); - bitmap_clear ( cache_model); - } - } - else - { - nrbo = 1; - accum++; - } - double amount = accum / nrbo; - regular_nca += amount; - } // 739 - sbitmap_free ( cache_model); - - if( ri != NULL ) { - ri->instance_interleave.regular_perf += regular_nca; - cache_accesses_noreorg += regular_nca; - ///////////// DIFFERENCE NOTED HERE (small, next 4 lines not sane) - ri->instance_interleave.reorg_perf += reorg_nca; - //////////// DIFFERENCE NOTED HERE - - } // 699 - - // regular accounting - double regular_nca = 0.0; - sbitmap cache_model = sbitmap_alloc(1); - - for( auto pv2i = var_info.begin (); pv2i != var_info.end (); pv2i++ ) - { // 704 - tree access = pv2i->rep_access->base_info.acc_base; - tree base_type; // = base_type_of ( access); - if ( pv2i->rep_access->reorg != NULL ) - { - base_type = pv2i->rep_access->reorg->gcc_type; - } - else - { - if ( TREE_TYPE ( access ) != NULL ) - { - base_type = base_type_of ( access); - } - else - { - gcc_assert (0); - } - } - - bool base_type_isa_decl = DECL_P ( base_type ); - - // create a tiny model of the cache big - // enough for this record. - tree base_type_size = base_type_isa_decl ? - DECL_SIZE ( base_type ) - : - TYPE_SIZE ( base_type); - - unsigned HOST_WIDE_INT len = - (( tree_to_uhwi ( base_type_size) - + - param_l1_cache_line_size -1) - / - param_l1_cache_line_size) - + - 1; - - // TBD Does this clear the bits??? It needs to. - // Each bit represents a cache line. - cache_model = sbitmap_resize( cache_model, (unsigned) len, 0); - double accum = 0.0; - int nrbo = 0; - if ( base_type_isa_decl ) - { - for ( auto field_ex = TYPE_FIELDS ( base_type); - field_ex; - field_ex = DECL_CHAIN ( field_ex) ) - { - nrbo++; - // Looking back on my design I don't have a clue - // why this is here and what it does. Sigh... - unsigned HOST_WIDE_INT base_offset = - tree_to_uhwi ( DECL_FIELD_OFFSET( field_ex)); - // Access accounting - - for ( auto fldi = pv2i->fields.begin (); - fldi != pv2i->fields.end (); fldi++ ) - { - tree field = *fldi; - unsigned HOST_WIDE_INT fld_width, fld_offset; - fld_width = tree_to_uhwi ( DECL_SIZE ( field)); - fld_offset = tree_to_uhwi ( DECL_FIELD_OFFSET ( field)); - int chari; - for ( chari = 0; chari < fld_width; chari++ ) - { - int loc = (chari + fld_offset + base_offset) - / - param_l1_cache_line_size; - bitmap_set_bit ( cache_model, loc); - } - } - - accum += bitmap_count_bits ( cache_model); - bitmap_clear ( cache_model); - } - } - else - { - nrbo = 1; - accum++; - } - double amount = accum / nrbo; - regular_nca += amount; - } // 739 - sbitmap_free ( cache_model); - - if( ri != NULL ) { - ri->instance_interleave.regular_perf += regular_nca; - cache_accesses_noreorg += regular_nca; - //////////// DIFFERENCE NOTED HERE - // Code after here likely sane. - // Code above lines - 2618 same as - 2488 - } else { - cache_accesses += regular_nca; - } - } // end for each prop_var 748 -#endif } // if ( info->show_perf_qualify && missing_cases ) @@ -2667,6 +2412,12 @@ reorg_perf_qual ( Info *info) if ( info->show_perf_qualify ) { + fprintf ( info->reorg_dump_file, "total_cache_accesses: %e\n\n", + total_cache_accesses); + } + + if ( info->show_perf_qualify ) + { fprintf ( info->reorg_dump_file, "Decide which reorgTypes fail performance qualification\n"); } @@ -2680,10 +2431,16 @@ reorg_perf_qual ( Info *info) reorgi != reorg_types->end (); reorgi++ ) { double with_opt = reorgi->instance_interleave.reorg_perf; - double wihtout_opt = reorgi->instance_interleave.regular_perf; - double raw_effect = with_opt/wihtout_opt; + double without_opt = reorgi->instance_interleave.regular_perf; + double raw_effect = with_opt/without_opt; double absolute_effect = - (wihtout_opt - with_opt) / total_cache_accesses; + (without_opt - with_opt) / total_cache_accesses; + DEBUG_A("For "); + DEBUG_F(flexible_print, stderr, reorgi->gcc_type, 0, (dump_flags_t)0); + DEBUG(" with_opt: %e, without_opt %e, total_cache_accesses %e\n", + with_opt, without_opt, total_cache_accesses); + DEBUG_A(" Raw Effect: %5.4f, Absolute Effect %5.4f\n", + raw_effect, absolute_effect); // Note, there would need to be a multi-pool case here if // that is every done. @@ -2693,11 +2450,12 @@ reorg_perf_qual ( Info *info) { if ( info->show_perf_qualify ) { - fprintf ( info->reorg_dump_file, "Disqualified: "); - flexible_print ( stderr, reorgi->gcc_type, 0, (dump_flags_t)0); - fprintf ( info->reorg_dump_file, ": Very small effect: "); + fprintf ( info->reorg_dump_file, " Disqualified: "); + flexible_print ( info->reorg_dump_file, reorgi->gcc_type, 0, + (dump_flags_t)0); + fprintf ( info->reorg_dump_file, ": Very small effect:\n"); fprintf ( info->reorg_dump_file, - "raw_effect %e < SINGLE_POOL_RAW_SKIP_IT %e\n", + " raw_effect %5.4 < SINGLE_POOL_RAW_SKIP_IT %5.4\n", raw_effect, SINGLE_POOL_RAW_SKIP_IT); } reorgi->do_instance_interleave = false; @@ -2710,11 +2468,12 @@ reorg_perf_qual ( Info *info) if ( info->show_perf_qualify ) { - fprintf ( info->reorg_dump_file, "Qualified: "); - flexible_print ( stderr, reorgi->gcc_type, 0, (dump_flags_t)0); - fprintf ( info->reorg_dump_file, ": Large raw effect: "); + fprintf ( info->reorg_dump_file, " Qualified: "); + flexible_print ( info->reorg_dump_file, reorgi->gcc_type, 0, + (dump_flags_t)0); + fprintf ( info->reorg_dump_file, ": Large raw effect:\n"); fprintf ( info->reorg_dump_file, - "raw_effect %e >= SINGLE_POOL_RAW_DO_IT_ALWAYS %e\n", + " raw_effect %5.4f >= SINGLE_POOL_RAW_DO_IT_ALWAYS %5.4f\n", raw_effect, SINGLE_POOL_RAW_DO_IT_ALWAYS); } @@ -2725,11 +2484,12 @@ reorg_perf_qual ( Info *info) { if ( info->show_perf_qualify ) { - fprintf ( info->reorg_dump_file, "Disqualified: "); - flexible_print ( stderr, reorgi->gcc_type, 0, (dump_flags_t)0); - fprintf ( info->reorg_dump_file, ": Very small absolute effect: "); + fprintf ( info->reorg_dump_file, " Disqualified: "); + flexible_print ( info->reorg_dump_file, reorgi->gcc_type, 0, + (dump_flags_t)0); + fprintf ( info->reorg_dump_file, ": Very small absolute effect:\n"); fprintf ( info->reorg_dump_file, - "absolute_effect %e < SINGLE_POOL_ABS_SKIP_IT %e\n", + " absolute_effect %5.4f < SINGLE_POOL_ABS_SKIP_IT %5.4f\n", absolute_effect, SINGLE_POOL_ABS_SKIP_IT); } @@ -2741,11 +2501,12 @@ reorg_perf_qual ( Info *info) if ( info->show_perf_qualify ) { - fprintf ( info->reorg_dump_file, "Qualified: "); - flexible_print ( stderr, reorgi->gcc_type, 0, (dump_flags_t)0); - fprintf ( info->reorg_dump_file, ": Large absolute effect: "); + fprintf ( info->reorg_dump_file, " Qualified: "); + flexible_print ( info->reorg_dump_file, reorgi->gcc_type, 0, + (dump_flags_t)0); + fprintf ( info->reorg_dump_file, ": Large absolute effect:\n"); fprintf ( info->reorg_dump_file, - "absolute_effect %e >= SINGLE_POOL_ABS_DO_IT_ALWAYS %e\n", + " absolute_effect %5.4f >= SINGLE_POOL_ABS_DO_IT_ALWAYS %5.4f\n", absolute_effect, SINGLE_POOL_ABS_DO_IT_ALWAYS); } @@ -2762,11 +2523,12 @@ reorg_perf_qual ( Info *info) if ( info->show_perf_qualify ) { - fprintf ( info->reorg_dump_file, "Disqualified: "); - flexible_print ( stderr, reorgi->gcc_type, 0, (dump_flags_t)0); - fprintf ( info->reorg_dump_file, ": Failed cut off equations: "); + fprintf ( info->reorg_dump_file, " Disqualified: "); + flexible_print ( info->reorg_dump_file, reorgi->gcc_type, 0, + (dump_flags_t)0); + fprintf ( info->reorg_dump_file, ": Failed cut off equations:\n"); fprintf ( info->reorg_dump_file, - "raw_effect %e < cut_off %e\n", + " raw_effect %5.4f < cut_off %5.4f\n", raw_effect, cut_off); } @@ -2776,11 +2538,12 @@ reorg_perf_qual ( Info *info) if ( info->show_perf_qualify ) { - fprintf ( info->reorg_dump_file, "Qualified: "); - flexible_print ( stderr, reorgi->gcc_type, 0, (dump_flags_t)0); - fprintf ( info->reorg_dump_file, ": Passed cut off equations"); + fprintf ( info->reorg_dump_file, " Qualified: "); + flexible_print ( info->reorg_dump_file, reorgi->gcc_type, 0, + (dump_flags_t)0); + fprintf ( info->reorg_dump_file, ": Passed cut off equations:\n"); fprintf ( info->reorg_dump_file, - "raw_effect %e >= cut_off %e\n", + " raw_effect %5.4f >= cut_off %5.4f\n", raw_effect, cut_off); } diff --git a/gcc/ipa-structure-reorg.h b/gcc/ipa-structure-reorg.h index c0c12afe695..3f2e137af6c 100644 --- a/gcc/ipa-structure-reorg.h +++ b/gcc/ipa-structure-reorg.h @@ -258,7 +258,7 @@ extern const char *optrans_to_str ( enum ReorgOpTrans); // defined marcos in the code. However, some of uses // should obviously be converted to dump file information. -#define DEBUGGING 1 +#define DEBUGGING 0 #if DEBUGGING enum Display { Show_nothing, |