From 60aadb12969755727709bf293e140ef9d8301d43 Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Sun, 10 Aug 2025 23:04:51 -0400 Subject: add peephole op(op(X,Y) | op(Y,X), X) -> op(op(X, X), Y) --- peephole.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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))) { -- cgit v1.2.3