Patchwork Another LTO type merging cleanup

login
register
mail settings
Submitter Richard Guenther
Date May 30, 2011, 2:53 p.m.
Message ID <alpine.LNX.2.00.1105301652330.810@zhemvz.fhfr.qr>
Download mbox | patch
Permalink /patch/97920/
State New
Headers show

Comments

Richard Guenther - May 30, 2011, 2:53 p.m.
This structures field and union type member comparison in a way to
make obvious which comparisons are for field-decls and which are
for the rest.

LTO Profile-bootstrapped and tested on x86_64-unknown-linux-gnu,
applied to trunk.

Richard.

2011-05-30  Richard Guenther  <rguenther@suse.de>

	* gimple.c (gimple_types_compatible_p_1): Compare record
	and union type members properly.

Patch

Index: gcc/gimple.c
===================================================================
--- gcc/gimple.c	(revision 174434)
+++ gcc/gimple.c	(working copy)
@@ -3772,10 +3772,16 @@  gimple_types_compatible_p_1 (tree t1, tr
 	     f1 && f2;
 	     f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
 	  {
-	    /* The fields must have the same name, offset and type.  */
+	    /* Different field kinds are not compatible.  */
+	    if (TREE_CODE (f1) != TREE_CODE (f2))
+	      goto different_types;
+	    /* Field decls must have the same name and offset.  */
+	    if (TREE_CODE (f1) == FIELD_DECL
+		&& (DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
+		    || !gimple_compare_field_offset (f1, f2)))
+	      goto different_types;
+	    /* All entities should have the same name and type.  */
 	    if (DECL_NAME (f1) != DECL_NAME (f2)
-		|| DECL_NONADDRESSABLE_P (f1) != DECL_NONADDRESSABLE_P (f2)
-		|| !gimple_compare_field_offset (f1, f2)
 		|| !gtc_visit (TREE_TYPE (f1), TREE_TYPE (f2),
 			       state, sccstack, sccstate, sccstate_obstack))
 	      goto different_types;