blackoil 发表于 2013-12-04 20:44

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

EricFisher 发表于 2013-12-05 10:58

reload.c中的代码,是不是因为你的md文件写的有问题,导致的错误?如果是的话,最好是从源头找问题。

blackoil 发表于 2013-12-06 00:34

问题解决。TARGET_FUNCTION_VALUE函数没有正确实现MODE_COMPLEX_FLOAT
页: [1]
查看完整版本: find_valid_class() 内部错误