diff options
author | Michael Forney <mforney@mforney.org> | 2021-11-18 01:45:27 -0800 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2021-11-22 18:07:50 +0100 |
commit | bf153b359e9ce3ebef9bca899eb7ed5bd9045c11 (patch) | |
tree | 20857b60dfd9a0f5bb98dee40a1f4b140ba76447 /all.h | |
parent | b0f16dad64d14f36ffe235b2e9cca96aa3ce35ba (diff) | |
download | roux-bf153b359e9ce3ebef9bca899eb7ed5bd9045c11.tar.gz |
reuse previous address constants in fold()
parseref() has code to reuse address constants, but this is not done in other passes such as fold or isel. Introduce a new function newcon() which takes a Con and returns a Ref for that constant, and use this whenever creating address constants. This is necessary to fix folding of address constants when one operand is already folded. For example, in %a =l add $x, 1 %b =l add %a, 2 %c =w loadw %b %a and %b were folded to $x+1 and $x+3 respectively, but then the second add is visited again since it uses %a. This gets folded to $x+3 as well, but as a new distinct constant. This results in %b getting labeled as bottom instead of either constant, disabling the replacement of %b by a constant in subsequent instructions (such as the loadw).
Diffstat (limited to 'all.h')
-rw-r--r-- | all.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/all.h b/all.h index f49b4ef..98b77dd 100644 --- a/all.h +++ b/all.h @@ -431,6 +431,7 @@ int clsmerge(short *, short); int phicls(int, Tmp *); Ref newtmp(char *, int, Fn *); void chuse(Ref, int, Fn *); +Ref newcon(Con *, Fn *); Ref getcon(int64_t, Fn *); int addcon(Con *, Con *); void blit(Ref, uint, Ref, uint, Fn *); |