From bf153b359e9ce3ebef9bca899eb7ed5bd9045c11 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Thu, 18 Nov 2021 01:45:27 -0800 Subject: 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). --- parse.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'parse.c') diff --git a/parse.c b/parse.c index 104ca1d..6e22e1f 100644 --- a/parse.c +++ b/parse.c @@ -381,7 +381,6 @@ static Ref parseref() { Con c; - int i; memset(&c, 0, sizeof c); switch (next()) { @@ -405,14 +404,7 @@ parseref() c.type = CAddr; c.label = intern(tokval.str); Look: - for (i=0; incon; i++) - if (curf->con[i].type == c.type - && curf->con[i].bits.i == c.bits.i - && curf->con[i].label == c.label) - return CON(i); - vgrow(&curf->con, ++curf->ncon); - curf->con[i] = c; - return CON(i); + return newcon(&c, curf); default: return R; } -- cgit v1.2.3