extern void abort(void);

typedef unsigned long HARD_REG_SET[2];
HARD_REG_SET reg_class_contents[2];

struct du_chain {
    struct du_chain *next_use;
    int cl;
};

void __attribute__((noinline))
merge_overlapping_regs(HARD_REG_SET *p) {
    if ((*p)[0] != -1 || (*p)[1] != -1)
        abort();
}

void __attribute__((noinline))
regrename_optimize(struct du_chain *this) {
    HARD_REG_SET this_unavailable;
    unsigned long *scan_fp_;
    int n_uses;
    struct du_chain *last;

    this_unavailable[0] = 0;
    this_unavailable[1] = 0;

    n_uses = 0;
    for (last = this; last->next_use; last = last->next_use) {
        scan_fp_ = reg_class_contents[last->cl];
        n_uses++;
        this_unavailable[0] |= ~scan_fp_[0];
        this_unavailable[1] |= ~scan_fp_[1];
    }
    if (n_uses < 1)
        return;

    scan_fp_ = reg_class_contents[last->cl];
    this_unavailable[0] |= ~scan_fp_[0];
    this_unavailable[1] |= ~scan_fp_[1];

    merge_overlapping_regs(&this_unavailable);
}

int main() {
    struct du_chain du1 = {0, 0};
    struct du_chain du0 = {&du1, 1};
    reg_class_contents[0][0] = -1;
    reg_class_contents[0][1] = -1;
    reg_class_contents[1][0] = 0;
    reg_class_contents[1][1] = 0;
    regrename_optimize(&du0);
    return 0;
}
