This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[lto] implement awful types_compatible_p hack
- From: Nathan Froyd <froydnj at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: zadeck at naturalbridge dot com
- Date: Sat, 22 Dec 2007 11:08:32 -0800
- Subject: [lto] implement awful types_compatible_p hack
I could spend several pages convincing y'all I know this is a horrible,
awful hack.
Instead, I will state the root issue: we need to merge types across
translation units. Otherwise--this was the example that broke for
me--we wind up with something like (&foo)->bar from forwprop, which IIUC
is equivalent to (*&foo).bar and GCC is unable to optimize away the *&
because types don't match. We eventually ICE. I understand the
incremental compiler inserts VIEW_CONVERT_EXPRs where necessary to avoid
situations like this.
I will fix this. But not right now; it requires more cycles than I can
spare at the moment.
253.perlbmk now compiles (with -fwrapv) and runs properly. This leaves
a miscompile of 176.gcc as the only remaining C SPECint benchmark that
LTO doesn't work with.
Committed to the LTO branch.
-Nathan
* lto-lang.c (lto_types_compatible_p): New function.
(LANG_HOOKS_TYPES_COMPATIBLE_P): Define.
Index: gcc/lto/lto-lang.c
===================================================================
--- gcc/lto/lto-lang.c (revision 131119)
+++ gcc/lto/lto-lang.c (working copy)
@@ -452,6 +452,31 @@ lto_builtin_function (tree decl)
return decl;
}
+static int
+lto_types_compatible_p (tree type1, tree type2)
+{
+ if (TREE_CODE (type1) == RECORD_TYPE
+ && TREE_CODE (type2) == RECORD_TYPE)
+ {
+ /* Check structural equality. */
+ tree f1, f2;
+ int success = 1;
+
+ for (f1 = TYPE_FIELDS (type1), f2 = TYPE_FIELDS (type2);
+ f1 && f2;
+ f1 = TREE_CHAIN (f1), f2 = TREE_CHAIN (f2))
+ {
+ if (TREE_CODE (f1) != TREE_CODE (f2)
+ || DECL_NAME (f1) != DECL_NAME (f2))
+ break;
+ }
+
+ return f1 && f2 ? 0 : 1;
+ }
+
+ return TYPE_MAIN_VARIANT (type1) == TYPE_MAIN_VARIANT (type2);
+}
+
static void
lto_register_builtin_type (tree type, const char *name)
{
@@ -575,6 +600,8 @@ lto_init (void)
#define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION tree_rest_of_compilation
#undef LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS
#define LANG_HOOKS_REDUCE_BIT_FIELD_OPERATIONS true
+#undef LANG_HOOKS_TYPES_COMPATIBLE_P
+#define LANG_HOOKS_TYPES_COMPATIBLE_P lto_types_compatible_p
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;