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



             Bug #: 55369

           Summary: expmed.c is miscompiled in stage1 bootstrap at -O1

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: middle-end

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: dang...@gcc.gnu.org

              Host: hppa64-hp-hpux11.11

            Target: hppa64-hp-hpux11.11

             Build: hppa64-hp-hpux11.11





Created attachment 28721

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28721

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.

Reply via email to