aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2010-01-07 11:38:25 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2010-01-07 11:38:25 +0100
commitd05fe940b70e2d4153f1105d9e811951a99a1716 (patch)
treeeae6b6af50dba96cc149e50451dd37e4de0e45fc
parent2a3c437d064e6d014ebf82453ba57a02a701ede9 (diff)
downloadgcc-d05fe940b70e2d4153f1105d9e811951a99a1716.zip
gcc-d05fe940b70e2d4153f1105d9e811951a99a1716.tar.gz
gcc-d05fe940b70e2d4153f1105d9e811951a99a1716.tar.bz2
re PR tree-optimization/42157 (ICE building stage 1 libgcc: SEGV in compare_access_positions)
2010-01-07 Martin Jambor <mjambor@suse.cz> 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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree-sra.c6
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 <mjambor@suse.cz>
+
+ 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 <rth@redhat.com>
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))