-eBBlock **eBBlockFromiCode (iCode *ic)
-{
- eBBlock **ebbs = NULL ;
- int count = 0;
- int saveCount = 0 ;
- int change = 1;
- int lchange = 0 ;
- int kchange = 0;
- hTab *loops ;
-
- /* if nothing passed then return nothing */
- if (!ic)
- return NULL ;
-
- count = 0;
- eBBNum = 0;
-
- /* optimize the chain for labels & gotos
- this will eliminate redundant labels and
- will change jump to jumps by jumps */
- ic = iCodeLabelOptimize (ic);
-
- /* break it down into basic blocks */
- ebbs = iCodeBreakDown (ic,&count);
- saveCount = count ;
-
- /* compute the control flow */
- computeControlFlow (ebbs,count,0);
-
- /* dumpraw if asked for */
- if (options.dump_raw)
- dumpEbbsToFileExt(".dumpraw0",ebbs,count);
-
- /* replace the local variables with their
- register equivalents : the liveRange computation
- along with the register allocation will determine
- if it finally stays in the registers */
- replaceRegEqv (ebbs,count);
-
- /* create loop regions */
- loops = createLoopRegions (ebbs,count);
-
- /* dumpraw if asked for */
- if (options.dump_raw)
- dumpEbbsToFileExt(".dumpraw1",ebbs,count);
-
- /* do common subexpression elimination for each block */
- change = cseAllBlocks(ebbs,saveCount);
-
- /* dumpraw if asked for */
- if (options.dump_raw)
- dumpEbbsToFileExt(".dumpcse",ebbs,count);
-
- /* compute the data flow */
- computeDataFlow (ebbs,saveCount);
-
- /* dumpraw if asked for */
- if (options.dump_raw)
- dumpEbbsToFileExt(".dumpdflow",ebbs,count);
-
- /* global common subexpression elimination */
- if ( optimize.global_cse ) {
- change += cseAllBlocks(ebbs,saveCount);
- if (options.dump_gcse)
- dumpEbbsToFileExt(".dumpgcse",ebbs,saveCount);
+eBBlock **
+eBBlockFromiCode (iCode * ic)
+{
+ eBBlock **ebbs = NULL;
+ int count = 0;
+ int saveCount = 0;
+ int change = 1;
+ int lchange = 0;
+ int kchange = 0;
+ hTab *loops;
+
+ /* if nothing passed then return nothing */
+ if (!ic)
+ return NULL;
+
+ count = 0;
+ eBBNum = 0;
+
+ /* optimize the chain for labels & gotos
+ this will eliminate redundant labels and
+ will change jump to jumps by jumps */
+ ic = iCodeLabelOptimize (ic);
+
+ /* break it down into basic blocks */
+ ebbs = iCodeBreakDown (ic, &count);
+ saveCount = count;
+
+ /* compute the control flow */
+ computeControlFlow (ebbs, count, 0);
+
+ /* dumpraw if asked for */
+ if (options.dump_raw)
+ dumpEbbsToFileExt (".dumpraw0", ebbs, count);
+
+ /* replace the local variables with their
+ register equivalents : the liveRange computation
+ along with the register allocation will determine
+ if it finally stays in the registers */
+ replaceRegEqv (ebbs, count);
+
+ /* create loop regions */
+ loops = createLoopRegions (ebbs, count);
+
+ /* dumpraw if asked for */
+ if (options.dump_raw)
+ dumpEbbsToFileExt (".dumpraw1", ebbs, count);
+
+ /* do common subexpression elimination for each block */
+ change = cseAllBlocks (ebbs, saveCount);
+
+ /* dumpraw if asked for */
+ if (options.dump_raw)
+ dumpEbbsToFileExt (".dumpcse", ebbs, count);
+
+ /* compute the data flow */
+ computeDataFlow (ebbs, saveCount);
+
+ /* dumpraw if asked for */
+ if (options.dump_raw)
+ dumpEbbsToFileExt (".dumpdflow", ebbs, count);
+
+ /* global common subexpression elimination */
+ if (optimize.global_cse)
+ {
+ change += cseAllBlocks (ebbs, saveCount);
+ if (options.dump_gcse)
+ dumpEbbsToFileExt (".dumpgcse", ebbs, saveCount);
+ }
+ /* kill dead code */
+ kchange = killDeadCode (ebbs, saveCount);
+
+ if (options.dump_kill)
+ dumpEbbsToFileExt (".dumpdeadcode", ebbs, count);
+
+ /* do loop optimizations */
+ change += (lchange = loopOptimizations (loops, ebbs, count));
+ if (options.dump_loop)
+ dumpEbbsToFileExt (".dumploop", ebbs, count);
+
+ /* recompute the data flow and apply global cse again
+ if loops optimizations or dead code caused a change:
+ loops will brings out of the loop which then may be
+ available for use in the later blocks: dead code
+ elimination could potentially disconnect some blocks
+ conditional flow may be efected so we need to apply
+ subexpression once more */
+ if (lchange || kchange)
+ {
+
+ computeDataFlow (ebbs, saveCount);
+ change += cseAllBlocks (ebbs, saveCount);
+ if (options.dump_loop)
+ dumpEbbsToFileExt (".dumploopg", ebbs, count);
+
+ /* if loop optimizations caused a change then do
+ dead code elimination once more : this will
+ get rid of the extra assignments to the induction
+ variables created during loop optimizations */
+ killDeadCode (ebbs, saveCount);
+
+ if (options.dump_loop)
+ dumpEbbsToFileExt (".dumploopd", ebbs, count);
+