- 论坛徽章:
- 0
|
gcc 4.7.2出现内部错误。gcc_assert (best_size != 0);
没看明白为啥。
- /* Find the largest class which has at least one register valid in
- mode INNER, and which for every such register, that register number
- plus N is also valid in OUTER (if in range) and is cheap to move
- into REGNO. Such a class must exist. */
- static enum reg_class
- find_valid_class (enum machine_mode outer ATTRIBUTE_UNUSED,
- enum machine_mode inner ATTRIBUTE_UNUSED, int n,
- unsigned int dest_regno ATTRIBUTE_UNUSED)
- {
- int best_cost = -1;
- int rclass;
- int regno;
- enum reg_class best_class = NO_REGS;
- enum reg_class dest_class ATTRIBUTE_UNUSED = REGNO_REG_CLASS (dest_regno);
- unsigned int best_size = 0;
- int cost;
- for (rclass = 1; rclass < N_REG_CLASSES; rclass++)
- {
- int bad = 0;
- int good = 0;
- for (regno = 0; regno < FIRST_PSEUDO_REGISTER - n && ! bad; regno++)
- if (TEST_HARD_REG_BIT (reg_class_contents[rclass], regno))
- {
- if (HARD_REGNO_MODE_OK (regno, inner))
- {
- good = 1;
- if (! TEST_HARD_REG_BIT (reg_class_contents[rclass], regno + n)
- || ! HARD_REGNO_MODE_OK (regno + n, outer))
- bad = 1;
- }
- }
- if (bad || !good)
- continue;
- cost = register_move_cost (outer, (enum reg_class) rclass, dest_class);
- if ((reg_class_size[rclass] > best_size
- && (best_cost < 0 || best_cost >= cost))
- || best_cost > cost)
- {
- best_class = (enum reg_class) rclass;
- best_size = reg_class_size[rclass];
- best_cost = register_move_cost (outer, (enum reg_class) rclass,
- dest_class);
- }
- }
- gcc_assert (best_size != 0);
- return best_class;
- }
复制代码 |
|