def processCode(self, code, simplify): signatures = self.generateSignatures(code) replace = self.generateReplacements(signatures) if simplify: rewrite.rewriteAndSimplify(self.compiler, self.prgm, code, replace) else: rewrite.rewrite(self.compiler, code, replace) return self.eliminated
def evaluateCode(compiler, code): infer = InferBoolean() infer.process(code) if infer.converts: # Eliminate ConvertToBool nodes that take booleans as arguments replace = {} for convert in infer.converts: if infer.isBoolean(convert.expr): replace[convert] = convert.expr if replace: rewrite(compiler, code, replace)
def evaluate(compiler, prgm, simplify=False): with compiler.console.scope('dead store elimination'): live = set() stores = collections.defaultdict(list) # Analysis pass for code in prgm.liveCode: live.update(code.annotation.codeReads[0]) for op in codeOps(code): live.update(op.annotation.reads[0]) if isinstance(op, ast.Store): stores[code].append(op) # Transform pass totalEliminated = 0 for code in prgm.liveCode: if not code.isStandardCode() or code.annotation.descriptive: continue replace = {} eliminated = 0 # Look for dead stores for store in stores[code]: for modify in store.annotation.modifies[0]: if modify in live: break if modify.object.leaks: break else: replace[store] = [] eliminated += 1 # Rewrite the code without the dead stores if replace: compiler.console.output('%r %d' % (code, eliminated)) if simplify: rewrite.rewriteAndSimplify(compiler, prgm, code, replace) else: rewrite.rewrite(compiler, code, replace) totalEliminated += eliminated return totalEliminated > 0
def postProcessCode(self, code): self.rewrites = {} self.remap = {} self.fields = {} self.header = [] self.processParameters(code) for name, group in self.groups.iteritems(): self.processGroup(code, name, group) rewrite.rewrite(self.compiler, code, self.rewrites) code.ast = ast.Suite([ast.InputBlock(self.header), code.ast]) if self.ssaBroken: ssatransform.evaluateCode(self.compiler, code) simplify.evaluateCode(self.compiler, self.prgm, code)
def process(self): returns = FindReturns().process(self.code) assert len(returns) == 1, "Temporary Limitation: only one return per shader" rewrites = {} for ret in returns: desc, rewrites[ret] = self.processReturn(ret) rewrite.rewrite(self.compiler, self.code, rewrites) # HACK while loadelimination.evaluateCode(self.compiler, self.prgm, self.code, simplify=False): pass #simplify.evaluateCode(self.compiler, self.prgm, self.code) #storeelimination.evaluate(self.compiler, self.prgm, simplify=False) simplify.evaluateCode(self.compiler, self.prgm, self.code) return desc