summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--peephole.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/peephole.c b/peephole.c
index c5f7115..9f5d51a 100644
--- a/peephole.c
+++ b/peephole.c
@@ -319,6 +319,7 @@ Node *node_idealize(Node *n, Proc *p, Lexer *l) {
return NODE(n->op, CDR(n), CAR(n));
}
+ /* op(phi(C, A, B), phi(C, B, A)) -> op(A, B) */
if (T(CAR(n), N_PHI) && T(CDR(n), N_PHI) && CTRL(CAR(n)) == CTRL(CDR(n))
&& (node_equiv(CADR(n), CDAR(n)) && node_equiv(CAAR(n), CDDR(n)))) {
return OP(CAAR(n), CADR(n));
@@ -330,6 +331,14 @@ Node *node_idealize(Node *n, Proc *p, Lexer *l) {
if (!T(CAR(n), n->op) && T(CDR(n), n->op)
&& C(CAR(n), CDAR(n))) return OP(CDR(n), CAR(n));
+ /* op(op(X,Y) | op(Y,X), X) -> op(op(X, X), Y) */
+ if (T(CAR(n), n->op)) {
+ int leq = node_equiv(CAAR(n), CDR(n));
+ int req = node_equiv(CADR(n), CDR(n));
+ if (leq && !req) return OP(OP(CDR(n), CDR(n)), CADR(n));
+ if (req && !leq) return OP(OP(CDR(n), CDR(n)), CAAR(n));
+ }
+
/* op(op(X,Y), op(Z, lit)) -> op(op(X, op(Y, Z)), lit) */
if (T2(CAR(n), CDR(n), n->op) && T(CDDR(n), N_LIT)
&& C(CAAR(n), CDAR(n)) && C(CAR(n), CDR(n))) {