shithub: scc

Download patch

ref: eb5bf586bfe6b26995bb2ca24f13eee8cfb268ca
parent: 022b66c883b41558202c1e602ee98c44e8c6a146
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Thu Jul 23 08:13:11 EDT 2015

Add simplify() to all binary operators

--- a/cc1/code.c
+++ b/cc1/code.c
@@ -425,6 +425,45 @@
 				goto division_by_0;
 			FOLDINT(sym, ls, rs, %);
 			break;
+                case OSHL:
+			FOLDINT(sym, ls, rs, <<);
+			break;
+                case OSHR:
+			FOLDINT(sym, ls, rs, >>);
+			break;
+		case OLT:
+			FOLDINT(sym, ls, rs, <);
+			break;
+		case OGT:
+			FOLDINT(sym, ls, rs, >);
+			break;
+		case OGE:
+			FOLDINT(sym, ls, rs, >=);
+			break;
+		case OLE:
+			FOLDINT(sym, ls, rs, <=);
+			break;
+		case OEQ:
+			FOLDINT(sym, ls, rs, ==);
+			break;
+		case ONE:
+			FOLDINT(sym, ls, rs, !=);
+			break;
+		case OBAND:
+			FOLDINT(sym, ls, rs, &);
+			break;
+		case OBEXOR:
+			FOLDINT(sym, ls, rs, ^);
+			break;
+		case OBOR:
+			FOLDINT(sym, ls, rs, |);
+			break;
+		case OAND:
+			FOLDINT(sym, ls, rs, &&);
+			break;
+		case OOR:
+			FOLDINT(sym, ls, rs, ||);
+			break;
 		default:
 			abort();
 		}
--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -705,6 +705,7 @@
 		}
 		next();
 		np = integerop(op, np, add());
+		np = simplify(np);
 	}
 }
 
@@ -725,6 +726,7 @@
 		}
 		next();
 		np = compare(op, np, shift());
+		np = simplify(np);
 	}
 }
 
@@ -743,6 +745,7 @@
 		}
 		next();
 		np = compare(op, np, relational());
+		np = simplify(np);
 	}
 }
 
@@ -754,7 +757,7 @@
 	np = eq();
 	while (accept('&'))
 		np = integerop(OBAND, np, eq());
-	return np;
+	return simplify(np);
 }
 
 static Node *
@@ -765,7 +768,7 @@
 	np = bit_and();
 	while (accept('^'))
 		np = integerop(OBXOR,  np, bit_and());
-	return np;
+	return simplify(np);
 }
 
 static Node *
@@ -776,7 +779,7 @@
 	np = bit_xor();
 	while (accept('|'))
 		np = integerop(OBOR, np, bit_xor());
-	return np;
+	return simplify(np);
 }
 
 static Node *
@@ -787,7 +790,7 @@
 	np = bit_or();
 	while (accept(AND))
 		np = logic(OAND, np, bit_or());
-	return np;
+	return simplify(np);
 }
 
 static Node *
@@ -798,7 +801,7 @@
 	np = and();
 	while (accept(OR))
 		np = logic(OOR, np, and());
-	return np;
+	return simplify(np);
 }
 
 static Node *