This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Mainline broken on alpha and x86-64. SPEC2000's eon does not build.
- From: Steven Bosscher <stevenb at suse dot de>
- To: Paolo Bonzini <bonzini at gnu dot org>, Jan Hubicka <jh at suse dot cz>
- Cc: ebotcazou at act-europe dot fr, mckinlay at redhat dot com,jlquinn at optonline dot net, "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>,dnovillo at redhat dot com
- Date: Thu, 27 May 2004 17:51:31 +0200
- Subject: Re: Mainline broken on alpha and x86-64. SPEC2000's eon does not build.
- Organization: SUSE Labs
- References: <1085667394.9713.217.camel@localhost.localdomain> <20040527144428.GE26500@kam.mff.cuni.cz> <40B60C9D.2080309@gnu.org>
On Thursday 27 May 2004 17:43, Paolo Bonzini wrote:
> I've got a lot of failures everywhere but in C, and it seems unlikely
> that the cause is the floating-point comparison patch I've been
> discussing with Roger. I'm trying to apply that patch to a 2-days old
> tree and seeing what happens (though I'm leaving the office soon and
> will be able to look at the results only tomorrow morning).
It's EH related, I somehow overlooked the fact that tree-eh.c
also builds a SWITCH_EXPR for try-finally, and the label vector
for that switch isn't necessarily sorted.
I am trying the attached patch. You might too.
Gr.
Steven
Index: gimplify.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/gimplify.c,v
retrieving revision 2.6
diff -c -3 -p -r2.6 gimplify.c
*** gimplify.c 26 May 2004 22:36:49 -0000 2.6
--- gimplify.c 27 May 2004 15:46:51 -0000
*************** compare_case_labels (const void *p1, con
*** 994,999 ****
--- 994,1016 ----
return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2));
}
+ /* Sort the case labels in LABEL_VEC in ascending order. */
+
+ void
+ sort_case_labels (tree label_vec)
+ {
+ size_t len = TREE_VEC_LENGTH (label_vec);
+ tree default_case = TREE_VEC_ELT (label_vec, len - 1);
+
+ if (CASE_LOW (default_case))
+ /* The last label in the vector should be the default case
+ but it is not. */
+ abort ();
+
+ qsort (&TREE_VEC_ELT (label_vec, 0), len - 1, sizeof (tree),
+ compare_case_labels);
+ }
+
/* Gimplify a SWITCH_EXPR, and collect a TREE_VEC of the labels it can
branch to. */
*************** gimplify_switch_expr (tree *expr_p, tree
*** 1057,1068 ****
else
*expr_p = SWITCH_BODY (switch_expr);
- qsort (&VARRAY_TREE (labels, 0), len, sizeof (tree),
- compare_case_labels);
for (i = 0; i < len; ++i)
TREE_VEC_ELT (label_vec, i) = VARRAY_TREE (labels, i);
TREE_VEC_ELT (label_vec, len) = default_case;
SWITCH_BODY (switch_expr) = NULL;
}
else if (!SWITCH_LABELS (switch_expr))
--- 1074,1085 ----
else
*expr_p = SWITCH_BODY (switch_expr);
for (i = 0; i < len; ++i)
TREE_VEC_ELT (label_vec, i) = VARRAY_TREE (labels, i);
TREE_VEC_ELT (label_vec, len) = default_case;
+ sort_case_labels (label_vec);
+
SWITCH_BODY (switch_expr) = NULL;
}
else if (!SWITCH_LABELS (switch_expr))
Index: tree-cfg.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-cfg.c,v
retrieving revision 2.4
diff -c -3 -p -r2.4 tree-cfg.c
*** tree-cfg.c 26 May 2004 22:36:49 -0000 2.4
--- tree-cfg.c 27 May 2004 15:47:10 -0000
*************** find_case_label_for_value (tree switch_e
*** 2051,2057 ****
/* Cache the result of comparing CASE_LOW and val. */
cmp = tree_int_cst_compare (CASE_LOW (t), val);
! if (cmp > 0)
high = i;
else
low = i;
--- 2051,2057 ----
/* Cache the result of comparing CASE_LOW and val. */
cmp = tree_int_cst_compare (CASE_LOW (t), val);
! if (cmp >= 0)
high = i;
else
low = i;
Index: tree-eh.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-eh.c,v
retrieving revision 2.1
diff -c -3 -p -r2.1 tree-eh.c
*** tree-eh.c 13 May 2004 06:39:48 -0000 2.1
--- tree-eh.c 27 May 2004 15:47:10 -0000
*************** lower_try_finally_switch (struct leh_sta
*** 1200,1207 ****
replace_goto_queue (tf);
last_case_index += nlabels;
! /* Make sure that we have a default label, as one is required. */
CASE_LOW (last_case) = NULL;
/* Need to link switch_stmt after running replace_goto_queue due
to not wanting to process the same goto stmts twice. */
--- 1200,1211 ----
replace_goto_queue (tf);
last_case_index += nlabels;
! /* Make sure that the last case is the default label, as one is required.
! Then sort the labels, which is also required in GIMPLE. */
! last_case = TREE_VEC_ELT (case_label_vec,
! TREE_VEC_LENGTH (case_label_vec) - 1);
CASE_LOW (last_case) = NULL;
+ sort_case_labels (case_label_vec);
/* Need to link switch_stmt after running replace_goto_queue due
to not wanting to process the same goto stmts twice. */
Index: tree.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree.h,v
retrieving revision 1.500
diff -c -3 -p -r1.500 tree.h
*** tree.h 26 May 2004 23:22:04 -0000 1.500
--- tree.h 27 May 2004 15:47:13 -0000
*************** extern tree create_artificial_label (voi
*** 3675,3680 ****
--- 3675,3681 ----
extern void gimplify_function_tree (tree);
extern const char *get_name (tree);
extern tree unshare_expr (tree);
+ extern void sort_case_labels (tree);
/* If KIND=='I', return a suitable global initializer (constructor) name.
If KIND=='D', return a suitable global clean-up (destructor) name. */