This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Mainline broken on alpha and x86-64. SPEC2000's eon does not build.


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.  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]