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

           Summary: [4.5/4.6 Regression] gfortran.dg/char_cshift_2.f90
                    FAILs with -fregmove
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: zso...@seznam.cz
              Host: x86_64-pc-linux-gnu
            Target: x86_64-pc-linux-gnu


Created attachment 22632
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22632
auto-reduced testcase

Output:
$ /mnt/svn/gcc-trunk/binary-167453-lto-fortran-checking-yes-rtl-df/bin/gfortran
-O -fPIC -fexpensive-optimizations -fgcse -foptimize-register-move -fpeel-loops
-fno-tree-loop-optimize pr46804.f90
$ ./a.out 
Aborted

In the assembly, the problem is apparent (intel syntax):
...
    mov    r12d, DWORD PTR A.4.1573[rip+3]    # tmp310, A.4
    mov    DWORD PTR 16[rsp+r8*4], r12d    # shift3, tmp310
...
32bit (unaligned) value is loaded instead of sign-extend byte as is done
without -fregmove:
...
    movsx    r11d, BYTE PTR A.4.1573[rip+3]    # tmp310, A.4
    mov    DWORD PTR 16[rsp+r8*4], r11d    # shift3, tmp310
...

so shift3 contains invalid data

The problem seems to first appear in the 182r.regmove dump:
$ diff pr46804.f90.180r.ce2 pr46804.f90.182r.regmove
...
2009,2010c1409,1410
<         (sign_extend:SI (reg:QI 236))) pr46804.f90:17 132 {extendqisi2}
<      (expr_list:REG_DEAD (reg:QI 236)
---
>         (reg:SI 236)) pr46804.f90:17 64 {*movsi_internal}
>      (expr_list:REG_DEAD (reg:SI 236)
...

Output:
r167453 - fail
r158095 - fail
4.5 r166509 - fail
4.4 r166509 - OK

Reply via email to