find_valid_class() 内部错误
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, regno))
{
if (HARD_REGNO_MODE_OK (regno, inner))
{
good = 1;
if (! TEST_HARD_REG_BIT (reg_class_contents, 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 > best_size
&& (best_cost < 0 || best_cost >= cost))
|| best_cost > cost)
{
best_class = (enum reg_class) rclass;
best_size = reg_class_size;
best_cost = register_move_cost (outer, (enum reg_class) rclass,
dest_class);
}
}
gcc_assert (best_size != 0);
return best_class;
}
reload.c中的代码,是不是因为你的md文件写的有问题,导致的错误?如果是的话,最好是从源头找问题。 问题解决。TARGET_FUNCTION_VALUE函数没有正确实现MODE_COMPLEX_FLOAT
页:
[1]