[Cython] Control flow graph

Vitja Makarov vitja.makarov at gmail.com
Wed Feb 23 06:31:45 CET 2011


2011/2/22 Stefan Behnel <stefan_ml at behnel.de>:
> Vitja Makarov, 20.02.2011 18:23:
>>
>> 2011/2/16 Vitja Makarov:
>>>
>>> Hmm... both python and codespeaks in the thread
>
> Yes, we should keep it to cython-devel only. Sorry for mixing it up.
>
>
>>> Here is my commit it's mostly broken now but anyway
>>>
>>> https://github.com/vitek/cython/commit/5579b23c3c1c06981331b6427a73e5cb19980b8a
>
> Flow control support is large enough to merit its own module. Not sure how
> 'smart' git is here, but you can always keep the history by explicitly
> copying ParseTreeTransforms.py to FlowControl.py and removing the unrelated
> sections from both files.
>

Ok.

> You are duplicating some code from the type inferencer. We might want to
> clean that up at some point. However, given that flow control analysis will
> allow us to improve the type inferencer, I think it's best to keep this code
> in the FCA part.
>

Yes, I think it could replace MarkAssignments transform later.
Unreachable code could be delete there too.

>
>> I've update stuff:
>>  - algo for finding definitions
>>  - warnings for uninitialized and may be uninitialised use
>>  - few test cases
>
> That looks very nice so far. Any idea how well it scales?
>

"Usually iterative algorithm takes no more then 5 iterations"

For ExprNodes.py max number is 15 while avg is about 3

About execution time:

ExprNodes.py compilation with c/f enabled takes 10.120 ms, w/o 9.325,
~10% slow down.
-O flag could be introduced but I don't think that's a good idea.

Should later try to execute cython compiled code.

>
>> Trying to compile ParseTreeTransforms.py I've found this for example:
>>
>> warning: Cython/Compiler/ParseTreeTransforms.py:1182:27: Variable
>> 'template' may be used uninitialized
>>
>>     def create_Property(self, entry):
>>         if entry.visibility == 'public':
>>             if entry.type.is_pyobject:
>>                 template = self.basic_pyobject_property
>>             else:
>>                 template = self.basic_property
>>         elif entry.visibility == 'readonly':
>>             template = self.basic_property_ro
>>         property = template.substitute({
>>                 u"ATTR": ExprNodes.AttributeNode(pos=entry.pos,
>>
>> obj=ExprNodes.NameNode(pos=entry.pos, name="self"),
>>                                                  attribute=entry.name),
>>             }, pos=entry.pos).stats[0]
>
> Ok, I guess that code generally works, but it's better to get rid of the
> code smell.
>

Might be used warning should be disabled by default, because algorithm
isn't smart enough:

a = 1
if (a): b = 1
if (a): print b

See also:
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wuninitialized-325

-- 
vitja.


More information about the cython-devel mailing list