[Bug tree-optimization/54200] copyrename generates wrong debuginfo

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Tue Apr 2 07:56:00 GMT 2013


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

--- Comment #13 from rguenther at suse dot de <rguenther at suse dot de> 2013-04-02 07:56:26 UTC ---
On Fri, 29 Mar 2013, jakub at gcc dot gnu.org wrote:

> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54200
> 
> Jakub Jelinek <jakub at gcc dot gnu.org> changed:
> 
>            What    |Removed                     |Added
> ----------------------------------------------------------------------------
>                  CC|                            |jakub at gcc dot gnu.org
> 
> --- Comment #12 from Jakub Jelinek <jakub at gcc dot gnu.org> 2013-03-29 15:36:15 UTC ---
> This patch regressed code quality on find_vma function in Linux kernel on
> s390x:
> struct rb_node
> {
>   unsigned long __rb_parent_color;
>   struct rb_node *rb_right;
>   struct rb_node *rb_left;
> } __attribute__ ((aligned (sizeof (long))));
> struct rb_root {
>   struct rb_node *rb_node;
> };
> struct vm_area_struct
> {
>   unsigned long vm_start;
>   unsigned long vm_end;
>   struct vm_area_struct *vm_next, *vm_prev;
>   struct rb_node vm_rb;
> };
> struct mm_struct
> {
>   struct vm_area_struct *mmap;
>   struct rb_root mm_rb;
>   struct vm_area_struct *mmap_cache;
> };
> struct vm_area_struct *
> find_vma (struct mm_struct *mm, unsigned long addr)
> {
>   struct vm_area_struct *vma = ((void *) 0);
>   static _Bool __attribute__ ((__section__ (".data.unlikely"))) __warned;
>   int __ret_warn_once = !!(!mm);
>   if (__builtin_expect (!!(__ret_warn_once), 0))
>     {
>       int __ret_warn_on = !!(!__warned);
>       if (__builtin_expect (!!(__ret_warn_on), 0))
>     asm volatile ("": :"i" (1920), "i" (((1 << 0) | ((9) << 8))), "i" (64));
>       if (__builtin_expect (!!(__ret_warn_on), 0))
>     __warned = 1;
>     }
>   if (__builtin_expect (!!(__ret_warn_once), 0))
>     return ((void *) 0);
>   vma = mm->mmap_cache;
>   if (!(vma && vma->vm_end > addr && vma->vm_start <= addr))
>     {
>       struct rb_node *rb_node;
>       rb_node = mm->mm_rb.rb_node;
>       vma = ((void *) 0);
>       while (rb_node)
>     {
>       struct vm_area_struct *vma_tmp;
>       const typeof (((struct vm_area_struct *)0)->vm_rb) *__mptr = rb_node;
>       vma_tmp = (struct vm_area_struct *) ((char *) __mptr - __builtin_offsetof
> (struct vm_area_struct, vm_rb));
>       if (vma_tmp->vm_end > addr)
>         {
>           vma = vma_tmp;
>           if (vma_tmp->vm_start <= addr)
>         break;
>           rb_node = rb_node->rb_left;
>         }
>       else
>         rb_node = rb_node->rb_right;
>     }
>       if (vma)
>     mm->mmap_cache = vma;
>     }
>   return vma;
> }
> 
> with:
> -fno-strict-aliasing -fno-common -fno-delete-null-pointer-checks -O2 -m64
> -mbackchain -msoft-float -march=z9-109 -mpacked-stack -mstack-size=16384
> -fno-strength-reduce -fno-stack-protector -fomit-frame-pointer
> -fno-inline-functions-called-once -fconserve-stack
> 
> The difference in *.optimized is just:
> -  # vma_5 = PHI <0B(18), vma_2(15), vma_20(6), vma_2(16), 0B(7)>
> -  return vma_5;
> +  # _5 = PHI <0B(18), vma_2(15), vma_20(6), vma_2(16), 0B(7)>
> +  return _5;
> but later on CSE2 decides to use REG_EQUAL somewhere for some reason, and we
> end up reading mm->mmap_cache twice, first into a register to do the
> comparisons of it, and then when we know it is the value we actually want to
> return, we just forget we have it in a pseudo and read it again from memory.

Surely not a bug with the patch but a bug in CSE.  What the patch can
change is how pseudos are coalesced.  A "fix" may be in the coalescing
code, not restrict coalescing to SSA names with the same underlying
decl (with the cost issue of a bigger conflict map).



More information about the Gcc-bugs mailing list