diff options
author | Ori Bernstein <ori@eigenstate.org> | 2020-03-15 15:08:04 -0700 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2020-03-15 15:08:04 -0700 |
commit | 52dc943702a8f7815546e76286b153c3813e1db0 (patch) | |
tree | 8c74ce293300effa75ae72712eff14bd3d326743 | |
parent | 5bc9b0c3cac34864d479c099283793ec4ae5565e (diff) | |
download | plan9front-52dc943702a8f7815546e76286b153c3813e1db0.tar.xz |
fix ccom idempotency
ccom may be called multiple times on the same
node, via 'goto loop' calls from the commute
label, OADD, and a few other places.
Casts to void could null out the LHS of the
node, which would cause the compiler to crash
if the cast was revisited due to one of these
cases, because we tried frobbing n->left.
Now, if n->left is nil, we just return.w
-rw-r--r-- | sys/src/cmd/cc/com.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/src/cmd/cc/com.c b/sys/src/cmd/cc/com.c index 49fcefd1a..6dfc7d421 100644 --- a/sys/src/cmd/cc/com.c +++ b/sys/src/cmd/cc/com.c @@ -1018,6 +1018,8 @@ if(debug['y']) prtree(n, "final"); * remove some zero operands * remove no op casts * evaluate constants + * Note: ccom may be called on the same node + * multiple times. */ void ccom(Node *n) @@ -1078,8 +1080,9 @@ loop: if(n->type == types[TVOID] && !side(l)){ n->left = Z; n->type = T; - break; } + if(n->left == Z) + break; if(castucom(n)) warn(n, "32-bit unsigned complement zero-extended to 64 bits"); ccom(l); |