Ejemplo n.º 1
0
	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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
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)
Ejemplo n.º 7
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)
Ejemplo n.º 8
0
	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