C-Breeze
C Compiler Infrastructure

[ Project home page]
Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

worklist.cc

Go to the documentation of this file.
00001 // $Id: worklist.cc,v 1.10 2003/08/07 23:14:33 pnav Exp $
00002 // ----------------------------------------------------------------------
00003 //
00004 //  C-Breeze
00005 //  C Compiler Framework
00006 // 
00007 //  Copyright (c) 2000 University of Texas at Austin
00008 // 
00009 //  Samuel Z. Guyer
00010 //  Daniel A. Jimenez
00011 //  Calvin Lin
00012 // 
00013 //  Permission is hereby granted, free of charge, to any person
00014 //  obtaining a copy of this software and associated documentation
00015 //  files (the "Software"), to deal in the Software without
00016 //  restriction, including without limitation the rights to use, copy,
00017 //  modify, merge, publish, distribute, sublicense, and/or sell copies
00018 //  of the Software, and to permit persons to whom the Software is
00019 //  furnished to do so, subject to the following conditions:
00020 //  
00021 //  The above copyright notice and this permission notice shall be
00022 //  included in all copies or substantial portions of the Software.
00023 //  
00024 //  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00025 //  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00026 //  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00027 //  NONINFRINGEMENT.  IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT
00028 //  AUSTIN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
00029 //  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
00030 //  OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00031 //  THE SOFTWARE.
00032 //
00033 //  We acknowledge the C-to-C Translator from MIT Laboratory for
00034 //  Computer Science for inspiring parts of the C-Breeze design.
00035 //
00036 // ----------------------------------------------------------------------
00037 
00038 #include "c_breeze.h"
00039 #include "worklist.h"
00040 
00041 int workList::get_next_block()
00042 {
00043   // When is_empty, return 0
00044 
00045   if (is_empty())
00046     return 0;
00047 
00048   // Search down the list for the next set bit
00049 
00050   while ( ! _worklist.test(_cur_position) ) {
00051     _cur_position++;
00052     if (_cur_position == _max_size)
00053       _cur_position = 0;
00054   }
00055 
00056   // Find the corresponding basic block and reset the bit
00057 
00058   _worklist.reset(_cur_position);
00059   _cur_size--;
00060 
00061   // Result
00062 
00063   int result = _cur_position;
00064 
00065   // Always go to the next block
00066 
00067   _cur_position++;
00068   if (_cur_position == _max_size)
00069     _cur_position = 0;
00070 
00071   // cout << "WORKLIST: get_next_block, cur_size = " << _cur_size <<
00072   //  " cur_position = " << _cur_position << endl;
00073 
00074   return result;
00075 }
00076 
00077 bool workList::is_empty() const
00078 {
00079   return _cur_size == 0;
00080 }
00081 
00082 void workList::add_block(int position)
00083 {
00084   // Only add it if its not already there
00085 
00086   if ( ! _worklist.test(position) ) {
00087     _worklist.set(position);
00088     _cur_size++;
00089   }
00090 
00091   // This seems reasonable: go back to earlier blocks right away
00092 
00093   // IT DOESN'T WORK. WHY?
00094   // if (position < _cur_position)
00095   //  _cur_position = position;
00096   
00097   // cout << "WORKLIST: add_block " << position << ", cur_size = " << _cur_size <<
00098   //  " cur_position = " << _cur_position << endl;
00099 }
00100 
00101 void workList::remove_block(int position)
00102 {
00103   if (_worklist.test(position) ) {
00104     _worklist.reset(position);
00105     _cur_size--;
00106   }
00107 }
00108 
00109 
00110 void workList::add_all_blocks()
00111 {
00112   _worklist.set();
00113   _cur_position = 0;
00114   _cur_size = _max_size;
00115 
00116   //  cout << "WORKLIST: add_all_blocks, cur_size = " << _cur_size << endl;
00117 }      
00118 
00119 void workList::skip_current_block()
00120 {
00121   // When is_empty, return 0
00122 
00123   if (is_empty())
00124     return;
00125 
00126   _cur_position++;
00127   if (_cur_position == _max_size)
00128     _cur_position = 0;
00129 }
00130 

Generated on August 27, 2003
Back to the C-Breeze home page