def optimization_of_common_expressions(self): actual = Quadruple() pivote = Quadruple() i = 0 j = 0 while i < len(self.fuente): pivote = self.fuente[i] if pivote.type == Quadruple.T_ARITOP: j = i + 1 while j < len(self.fuente): actual = self.fuente[j] if actual.type == Quadruple.T_ARITOP: if (not (actual.resultado.id == pivote.resultado.id) and not (actual.resultado.id == pivote.Elem1.id) and not (actual.resultado.id == pivote.Elem2.id)): if actual.operador == pivote.operador: if ((actual.Elem1.id == pivote.Elem1.id) and (actual.Elem2.id == pivote.Elem2.id)) or ( (actual.Elem1.id == pivote.Elem2.id) and (actual.Elem2.id == pivote.Elem1.id)): actual.Elem1 = pivote.resultado actual.Elem2 = None actual.operador = -1 actual.type = Quadruple.T_ASIG actual.typeOpt = actual.typeOpt else: j = len(self.fuente) j += 1 i += 1
def arithmetic_optimization(self): iterator = iter(self.fuente) actual = Quadruple() nuevo = Quadruple() while True: try: actual = next(iterator) nuevo = copy.deepcopy(actual) if actual.type == Quadruple.T_ARITOP: if actual.operador == self.OP_DIVISION: # x = y/1 -> x=y if actual.Elem2.id == "1": nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 15") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "/" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None if actual.Elem1.id == "0": nuevo.Elem1.id = "0" nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 18") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "/" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None elif actual.operador == self.OP_PRODUCTO: # x=y*1 if actual.Elem2.id == "1": nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 14") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "*" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None # x=1*y elif actual.Elem1.id == "1": nuevo.Elem1 = nuevo.Elem2 nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 14") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "*" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None # x=y*0 or 0*y elif actual.Elem1.id == "0" or actual.Elem2.id == "0": nuevo.Elem1.constructor1("0", Element.E_SCALAR) nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 17") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "*" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None # x=y*2=y+y or 2*y=y+y elif actual.Elem1.id != actual.Elem2.id: if actual.Elem1.id == "2": if actual.Elem2.id.isalnum(): nuevo.Elem1.constructor1( actual.Elem2.id, Element.E_SCALAR) nuevo.Elem2.constructor1( actual.Elem2.id, Element.E_SCALAR) nuevo.operador = 11 nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 16") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "*" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id + "+" + nuevo.Elem2.id) elif actual.Elem2.id == "2": if actual.Elem1.id.isalnum(): nuevo.Elem1.constructor1( actual.Elem1.id, Element.E_SCALAR) nuevo.Elem2.constructor1( actual.Elem1.id, Element.E_SCALAR) nuevo.operador = 11 nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 16") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "*" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id + "+" + nuevo.Elem2.id) elif actual.operador == self.OP_RESTA: # x=y-0 -> x=y if actual.Elem2.id == "0": nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 13") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "-" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None # x=0-y -> x=-y elif actual.Elem1.id == "0": nuevo.Elem1 = nuevo.Elem2 nuevo.Elem1.id = " - " + nuevo.Elem1.id nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 13") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "-" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None elif actual.operador == self.OP_SUMA: # x=y+0 -> x=y if actual.Elem2.id == "0": nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 12") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "+" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None # x=0+y -> x=y elif actual.Elem1.id == "0": nuevo.Elem1 = nuevo.Elem2 nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.registro.append("Linea: " + str(actual.line)) self.registro.append("Regla 12") self.registro.append(actual.resultado.id + "=" + actual.Elem1.id + "+" + actual.Elem2.id + " -> " + nuevo.resultado.id + "=" + nuevo.Elem1.id) nuevo.Elem2 = None self.sumidero.append(nuevo) except StopIteration: break self.fuente = self.sumidero
def arithmetic_optimization(self): iterator = iter(self.fuente) actual = Quadruple() nuevo = Quadruple() while True: try: actual = next(iterator) nuevo = actual if actual.type == Quadruple.T_ARITOP: if actual.operador == self.OP_DIVISION: # x = y/1 -> x=y if actual.Elem2.id == "1": nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT if actual.Elem1.id == "0": nuevo.Elem1.id = "0" nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT elif actual.operador == self.OP_PRODUCTO: # x=y*1 if actual.Elem2.id == "1": nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT # x=1*y elif actual.Elem1.id == "1": nuevo.Elem1 = nuevo.Elem2 nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT # x=y*0 or 0*y elif actual.Elem1.id == "0" or actual.Elem2.id == "0": nuevo.Elem1.constructor1("0", Element.E_SCALAR) nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT # x=y*2=y+y or 2*y=y+y elif actual.Elem1.id != actual.Elem2.id: if actual.Elem1.id == "2": if actual.Elem2.id.isalnum(): nuevo.Elem1.constructor1( actual.Elem2.id, Element.E_SCALAR) nuevo.Elem2.constructor1( actual.Elem2.id, Element.E_SCALAR) nuevo.operador = 11 nuevo.typeOpt = self.TOP_ARIT elif actual.Elem2.id == "2": if actual.Elem1.id.isalnum(): nuevo.Elem1.constructor1( actual.Elem1.id, Element.E_SCALAR) nuevo.Elem2.constructor1( actual.Elem1.id, Element.E_SCALAR) nuevo.operador = 11 nuevo.typeOpt = self.TOP_ARIT elif actual.operador == self.OP_RESTA: # x=y-0 -> x=y if actual.Elem2.id == "0": nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT # x=0-y -> x=-y elif actual.Elem1.id == "0": nuevo.Elem1 = nuevo.Elem2 nuevo.Elem1.id = " - " + nuevo.Elem1.id nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT elif actual.operador == self.OP_SUMA: # x=y+0 -> x=y if actual.Elem2.id == "0": nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT # x=0+y -> x=y elif actual.Elem1.id == "0": nuevo.Elem1 = nuevo.Elem2 nuevo.Elem2 = None nuevo.operador = -1 nuevo.type = Quadruple.T_ASIG nuevo.typeOpt = self.TOP_ARIT self.sumidero.append(nuevo) except StopIteration: break self.fuente = self.sumidero