shithub: scc

Download patch

ref: 9f947ff3f1e8e418d43e9f201d2f293d3187a3a0
parent: f90d96846e1b756b01cb983b9e117cfb03dd755f
author: Roberto E. Vargas Caballero <[email protected]>
date: Mon Nov 1 05:29:26 EDT 2021

cc1: Remove wrong cast simpleifications

Casts cannot be collapse, because every cast can modify
the value (truncating values). The correct behaviour
is to call foldcast() and let it to do at compilation
time the work that should be done at execution time.

--- a/src/cmd/cc/cc1/fold.c
+++ b/src/cmd/cc/cc1/fold.c
@@ -318,7 +318,7 @@
 	Type *newtp = np->type, *oldtp = l->type;
 	Symbol aux, *sym, *osym = l->sym;
 
-	if (!(l->flags & NCONST))
+	if ((l->flags & NCONST) == 0)
 		return np;
 
 	switch (newtp->op) {
@@ -381,14 +381,7 @@
 		freetree(np);
 		return l;
 	case OCAST:
-		if (op != OCAST)
-			return foldcast(np, l);
-		/* TODO: This is wrong: (float)(int) 7.2 */
-		DBG("FOLD unary collapse %d", np->op);
-		np->left = l->left;
-		l->left = NULL;
-		freetree(l);
-		return np;
+		return foldcast(np, l);
 	case OSNEG:
 	case OCPL:
 		if (op != np->op)