------- Comment #8 from rguenth at gcc dot gnu dot org 2009-12-11 23:05 ------- I think
/* Put the integral type with the bigger precision first. */ else if (INTEGRAL_TYPE_P (f1->type) && INTEGRAL_TYPE_P (f2->type) && TYPE_PRECISION (f1->type) != TYPE_PRECISION (f2->type)) return TYPE_PRECISION (f1->type) > TYPE_PRECISION (f2->type) ? -1 : 1; makes more sense. But still if both types are equal we still do not stabilize the sort. Note /* Put any integral type with non-full precision last. */ else if (INTEGRAL_TYPE_P (f1->type) && (TREE_INT_CST_LOW (TYPE_SIZE (f1->type)) != TYPE_PRECISION (f1->type))) return 1; else if (INTEGRAL_TYPE_P (f2->type) && (TREE_INT_CST_LOW (TYPE_SIZE (f2->type)) != TYPE_PRECISION (f2->type))) return -1; isn't stable either. In fact - can't we have two exactly the same accesses in the array? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42157