--- Begin Message ---
I submitted two pull requests fixing bugs in the libpcap optimizer (#972 and 
#976).  Both proposed patches are relatively narrow hacks to address specific 
bugs (links [1] and [2] below).  I'm writing here because it appears both bugs 
are specific instances of a broader issue that can be resolved with a larger 
restructuring of the optimzier.  I have mocked up a patch with such a larger 
restructuring of the optimizer's looping structure.  See 
https://github.com/the-tcpdump-group/libpcap/compare/master...tenarchits:2020-recalculate-cfg

Currently opt_loop builds a series of data structures related to the control 
flow graph (block levels, dominators, use/def information, edge dominators, 
etc.) and then calls opt_blks which walks through the control graph calling 
opt_blk on each block to optimize.  The issue is that individual optimizations 
to one block or statement may make alterations that render the computed data 
structures stale.  The next optimization may then be relying on stale data.  In 
the bug in link [1] below, or_pullup rearranges control flow to invalidate the 
calculations made by find_dom.  The next call to or_pullup or and_pullup may 
rely on stale data.  In the bug in link [2]  below, opt_deadstore deletes 
instructions impacting the structures computed by find_ud, which may impact 
optimization of the of the next block.

First, my patch uses setjmp/longjmp to jump back to the calculation of the 
control flow graph-related data structures in opt_loop any time an optimization 
is made that invalidates any of the computed structures.  Obviously, a more 
finegrained recalculation would be preferable, but I believe this approach 
prioritizes correctness at a reasonable performance penalty.

Second, my patch restructures the control flow in opt_loop.  Currently, 
opt_loop runs opt_blks repeatedly until a fixed point is reached.  It is first 
run with do_stmts=false to find a fixed point and then with do_stmts=true to 
find a fixed point.  With the patch, opt_loop alternates between running 
opt_blks with do_stmts=false and running opt_blks with do_stmts=true until a 
fixed point is reached.  Thus first there is a recalculation of the control 
flow graph data structures, then a pass of opt_blks with do_stmts=false and 
then a pass of opt_blks with do_stmts=true.

I hope these observations and this proposal is useful.  I welcome any feedback 
for improvements to this patch or suggestions for alternate approaches.

I have also mocked a patch adding tests to the tcpdump project reflecting these 
two bugs.  Please let me know if it would helpful for me to create a pull 
request for these tests. See [3].

Links

[1] https://github.com/the-tcpdump-group/libpcap/issues/945
[2] https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=144325
[3] 
https://github.com/the-tcpdump-group/tcpdump/compare/master...tenarchits:2020-optimizer-tests

Regards,

 -- Archit

--- End Message ---
_______________________________________________
tcpdump-workers mailing list
tcpdump-workers@lists.tcpdump.org
https://lists.sandelman.ca/mailman/listinfo/tcpdump-workers

Reply via email to