ref: d43b806538f0c3132c4d8fd12aeb57fddc263040
parent: 731e6ac62d55209f4635d4422691e7fa8aa92d54
author: Ori Bernstein <ori@eigenstate.org>
date: Sun Mar 15 11:08:04 EDT 2020
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
--- a/sys/src/cmd/cc/com.c
+++ b/sys/src/cmd/cc/com.c
@@ -1018,6 +1018,8 @@
* 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 @@
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);
--
⑨