public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations
@ 2013-07-24 11:08 daniel.blaukopf at oracle dot com
  2013-07-24 11:09 ` [Bug rtl-optimization/57967] " daniel.blaukopf at oracle dot com
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: daniel.blaukopf at oracle dot com @ 2013-07-24 11:08 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 57967
           Summary: Incorrect code generated on ARM with
                    -fexpensive-optimizations
           Product: gcc
           Version: 4.6.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: daniel.blaukopf at oracle dot com

Created attachment 30543
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30543&action=edit
Two functions, f1 and f2 should compile to almost the same result. The compiled
code for f1 throws away the x0 and x1 parameters.

In situations results of a computation that go into the top 16-bits of a 32-bit
return value are optimized out. A small change to the source makes the problem
go away. In the example provided, changing the order of function parameters
provides the problem.

- Reproduced on the ARM GCC 4.6.3 in Ubuntu 12.04 (both hard and soft float) by
inspection of generated assembly
- Reproduced on the Linaro GCC 4.7.2 unsupported 2012.09 toolchain from
https://launchpad.net/linaro-toolchain-unsupported/, verified by inspection of
generated assembly and by running a test case.

+ arm-linux-gnueabihf-gcc -v --save-temps -Wall -Wextra -shared -O
-fexpensive-optimizations gcc-bug.c -o libgcc-bug.so
Using built-in specs.
COLLECT_GCC=arm-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.6 --enable-shared --enable-linker-build-id
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix
--with-gxx-include-dir=/usr/arm-linux-gnueabihf/include/c++/4.6.3
--libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin
--enable-objc-gc --enable-multilib --disable-sjlj-exceptions
--with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16 --with-mode=thumb
--disable-werror --enable-checking=release --build=i686-linux-gnu
--host=i686-linux-gnu --target=arm-linux-gnueabihf
--program-prefix=arm-linux-gnueabihf-
--includedir=/usr/arm-linux-gnueabihf/include
--with-headers=/usr/arm-linux-gnueabihf/include
--with-libs=/usr/arm-linux-gnueabihf/lib
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-shared' '-O'
'-fexpensive-optimizations' '-o' 'libgcc-bug.so' '-march=armv7-a'
'-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mthumb'
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/cc1 -E -quiet -v -imultilib . -imultiarch
arm-linux-gnueabihf gcc-bug.c -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16
-mthumb -Wall -Wextra -fexpensive-optimizations -O -fpch-preprocess
-fstack-protector -o gcc-bug.i
ignoring duplicate directory
"/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/include"
ignoring nonexistent directory "/usr/include/arm-linux-gnueabihf"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/include
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/include-fixed
 /usr/arm-linux-gnueabihf/include
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-shared' '-O'
'-fexpensive-optimizations' '-o' 'libgcc-bug.so' '-march=armv7-a'
'-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mthumb'
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/cc1 -fpreprocessed gcc-bug.i -quiet
-dumpbase gcc-bug.c -march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -mthumb
-auxbase gcc-bug -O -Wall -Wextra -version -fexpensive-optimizations
-fstack-protector -o gcc-bug.s
GNU C (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (arm-linux-gnueabihf)
    compiled by GNU C version 4.6.3, GMP version 5.0.2, MPFR version 3.1.0-p3,
MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
GNU C (Ubuntu/Linaro 4.6.3-1ubuntu5) version 4.6.3 (arm-linux-gnueabihf)
    compiled by GNU C version 4.6.3, GMP version 5.0.2, MPFR version 3.1.0-p3,
MPC version 0.9
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: cc9c163e1be35f3de7fa1357bc204e65
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-shared' '-O'
'-fexpensive-optimizations' '-o' 'libgcc-bug.so' '-march=armv7-a'
'-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mthumb'
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/as
-march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 -meabi=5 -o gcc-bug.o gcc-bug.s
COMPILER_PATH=/usr/lib/gcc/arm-linux-gnueabihf/4.6/:/usr/lib/gcc/arm-linux-gnueabihf/4.6/:/usr/lib/gcc/arm-linux-gnueabihf/:/usr/lib/gcc/arm-linux-gnueabihf/4.6/:/usr/lib/gcc/arm-linux-gnueabihf/:/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/bin/
LIBRARY_PATH=/usr/lib/gcc/arm-linux-gnueabihf/4.6/:/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/lib/../lib/:/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-Wextra' '-shared' '-O'
'-fexpensive-optimizations' '-o' 'libgcc-bug.so' '-march=armv7-a'
'-mfloat-abi=hard' '-mfpu=vfpv3-d16' '-mthumb'
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/collect2 --build-id --no-add-needed
--as-needed --eh-frame-hdr -shared -dynamic-linker /lib/ld-linux-armhf.so.3 -X
--hash-style=gnu -m armelf_linux_eabi -z relro -o libgcc-bug.so
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/lib/../lib/crti.o
/usr/lib/gcc/arm-linux-gnueabihf/4.6/crtbeginS.o
-L/usr/lib/gcc/arm-linux-gnueabihf/4.6
-L/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/lib/../lib
-L/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/lib
-L/lib/arm-linux-gnueabihf -L/usr/lib/arm-linux-gnueabihf -L/usr/lib -L/lib
gcc-bug.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed
-lgcc_s --no-as-needed /usr/lib/gcc/arm-linux-gnueabihf/4.6/crtendS.o
/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/lib/../lib/crtn.o


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug rtl-optimization/57967] Incorrect code generated on ARM with -fexpensive-optimizations
  2013-07-24 11:08 [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations daniel.blaukopf at oracle dot com
@ 2013-07-24 11:09 ` daniel.blaukopf at oracle dot com
  2013-07-24 11:16 ` daniel.blaukopf at oracle dot com
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: daniel.blaukopf at oracle dot com @ 2013-07-24 11:09 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Daniel Blaukopf <daniel.blaukopf at oracle dot com> ---
Created attachment 30544
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30544&action=edit
Test case that can be run with libgcc-bug.so to show the failure


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug rtl-optimization/57967] Incorrect code generated on ARM with -fexpensive-optimizations
  2013-07-24 11:08 [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations daniel.blaukopf at oracle dot com
  2013-07-24 11:09 ` [Bug rtl-optimization/57967] " daniel.blaukopf at oracle dot com
