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:
parent
d84f5fcbb7
commit
81da1cdebb
3 changed files with 19 additions and 6 deletions
3
all.h
3
all.h
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue