http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46685

--- Comment #11 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2010-12-02 
11:30:54 UTC ---
> Alternatively, we could do something like:
> --- gcc/config/sparc/sparc.c.jj    2010-11-26 18:39:04.000000000 +0100
> +++ gcc/config/sparc/sparc.c    2010-11-29 15:35:00.727219374 +0100
> @@ -1066,8 +1066,13 @@ sparc_expand_move (enum machine_mode mod
>       are absolutely sure that X is in the same segment as the GOT.
>       Unfortunately, the flexibility of linker scripts means that we
>       can't be sure of that in general, so assume that _G_O_T_-relative
> -     accesses are never valid on VxWorks.  */
> -      if (GET_CODE (operands[1]) == LABEL_REF && !TARGET_VXWORKS_RTP)
> +     accesses are never valid on VxWorks.
> +     If the label is non-local, it might be placed in a different section
> +     from . and movMODE_pic_label_ref patterns require the label and .
> +     to be in the same section.  */
> +      if (GET_CODE (operands[1]) == LABEL_REF
> +      && !TARGET_VXWORKS_RTP
> +      && !LABEL_REF_NONLOCAL_P (operands[1]))
>      {
>        if (mode == SImode)
>          {
> 
> Not sure if even in current function it could happen that sparc_expand_move
> is asked for a label that is in the other partition.  I mean something like:
> __attribute__((noinline, noclone))
> void bar (void *x)
> {
>   asm volatile ("" : : "r" (x) : "memory");
> }
> 
> __attribute__((noinline, noclone))
> void baz (void)
> {
>   asm volatile ("" : : : "memory");
> }
> 
> __attribute__((noinline, noclone))
> int foo (int x)
> {
>   __label__ lab;
>   if (__builtin_expect (x, 0))
>     {
>       lab:
>       baz ();
>       return 2;
>     }
>   bar (&&lab);
>   return 1;
> }
> 
> int
> main (void)
> {
>   int x, i;
>   asm volatile ("" : "=r" (x) : "0" (0));
>   for (i = 0; i < 1000000; i++)
>     foo (x);
>   return 0;
> }
> 
> first compiled/linked with -O2 -fprofile-generate
> -freorder-blocks-and-partition -fpic, then executed, then compiled again with
> -O2 -fprofile-use -freorder-blocks-and-partition -fpic.  At least on
> x86_64-linux the baz () bb is .text.unlikely, while bar (&&lab) is .text
> section.  Now, I guess this wouldn't assemble on sparc-linux or Solaris, even
> before Honza's patch.

This testcase just crashes the compiler. :-)  But, yes, once the patchlet

Index: config/sparc/sparc.c
===================================================================
--- config/sparc/sparc.c    (revision 167365)
+++ config/sparc/sparc.c    (working copy)
@@ -9453,6 +9485,7 @@ sparc_file_end (void)
       DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
       DECL_VISIBILITY_SPECIFIED (decl) = 1;
       allocate_struct_function (decl, true);
+      cfun->is_thunk = 1;
       current_function_decl = decl;
       init_varasm_status ();
       assemble_start_function (decl, name);

is applied, your prediction is verified:

ebotca...@grobluk:~/obj$ gcc/xgcc -Bgcc -O2 -fprofile-use
-freorder-blocks-and-partition -fpic pr46685.c
/tmp/ccg98MwA.s: Assembler messages:
/tmp/ccg98MwA.s:71: Error: operation combines symbols in different segments
/tmp/ccg98MwA.s:72: Error: operation combines symbols in different segments

> Or simply amend the second patch above and disable this optimization even for
> flag_reorder_blocks_and_partition.

This is good enough I'd think.  Testing...

Reply via email to