00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
00040 ShCtrlGraphNode::SuccessorList::iterator I;
00041 for(I = node->successors.begin(); I != node->successors.end(); ++I) {
00042 repVar(I->cond);
00043 }
00044
00045
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