Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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()))
Пример #4
0
 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()))
Пример #5
0
    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)