| 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; |
| } |