@ 2013-07-24 11:16 ` daniel.blaukopf at oracle dot com
  2013-07-24 15:45 ` [Bug rtl-optimization/57967] [4.7 regresssion] " rearnsha at gcc dot gnu.org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: daniel.blaukopf at oracle dot com @ 2013-07-24 11:16 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Daniel Blaukopf <daniel.blaukopf at oracle dot com> ---
This code:

int f1(int x0, int y0, int z0, int x1, int y1, int z1) {
    int xx = ((x0 << 16) + (x1 - x0) * 0x1234 + 0x8000) >> 16;
    int yy = ((y0 << 16) + (y1 - y0) * 0x2345 + 0x8000) >> 16;
    int zz = ((z0 << 16) + (z1 - z0) * 0x3456 + 0x8000) >> 16;
    return (xx << 16) | (yy << 8) | zz;
}

Compiles (incorrectly) to:
f1:
    @ args = 8, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    ldr    r0, [sp, #4]
    subs    r0, r0, r2
    movw    r3, #13398
    mul    r0, r3, r0
    add    r2, r0, r2, lsl #16
    ldr    r3, [sp, #0]
    subs    r3, r3, r1
    movw    r0, #9029
    mul    r3, r0, r3
    add    r1, r3, r1, lsl #16
    add    r1, r1, #32768
    asr    r1, r1, #16
    lsl    r1, r1, #8
    add    r0, r2, #32768
    orr    r0, r1, r0, asr #16
    bx    lr

This almost identical code:

int f2(int x0, int x1, int y0, int y1, int z0, int z1) {
    int xx = ((x0 << 16) + (x1 - x0) * 0x1234 + 0x8000) >> 16;
    int yy = ((y0 << 16) + (y1 - y0) * 0x2345 + 0x8000) >> 16;
    int zz = ((z0 << 16) + (z1 - z0) * 0x3456 + 0x8000) >> 16;
    return (xx << 16) | (yy << 8) | zz;
}

Compiles (correctly) to:
f2:
    @ args = 8, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    push    {r4, r5}
    ldr    r4, [sp, #8]
    subs    r3, r3, r2
    movw    r5, #9029
    mul    r3, r5, r3
    add    r2, r3, r2, lsl #16
    add    r2, r2, #32768
    asr    r2, r2, #16
    subs    r1, r1, r0
    movw    r3, #4660
    mul    r1, r3, r1
    add    r0, r1, r0, lsl #16
    add    r0, r0, #32768
    asr    r0, r0, #16
    lsl    r0, r0, #16
    orr    r2, r0, r2, lsl #8
    ldr    r0, [sp, #12]
    subs    r0, r0, r4
    movw    r3, #13398
    mul    r0, r3, r0
    add    r4, r0, r4, lsl #16
    add    r0, r4, #32768
    orr    r0, r2, r0, asr #16
    pop    {r4, r5}
    bx    lr


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug rtl-optimization/57967] [4.7 regresssion] Incorrect code generated on ARM with -fexpensive-optimizations
  2013-07-24 11:08 [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations daniel.blaukopf at oracle dot com
  2013-07-24 11:09 ` [Bug rtl-optimization/57967] " daniel.blaukopf at oracle dot com
  2013-07-24 11:16 ` daniel.blaukopf at oracle dot com
@ 2013-07-24 15:45 ` rearnsha at gcc dot gnu.org
  2013-07-25 13:59 ` mikpe at it dot uu.se
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: rearnsha at gcc dot gnu.org @ 2013-07-24 15:45 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Earnshaw <rearnsha at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2013-07-24
      Known to work|                            |4.8.2
            Summary|Incorrect code generated on |[4.7 regresssion] Incorrect
                   |ARM with                    |code generated on ARM with
                   |-fexpensive-optimizations   |-fexpensive-optimizations
     Ever confirmed|0                           |1

--- Comment #3 from Richard Earnshaw <rearnsha at gcc dot gnu.org> ---
This appears to be a bug in combine.  My suspicion lies with the new 4-way
combine code that was added around gcc-4.6.

Note that gcc-4.6 is no-longer being maintained.

The problem seems to be fixed in 4.8 so a bisect might indicate a fix.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug rtl-optimization/57967] [4.7 regresssion] Incorrect code generated on ARM with -fexpensive-optimizations
  2013-07-24 11:08 [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations daniel.blaukopf at oracle dot com
                   ` (2 preceding siblings ...)
  2013-07-24 15:45 ` [Bug rtl-optimization/57967] [4.7 regresssion] " rearnsha at gcc dot gnu.org
@ 2013-07-25 13:59 ` mikpe at it dot uu.se
  2013-08-28  9:22 ` rguenth at gcc dot gnu.org
  2014-06-12 13:52 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: mikpe at it dot uu.se @ 2013-07-25 13:59 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Mikael Pettersson <mikpe at it dot uu.se> ---
I can reproduce the wrong-code with gcc-4.7.3 on armv5tel-linux-gnueabi.

The wrong-code disappeared on 4.7 branch with the recent PR57829 fix in
r200773.

On trunk the wrong-code disappeared with r186147, Mike Stump's "remove wrong
code in immed_double_const" patch.  Backporting that to 4.7.3 (pre-PR57829 fix)
also fixes the wrong-code.  However, r186147 (a) had some regressions on ARM
and s390x (see PR57735), and (b) should be redundant for 4.7 given the PR57829
fix.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug rtl-optimization/57967] [4.7 regresssion] Incorrect code generated on ARM with -fexpensive-optimizations
  2013-07-24 11:08 [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations daniel.blaukopf at oracle dot com
                   ` (3 preceding siblings ...)
  2013-07-25 13:59 ` mikpe at it dot uu.se
@ 2013-08-28  9:22 ` rguenth at gcc dot gnu.org
  2014-06-12 13:52 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-08-28  9:22 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |4.7.4


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Bug rtl-optimization/57967] [4.7 regresssion] Incorrect code generated on ARM with -fexpensive-optimizations
  2013-07-24 11:08 [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations daniel.blaukopf at oracle dot com
                   ` (4 preceding siblings ...)
  2013-08-28  9:22 ` rguenth at gcc dot gnu.org
@ 2014-06-12 13:52 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2014-06-12 13:52 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57967

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |FIXED
   Target Milestone|4.7.4                       |4.8.2

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
Fixed in 4.8.2.


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-06-12 13:52 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-24 11:08 [Bug rtl-optimization/57967] New: Incorrect code generated on ARM with -fexpensive-optimizations daniel.blaukopf at oracle dot com
2013-07-24 11:09 ` [Bug rtl-optimization/57967] " daniel.blaukopf at oracle dot com
2013-07-24 11:16 ` daniel.blaukopf at oracle dot com
2013-07-24 15:45 ` [Bug rtl-optimization/57967] [4.7 regresssion] " rearnsha at gcc dot gnu.org
2013-07-25 13:59 ` mikpe at it dot uu.se
2013-08-28  9:22 ` rguenth at gcc dot gnu.org
2014-06-12 13:52 ` rguenth at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).