def _callback(self, op, save, nextop): if rop.returns_bool_result(op.opnum): self.opt.getintbound(op).make_bool() if save: recentops = self.opt.getrecentops(op.getopnum()) recentops.add(op) if nextop: self.opt.emit_extra(nextop)
def _callback(self, op, save, nextop): if rop.returns_bool_result(op.opnum): self.opt.getintbound(op).make_bool() if save: recentops = self.opt.getrecentops(op.getopnum()) recentops.add(op) if nextop: self.opt.emit_extra(nextop)
def emit_operation(self, op): if rop.returns_bool_result(op.opnum): self.getintbound(op).make_bool() self._emit_operation(op) op = self.get_box_replacement(op) if op.type == 'i': opinfo = op.get_forwarded() if opinfo is not None: assert isinstance(opinfo, IntBound) if opinfo.is_constant(): op.set_forwarded(ConstInt(opinfo.getint()))
def emit_operation(self, op): if rop.returns_bool_result(op.opnum): self.getintbound(op).make_bool() self._emit_operation(op) op = self.get_box_replacement(op) if op.type == 'i': opinfo = op.get_forwarded() if opinfo is not None: assert isinstance(opinfo, IntBound) if opinfo.is_constant(): op.set_forwarded(ConstInt(opinfo.getint()))
def optimize_default(self, op): canfold = rop.is_always_pure(op.opnum) if rop.is_ovf(op.opnum): self.postponed_op = op return if self.postponed_op: nextop = op op = self.postponed_op self.postponed_op = None canfold = nextop.getopnum() == rop.GUARD_NO_OVERFLOW else: nextop = None save = False if canfold: for i in range(op.numargs()): if self.get_constant_box(op.getarg(i)) is None: break else: # all constant arguments: constant-fold away resbox = self.optimizer.constant_fold(op) # note that INT_xxx_OVF is not done from here, and the # overflows in the INT_xxx operations are ignored self.optimizer.make_constant(op, resbox) return # did we do the exact same operation already? recentops = self.getrecentops(op.getopnum()) save = True oldop = recentops.lookup(self.optimizer, op) if oldop is not None: self.optimizer.make_equal_to(op, oldop) return # otherwise, the operation remains self.emit_operation(op) if rop.returns_bool_result(op.opnum): self.getintbound(op).make_bool() if save: recentops = self.getrecentops(op.getopnum()) recentops.add(op) if nextop: self.emit_operation(nextop)