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

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Mar 29 15:36:00 GMT 2013


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.



More information about the Gcc-bugs mailing list