diff options
| author | WormHeamer | 2025-08-10 23:04:51 -0400 |
|---|---|---|
| committer | WormHeamer | 2025-08-10 23:04:51 -0400 |
| commit | 60aadb12969755727709bf293e140ef9d8301d43 (patch) | |
| tree | 297c202462a0ea52361d8428b50c32a6d86d12db | |
| parent | 1fd3086b919d01eeaf12978d74e9d3e073509a2e (diff) | |
add peephole op(op(X,Y) | op(Y,X), X) -> op(op(X, X), Y)
| -rw-r--r-- | peephole.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -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))) { |
