
Hi, When this function gets annotated... *def h(n): return not n* An additional block is generated. Is this something that should/can be avoided by the annotator? If this is unavoidable I would like to dive a little in the annotator simplifier to try to merge the blocks. cheers Eric

Hi Eric, On Sat, May 28, 2005 at 03:52:15PM +0200, Eric van Riet Paap wrote:
This is due to the ultimate source of the flow graph, which is the pypy/interpreter/*.py code itself. We have something called space.not_() which is not really an operation per se, but a shortcut defined in baseobjspace.py: def not_(self, w_obj): return self.wrap(not self.is_true(w_obj)) ('self' is the space here.) The self.is_true() is responsible for creating the branch in the flow graph. Looking at the generated flow graphs like you do is, I guess, a good way to detect when is_true() is used a bit too much. In this case, it should be possible to rewrite not_() without using it, but using the 'space.nonzero()' operation instead. (The difference between nonzero() and is_true() is that nonzero() is a regular operation returning a wrapped boolean, which the flow graph translates as just one line in a block; is_true() returns a real True or False and the flow graph must generate a branch, where each branch records what occurs in each of the two cases.) E.g., this looks convoluted but does the trick: def not_(self, w_obj): return self.xor(self.nonzero(w_obj), self.w_True) Armin

Hi Eric, On Sat, May 28, 2005 at 03:52:15PM +0200, Eric van Riet Paap wrote:
This is due to the ultimate source of the flow graph, which is the pypy/interpreter/*.py code itself. We have something called space.not_() which is not really an operation per se, but a shortcut defined in baseobjspace.py: def not_(self, w_obj): return self.wrap(not self.is_true(w_obj)) ('self' is the space here.) The self.is_true() is responsible for creating the branch in the flow graph. Looking at the generated flow graphs like you do is, I guess, a good way to detect when is_true() is used a bit too much. In this case, it should be possible to rewrite not_() without using it, but using the 'space.nonzero()' operation instead. (The difference between nonzero() and is_true() is that nonzero() is a regular operation returning a wrapped boolean, which the flow graph translates as just one line in a block; is_true() returns a real True or False and the flow graph must generate a branch, where each branch records what occurs in each of the two cases.) E.g., this looks convoluted but does the trick: def not_(self, w_obj): return self.xor(self.nonzero(w_obj), self.w_True) Armin
participants (2)
-
Armin Rigo
-
Eric van Riet Paap