properly detect ssa form

Previously, we would skip ssa construction when
a temporary has a single definition.  This is
only part of the ssa invariant: we must also
check that all uses are dominated by the single
definition.  The new code does this.

In fact, qbe does not store all the dominators
for a block, so instead of walking the idom
linked list we use a rough heuristic and declare
conservatively that B0 dominates B1 when one of
the two conditions is true:

  a. B0 is the start block
  b. B0 is B1

Some measurements on a big file from Michael
Forney show that the code is still as fast as
before this patch.
This commit is contained in:
Quentin Carbonneaux 2019-04-11 19:36:13 +02:00
parent d84f5fcbb7
commit 81da1cdebb
3 changed files with 19 additions and 6 deletions

3
all.h
View file

@ -248,7 +248,7 @@ struct Use {
UIns,
UJmp,
} type;
int bid;
uint bid;
union {
Ins *ins;
Phi *phi;
@ -279,6 +279,7 @@ struct Alias {
struct Tmp {
char name[NString];
uint bid; /* id of a defining block */
Use *use;
uint ndef, nuse;
uint cost;