User account creation filtered due to spam.

Bug 55369 - expmed.c is miscompiled in stage1 bootstrap at -O1
Summary: expmed.c is miscompiled in stage1 bootstrap at -O1
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.7.2
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: build, wrong-code
Depends on:
Blocks:
 
Reported: 2012-11-17 20:13 UTC by John David Anglin
Modified: 2012-11-19 21:50 UTC (History)
0 users

See Also:
Host: hppa64-hp-hpux11.11
Target: hppa64-hp-hpux11.11
Build: hppa64-hp-hpux11.11
Known to work:
Known to fail:
Last reconfirmed:


Attachments
Preprocessed source (133.75 KB, application/x-gzip)
2012-11-17 20:13 UTC, John David Anglin
Details
Reduced testcase (1.74 KB, text/plain)
2012-11-18 17:16 UTC, John David Anglin
Details

Note You need to log in before you can comment on or make changes to this bug.
Description John David Anglin 2012-11-17 20:13:19 UTC
Created attachment 28721 [details]
Preprocessed source

I have seen the following ICE with 4.4.7, 4.6.3 and 4.7.2:

libtool: compile:  /test/gnu/gcc/objdir/./gcc/xgcc -shared-libgcc -B/test/gnu/gc
c/objdir/./gcc -nostdinc++ -L/test/gnu/gcc/objdir/hppa64-hp-hpux11.11/libstdc++-v3/src -L/test/gnu/gcc/objdir/hppa64-hp-hpux11.11/libstdc++-v3/src/.libs -B/opt/
gnu64/gcc/gcc-4.8/hppa64-hp-hpux11.11/bin/ -B/opt/gnu64/gcc/gcc-4.8/hppa64-hp-hp
ux11.11/lib/ -isystem /opt/gnu64/gcc/gcc-4.8/hppa64-hp-hpux11.11/include -isystem /opt/gnu64/gcc/gcc-4.8/hppa64-hp-hpux11.11/sys-include -I/test/gnu/gcc/gcc/lib
stdc++-v3/../libgcc -I/test/gnu/gcc/objdir/hppa64-hp-hpux11.11/libstdc++-v3/incl
ude/hppa64-hp-hpux11.11 -I/test/gnu/gcc/objdir/hppa64-hp-hpux11.11/libstdc++-v3/include -I/test/gnu/gcc/gcc/libstdc++-v3/libsupc++ -D_GLIBCXX_SHARED -Wall -Wext
ra -Wwrite-strings -Wcast-qual -Wabi -fdiagnostics-show-location=once -ffunction
-sections -fdata-sections -frandom-seed=eh_alloc.lo -g -O2 -c ../../../../gcc/li
bstdc++-v3/libsupc++/eh_alloc.cc  -DPIC -D_GLIBCXX_SHARED -o eh_alloc.o
../../../../gcc/libstdc++-v3/libsupc++/eh_alloc.cc: In function 'void __cxxabiv1
::__cxa_free_dependent_exception(__cxxabiv1::__cxa_dependent_exception*)':
../../../../gcc/libstdc++-v3/libsupc++/eh_alloc.cc:213:28: internal compiler err
or: in expand_divmod, at expmed.c:4103
  = (unsigned) (ptr - base) / sizeof (__cxa_dependent_exception);
                            ^

../../../../gcc/libstdc++-v3/libsupc++/eh_alloc.cc:213:28: internal compiler error: Aborted
xgcc: internal compiler error: Aborted (program cc1plus)
../libtool[11]: 22165 Abort(coredump)
make[5]: *** [eh_alloc.lo] Error 1

This is with the following make command:
make STAGE1_CFLAGS="-g -O1" -j2 bootstrap

The ICE appears to be caused by the bootstrap compiler miscompiling
choose_multiplier.  In particular, this hunk is incorrectly compiled:

  /* Reduce to lowest terms.  */
  for (post_shift = lgup; post_shift > 0; post_shift--)
    {
      int shft = HOST_BITS_PER_WIDE_INT - 1;
      unsigned HOST_WIDE_INT ml_lo = (mlow.high << shft) | (mlow.low >> 1);
      unsigned HOST_WIDE_INT mh_lo = (mhigh.high << shft) | (mhigh.low >> 1);
      if (ml_lo >= mh_lo)
        break;

      mlow = double_int::from_uhwi (ml_lo);
      mhigh = double_int::from_uhwi (mh_lo);
    }

