Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

ShInternals.cpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright (c) 2003 University of Waterloo Computer Graphics Laboratory
00004 // Project administrator: Michael D. McCool
00005 // Authors: Zheng Qin, Stefanus Du Toit, Kevin Moule, Tiberiu S. Popa,
00006 //          Michael D. McCool
00007 // 
00008 // This software is provided 'as-is', without any express or implied
00009 // warranty. In no event will the authors be held liable for any damages
00010 // arising from the use of this software.
00011 // 
00012 // Permission is granted to anyone to use this software for any purpose,
00013 // including commercial applications, and to alter it and redistribute it
00014 // freely, subject to the following restrictions:
00015 // 
00016 // 1. The origin of this software must not be misrepresented; you must
00017 // not claim that you wrote the original software. If you use this
00018 // software in a product, an acknowledgment in the product documentation
00019 // would be appreciated but is not required.
00020 // 
00021 // 2. Altered source versions must be plainly marked as such, and must
00022 // not be misrepresented as being the original software.
00023 // 
00024 // 3. This notice may not be removed or altered from any source
00025 // distribution.
00027 #include "ShInternals.hpp"
00028 #include "ShDebug.hpp"
00029 
00030 namespace SH { 
00031 
00032 ShVariableReplacer::ShVariableReplacer(ShVarMap& v)
00033   : varMap(v) 
00034 {
00035 }
00036 
00037 void ShVariableReplacer::operator()(ShCtrlGraphNodePtr node) 
00038 {
00039   // replace variables that are conditions in branches 
00040   ShCtrlGraphNode::SuccessorList::iterator I;
00041   for(I = node->successors.begin(); I != node->successors.end(); ++I) {
00042     repVar(I->cond); 
00043   }
00044 
00045   // replace variables in the block
00046   if (!node) return;
00047   ShBasicBlockPtr block = node->block;
00048   if (!block) return;
00049   for (ShBasicBlock::ShStmtList::iterator I = block->begin(); I != block->end(); ++I) {
00050     repVar(I->dest);
00051     for (int i = 0; i < 3; i++) {
00052       repVar(I->src[i]);
00053     }
00054   }
00055 
00056 }
00057 
00058 void ShVariableReplacer::operator()(ShProgramNode::VarList &varList) 
00059 {
00060   ShProgramNode::VarList::iterator I;
00061   for(I = varList.begin(); I != varList.end();) {
00062     if(varMap.count(*I) > 0) {
00063       varList.insert(I, varMap[*I]);
00064       I = varList.erase(I);
00065     } else ++I;
00066   }
00067 }
00068 
00069 void ShVariableReplacer::repVar(ShVariable& var) 
00070 {
00071   if(var.null()) return;
00072   ShVarMap::iterator I = varMap.find(var.node());
00073   if (I == varMap.end()) return;
00074   var = ShVariable(I->second, var.swizzle(), var.neg());
00075 }
00076 
00077 }
00078 
00079 

Generated on Mon Jan 24 18:36:32 2005 for Sh by  doxygen 1.4.1