Hello!

The problem was that exception_receiver pattern recorded a stack slot
that referred to virtual-stack-vars. Recent changes moved generation
of exception landing pads after virtuals were instantiated, so in
bbpart pass we emitted:

(insn 262 266 263 51 (unspec_volatile [
            (mem/c:DI (plus:DI (reg/f:DI 65 virtual-stack-vars)
                    (const_int 16 [0x10])) [0 S8 A64])
        ] UNSPECV_EHR) 278 {*exception_receiver_2}
     (nil))

Later passes choked on uninstantiated register.

Attached patch defines TARGET_INSTANTIATE_DECLS to also instantiate
registers in saved stack slot address.

2011-08-06  Uros Bizjak  <ubiz...@gmail.com>

        PR target/50001
        * config/alpha/alpha.c (alpha_instantiate_decls): New function.
        (TARGET_INSTANTIATE_DECLS): New define.

Patch was bootstrapped and regtested on alphaev68-pc-linux-gnu, where
fixes g++.dg/tree-prof/partition1.C ICEs in the testsuite.

Patch was committed to SVN mainline, will be also committed to release branches.

Uros.
Index: alpha.c
===================================================================
--- alpha.c     (revision 177507)
+++ alpha.c     (working copy)
@@ -4632,6 +4632,13 @@ alpha_gp_save_rtx (void)
   return m;
 }
 
+static void
+alpha_instantiate_decls (void)
+{
+  if (cfun->machine->gp_save_rtx != NULL_RTX)
+    instantiate_decl_rtl (cfun->machine->gp_save_rtx);
+}
+
 static int
 alpha_ra_ever_killed (void)
 {
@@ -9811,6 +9818,9 @@ alpha_conditional_register_usage (void)
 #undef TARGET_TRAMPOLINE_INIT
 #define TARGET_TRAMPOLINE_INIT alpha_trampoline_init
 
+#undef TARGET_INSTANTIATE_DECLS
+#define TARGET_INSTANTIATE_DECLS alpha_instantiate_decls
+
 #undef TARGET_SECONDARY_RELOAD
 #define TARGET_SECONDARY_RELOAD alpha_secondary_reload
 

Reply via email to