|
From: Kevin K. <kev...@gm...> - 2018-12-17 23:34:18
|
I just committed and synced a new jump-threading pass to tcl-quadcode. This replaces the old 'nodesplit' pass, which in a large procedure could cause the entire optimization pipeline to rerun a great many times for a large procedure, since it would thread only one basic block at a time. (Moreover, it often faced a combinatorial explosion of threading opportunities - many more than were justified by the actual data types, because it did not detect converging pathways in the splits.) The new threading pass is the first one that I've done to require SSA deconstruction and reconstruction. For the large number of changes that the pass typically makes, it's faster and simpler simply to tear things down and put them back together again. With the new module in place, the 'renameTemps' pass, which was a thorn in the side of the compiler on large procedures (owing to a performance bug in Tcllib's 'struct::disjointset' module) can be removed. In addition, of course, the old 'nodesplit.tcl' is also no longer relevant. Donal, feel free to ignore my earlier message about addReference on values combined with NEXIST IMPURE, and returnCode on values that are FAIL+some other type. The revised jump threading separates those combined types before they get to the offending operations. (I now realize that the jump threading is *required* to compile [catch] because the failure and success paths *must* be separated until the FAIL is dismissed.) Ad astra! Kevin |