Hoopl: improve postorder calculation
authorMichal Terepeta <michal.terepeta@gmail.com>
Mon, 19 Mar 2018 15:58:54 +0000 (11:58 -0400)
committerBen Gamari <ben@smart-cactus.org>
Mon, 19 Mar 2018 16:05:11 +0000 (12:05 -0400)
commitbbcea13af845d41a9d51a932476eb841ba182ea5
treed846f7d73f60e2bb5865a4bc258b986e63c8f3b7
parent0db0e46c40a3a2af71f23033aa09a142d43b8538
Hoopl: improve postorder calculation

- Fix the naming and comments to indicate that we are calculating
  *reverse* postorder (and not the standard postorder).

- Rewrite the calculation to avoid CPS code. I found it fairly
  difficult to understand and the new one seems faster (according to
  nofib, decreases compiler allocations by 0.2%)

- Remove `LabelsPtr`, which seems unnecessary and could be *really*
  confusing. For instance, previously:
  `postorder_dfs_from <block with label X>`
  and
  `postorder_dfs_from <label X>`
  would actually mean quite different things (and give different
  results).

- Change the `Dataflow` module to always use entry of the graph for
  reverse postorder calculation. This should be the only change in
  behavior of this commit.

  Previously, if the caller provided initial facts for some of the
  labels, we would use those labels for our postorder calculation.
  However, I don't think that's correct in general - if the initial
  facts did not contain the entry of the graph, we would never analyze
  the blocks reachable from the entry but unreachable from the labels
  provided with the initial facts. It seems that the only analysis that
  used this was proc-point analysis, which I think would always include
  the entry block (so I don't think there's any bug due to this).

Signed-off-by: Michal Terepeta <michal.terepeta@gmail.com>
Test Plan: ./validate

Reviewers: bgamari, simonmar

Reviewed By: simonmar

Subscribers: rwbarton, thomie, carter

Differential Revision: https://phabricator.haskell.org/D4464
14 files changed:
compiler/cmm/CmmCommonBlockElim.hs
compiler/cmm/CmmContFlowOpt.hs
compiler/cmm/CmmLayoutStack.hs
compiler/cmm/CmmProcPoint.hs
compiler/cmm/CmmSink.hs
compiler/cmm/CmmUtils.hs
compiler/cmm/Hoopl/Dataflow.hs
compiler/cmm/Hoopl/Graph.hs
compiler/cmm/PprCmm.hs
testsuite/tests/cmm/Makefile [new file with mode: 0644]
testsuite/tests/cmm/should_run/HooplPostorder.hs [new file with mode: 0644]
testsuite/tests/cmm/should_run/HooplPostorder.stdout [new file with mode: 0644]
testsuite/tests/cmm/should_run/Makefile [new file with mode: 0644]
testsuite/tests/cmm/should_run/all.T [new file with mode: 0644]