The combine pass drops the or of "(mhigh.high << shft)" into mh_lo.
Strangely, the same doesn't happen for ml_lo.  As a result, ml_lo is
greater than mh_lo and the reduction fails.

L$BB3244:
        ; ../../gcc/gcc/expmed.c:3349
L$M1779:
        ldd -256(%r30),%r31
        depd,z %r31,0,1,%r31
        ldd -264(%r30),%r28
        extrd,u %r28,62,63,%r28
        or %r31,%r28,%r31
L$VL1332:
        ; ../../gcc/gcc/expmed.c:3350
L$M1780:
        extrd,u %r6,62,63,%r6
L$VL1333:
        ; ../../gcc/gcc/expmed.c:3351
L$M1781:
        cmpb,*>> %r6,%r31,L$0883
        copy %r9,%r28
        ; basic block 17
        ; ../../gcc/gcc/expmed.c:3358

Before combine, we have:

(insn 243 242 244 16 (set (reg:DI 182)
        (ashift:DI (reg:DI 103 [ mhigh$high ])
            (const_int 63 [0x3f]))) ../../gcc/gcc/expmed.c:3350 228 {*pa.md:6415
}
     (nil))

(insn 244 243 245 16 (set (reg:DI 183)
        (lshiftrt:DI (reg:DI 155)
            (const_int 1 [0x1]))) ../../gcc/gcc/expmed.c:3350 238 {lshrdi3}
     (expr_list:REG_DEAD (reg:DI 155)
        (nil)))

(insn 245 244 246 16 (set (reg/v:DI 107 [ mh_lo ])
        (ior:DI (reg:DI 182)
            (reg:DI 183))) ../../gcc/gcc/expmed.c:3350 182 {*pa.md:5716}
     (expr_list:REG_DEAD (reg:DI 183)
        (expr_list:REG_DEAD (reg:DI 182)
            (nil))))
(debug_insn 246 245 22 16 (var_location:DI mh_lo (reg/v:DI 107 [ mh_lo ])) ../..
/gcc/gcc/expmed.c:3350 -1
     (nil))

After combine,

(note 243 242 244 16 NOTE_INSN_DELETED)

(note 244 243 245 16 NOTE_INSN_DELETED)

(insn 245 244 246 16 (set (reg/v:DI 107 [ mh_lo ])
        (lshiftrt:DI (reg:DI 155)
            (const_int 1 [0x1]))) ../../gcc/gcc/expmed.c:3350 238 {lshrdi3}
     (expr_list:REG_DEAD (reg:DI 155)
        (nil)))

(debug_insn 246 245 22 16 (var_location:DI mh_lo (reg/v:DI 107 [ mh_lo ])) ../..
/gcc/gcc/expmed.c:3350 -1
     (nil))

Trying 243 -> 245:
Successfully matched this instruction:
(set (reg/v:DI 107 [ mh_lo ])
    (reg:DI 183))
deferring deletion of insn with uid = 243.
modifying insn i3   245 r107:DI=r183:DI
      REG_DEAD: r183:DI
deferring rescan insn with uid = 245.

Trying 244 -> 245:
Successfully matched this instruction:
(set (reg/v:DI 107 [ mh_lo ])
    (lshiftrt:DI (reg:DI 155)
        (const_int 1 [0x1])))
deferring deletion of insn with uid = 244.
modifying insn i3   245 r107:DI=r155:DI 0>>0x1
      REG_DEAD: r155:DI
deferring rescan insn with uid = 245.

Here is cc1plus args:
-fpreprocessed expmed.ii -quiet -dumpbase expmed.c -da -dA -auxbase-strip expmed.o -g -O1 -Wextra -Wall -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Wno-error -version -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -fno-common -o expmed.s -dA

I was able to duplicate with x86 4.6.3 cross.
Comment 1 John David Anglin 2012-11-18 17:16:53 UTC
Created attachment 28725 [details]
Reduced testcase

Problem occurs because of gcc_assert expression checking.  If disabled,
the generated code seems correct.

/home/gnu64/gcc/gcc-4.6/bin/../libexec/gcc/hppa64-hp-hpux11.11/4.6.3/cc1plus -fpreprocessed xxx.ii -quiet -dumpbase xxx.c -dA -auxbase-strip xxx.o -g -O1 -Wextra -Wall -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Wno-error -version -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -fno-common -o xxx.s