def createGraphs(program, basepath): import UDrawGraph, ICFGs, Trees, IPGs Debug.debugMessage("Creating data structures", 1) for cfg in program.getCFGs(): functionName = cfg.getName() UDrawGraph.makeUdrawFile(cfg, basepath, "%s.%s" % (functionName, "cfg")) predomTree = Trees.Dominators(cfg, cfg.getEntryID()) reverseg = cfg.getReverseCFG() postdomTree = Trees.Dominators(reverseg, reverseg.getEntryID()) UDrawGraph.makeUdrawFile(predomTree, basepath, "%s.%s" % (functionName, "pre")) UDrawGraph.makeUdrawFile(postdomTree, basepath, "%s.%s" % (functionName, "post")) icfg = ICFGs.ICFG(cfg) icfg.setEntryID() icfg.setExitID() icfg.addExitEntryEdge() program.addICFG(icfg) UDrawGraph.makeUdrawFile(icfg, basepath, "%s.%s" % (functionName, "icfg")) lnt = Trees.LoopNests(icfg, icfg.getEntryID()) program.addLNT(lnt) UDrawGraph.makeUdrawFile(lnt, basepath, "%s.%s" % (functionName, "lnt")) ipg = IPGs.IPG(icfg, lnt) program.addIPG(ipg) icfg.addBranchDivergenceEdges(lnt) ipg.updateWithBranchDivergentPaths() UDrawGraph.makeUdrawFile(icfg, basepath, "%s.%s" % (functionName, "icfg")) UDrawGraph.makeUdrawFile(ipg, basepath, "%s.%s" % (functionName, "ipg"))
def __solveDFF(self, forwardBranches): # Initialise data structures needed vertexToReachable = {} for v in self: vertexToReachable[v] = set([]) # Do a reverse post-order. Avoid the entry vertex dfs = Trees.DepthFirstSearch(self, self._entryID) postID = self.numOfVertices() - 1 while postID >= 1: vertexID = dfs.getPostorderVertexID(postID) v = self.getVertex(vertexID) vertexToReachable[v].add(vertexID) for predID in v.getPredecessorIDs(): predv = self.getVertex(predID) vertexToReachable[v].add(predID) vertexToReachable[v].update(vertexToReachable[predv]) postID -= 1 # Now analyse the immediate post-dominator reverseg = self.getReverseCFG() postdomTree = Trees.Dominators(reverseg, reverseg.getEntryID()) for vertexID in forwardBranches: Debug.debugMessage("Vertex %d is a forward branch" % vertexID, 5) branchv = self.getVertex(vertexID) succSet = set(branchv.getSuccessorIDs()) treev = postdomTree.getVertex(vertexID) parentID = treev.getParentID() mergev = self.getVertex(parentID) Debug.debugMessage( "Analysing region (%d, %d)" % (vertexID, parentID), 5) # for succID in branchv.getSuccessorIDs(): # if succID != parentID: # self.addEdge(parentID, succID) # self.__branchDivergentEdges.append((parentID, succID)) for predID in mergev.getPredecessorIDs(): predv = self.getVertex(predID) newsuccs = set.difference(succSet, vertexToReachable[predv]) for newsuccID in newsuccs: if newsuccID not in predv.getSuccessorIDs( ) and newsuccID != predID: self.addEdge(predID, newsuccID) self.__branchDivergentEdges.append((predID, newsuccID))