|
||
unreachable.ccGo to the documentation of this file.00001 // $Id: unreachable.cc,v 1.3 2003/08/07 23:14:21 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 "unreachable.h" 00040 00041 void Unreachable::remove(procNode * proc) 00042 { 00043 Unreachable un(proc); 00044 un.remove_unreachable(); 00045 } 00046 00047 void Unreachable::remove(unitNode * unit) 00048 { 00049 for (def_list_p dp = unit->defs().begin(); 00050 dp != unit->defs().end(); 00051 ++dp) 00052 { 00053 defNode * dn = (*dp); 00054 if (dn->typ() == Proc) { 00055 procNode * proc = (procNode *) dn; 00056 Unreachable un(proc); 00057 un.remove_unreachable(); 00058 } 00059 } 00060 } 00061 00062 // --- Unreachable code elimination 00063 00064 void Unreachable::remove_unreachable() 00065 { 00066 stmt_list & blocks = _proc->body()->stmts(); 00067 00068 basicblockNode * entry = _proc->entry(); 00069 00070 // Visit each basic block 00071 00072 stmt_list_p block_p = blocks.begin(); 00073 while (block_p != blocks.end()) { 00074 basicblockNode * cur = (basicblockNode *) * block_p; 00075 00076 // A block should be removed if it has no predecessors, but is not 00077 // the entry node. 00078 00079 if (cur->preds().empty() && (cur != entry)) { 00080 00081 // Remove references from any successors (this is what was 00082 // causing the dominators algorithm to crash). 00083 00084 basicblock_list & succs = cur->succs(); 00085 for (basicblock_list_p succ_p = succs.begin(); 00086 succ_p != succs.end(); 00087 ++succ_p) 00088 { 00089 basicblockNode * succ = *succ_p; 00090 basicblock_list & preds = succ->preds(); 00091 00092 basicblock_list_p q = find(preds.begin(), preds.end(), cur); 00093 if (q != preds.end()) 00094 preds.erase(q); 00095 } 00096 00097 // Remove the block itself 00098 00099 stmt_list_p tmp = block_p; 00100 block_p++; 00101 blocks.erase(tmp); 00102 // delete cur; 00103 } 00104 else 00105 block_p++; 00106 } 00107 } 00108 |
Generated on August 27, 2003
Back to the C-Breeze home page