if (l < r) { int t = l; l = r; r = t; }
    int or_rec(int l, int r) {        OpCache2Entry entry;        int res;        if (l == r) return l;        if (ISONE(l) || ISONE(r)) return 1;        if (ISZERO(l)) return r;        if (ISZERO(r)) return l;        entry = orcache.lookup(ORHASH(l, r));        if ((res = orcache.get(entry, l, r)) >= 0) {            return res;        }        int LEVEL_l = LEVEL(l);        int LEVEL_r = LEVEL(r);        if (LEVEL_l == LEVEL_r) {            PUSHREF(or_rec(LOW(l), LOW(r)));            PUSHREF(or_rec(HIGH(l), HIGH(r)));            res = bdd_makenode(LEVEL_l, READREF(2), READREF(1));        } else if (LEVEL_l < LEVEL_r) {            PUSHREF(or_rec(LOW(l), r));            PUSHREF(or_rec(HIGH(l), r));            res = bdd_makenode(LEVEL_l, READREF(2), READREF(1));        } else {            PUSHREF(or_rec(l, LOW(r)));            PUSHREF(or_rec(l, HIGH(r)));            res = bdd_makenode(LEVEL_r, READREF(2), READREF(1));        }        POPREF(2);        orcache.set(entry, l, r, res);        return res;    }