From d05fe940b70e2d4153f1105d9e811951a99a1716 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Thu, 7 Jan 2010 11:38:25 +0100 Subject: [PATCH] re PR tree-optimization/42157 (ICE building stage 1 libgcc: SEGV in compare_access_positions) 2010-01-07 Martin Jambor PR tree-optimization/42157 * tree-sra.c (compare_access_positions): Stabilize sort if both accesses have integer types, return zero immediately if they are the same. From-SVN: r155689 --- gcc/ChangeLog | 7 +++++++ gcc/tree-sra.c | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e8aa64b..62fb301 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-01-07 Martin Jambor + + PR tree-optimization/42157 + * tree-sra.c (compare_access_positions): Stabilize sort if both + accesses have integer types, return zero immediately if they are the + same. + 2010-01-06 Richard Henderson PR middle-end/41883 diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index f0e874f..ebb40c4 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1110,8 +1110,10 @@ compare_access_positions (const void *a, const void *b) if (f1->size == f2->size) { + if (f1->type == f2->type) + return 0; /* Put any non-aggregate type before any aggregate type. */ - if (!is_gimple_reg_type (f1->type) + else if (!is_gimple_reg_type (f1->type) && is_gimple_reg_type (f2->type)) return 1; else if (is_gimple_reg_type (f1->type) @@ -1131,7 +1133,7 @@ compare_access_positions (const void *a, const void *b) /* Put the integral type with the bigger precision first. */ else if (INTEGRAL_TYPE_P (f1->type) && INTEGRAL_TYPE_P (f2->type)) - return TYPE_PRECISION (f1->type) > TYPE_PRECISION (f2->type) ? -1 : 1; + return TYPE_PRECISION (f2->type) - TYPE_PRECISION (f1->type); /* Put any integral type with non-full precision last. */ else if (INTEGRAL_TYPE_P (f1->type) && (TREE_INT_CST_LOW (TYPE_SIZE (f1->type)) -- 2.7.4