summaryrefslogtreecommitdiff
path: root/peephole.c
diff options
context:
space:
mode:
authorWormHeamer2025-08-10 23:04:51 -0400
committerWormHeamer2025-08-10 23:04:51 -0400
commit60aadb12969755727709bf293e140ef9d8301d43 (patch)
tree297c202462a0ea52361d8428b50c32a6d86d12db /peephole.c
parent1fd3086b919d01eeaf12978d74e9d3e073509a2e (diff)
add peephole op(op(X,Y) | op(Y,X), X) -> op(op(X, X), Y)
Diffstat (limited to 'peephole.c')
-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))) {