[tree-ssa] RFC: Making control flow more explicit

Daniel Berlin dberlin@dberlin.org
Thu Aug 7 19:20:00 GMT 2003


On Thursday, August 7, 2003, at 2:45 PM, Jason Merrill wrote:

> I think that the WHIRL example is relevant here.
>
> VHWHIRL is very close to the source, with arbitrary nesting of 
> constructs.
> This corresponds to GENERIC.  Inlining is done at this level in both 
> their
> compiler and ours (except that all the frontends currently lower 
> straight
> to GIMPLE, but that's another issue).
>
> HWHIRL breaks apart nested expressions (calls, comma ops), but still
> retains control flow structures.  This corresponds to (current) GIMPLE.
> Apparently the SGI compiler does IPA, LNO (huh?) and "the PREOPT part 
> of
> the global scalar optimizer" at this level.
>
> MWHIRL lowers all control flow to gotos, possibly conditional or 
> computed.
> This seems to be what you're looking for.  We probably want to define a
> lower GIMPLE to match, and do the lowering somewhere in the middle of
> optimization.
>

Actually, it appears they perform goto removal in the preopt phase.
"// goto conversion
   if (WOPT_Enable_Goto &&
       (phase == PREOPT_LNO_PHASE || phase == PREOPT_PHASE)) {
     SET_OPT_PHASE("Goto conversion");
     OPT_POOL_Push( &Opt_local_pool, MEM_DUMP_FLAG+2 );
     {
       GOTO_TABLE goto_table( wn_tree, &Opt_local_pool );
       goto_table.Remove_Gotos();
       // goto_table gets destructed before we pop the pool
     }
"

Where they really mean goto removal:

"//  Convert gotos into WHILEs and IFs.  This is loosely based on
//  the paper "Taming Control Flow: A Structured Approach to Eliminating
//  Goto Statements" by Ana Erosa and Laurie Hendren.  As a first cut,
//  and probably as a last cut, we limit ourselves to removing sibling
//  gotos and gotos going out of an 'IF'.
//  Our requirements are different than Erosa's.  We don't need
//  to get rid of every goto.  For most of the other gotos, although
//  not all, we don't benefit by getting rid of them.  Limiting 
ourselves
//  simplifies the algorithm and prevents bloat (Granted Erosa claims 
the
//  bloat is small).
//
//  Additional limitations. We limit the number of gotos out of IFs 
that we
//  remove to MAX_GOTO_EXPANDING_TRANSFORMATIONS = 20.  This prevents 
code
//  bloat in the bad cases.  We don't touch gotos to "break" labels.  
These
//  transformations unnecessarily mess up case statements.
//  We don't create IFs out of unconditional gotos.  The optimizer 
promises to
//  erase these gotos.
//
//      WHIRL doesn't allow gotos into structured control flow.  Goto
//  conversion creates such gotos.  So TCF also dismantles such control
//  flow nodes (whether or not TCF created them)"
"

> Jason



More information about the Gcc mailing list