Hello Paul, You're seeing this problem because mips.exp can't handle -O* in dg-options. The other tests in gcc.target/mips use a dg-skip-if to skip for -O0 and -O1 instead of having -O2 in dg-options. This is supposed to ensure that the tests are run for as many optimization levels as possible.
I believe that Matthew can confirm this. Regards, Toma Tabacu > -----Original Message----- > From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-ow...@gcc.gnu.org] On > Behalf Of Paul Hua > Sent: 16 May 2017 10:11 > To: Jeff Law > Cc: gcc-patches > Subject: Re: Fix minor reorg.c bug affecting MIPS targets > > Hi: > > There are new failures between r248067 and r248036 on > mips64el-unknown-linux-gnu. > > ERROR: gcc.target/mips/reorgbug-1.c -O0 : Unrecognised option: -O2 > for " dg-options 1 "-O2 -msoft-float -mips2" " > UNRESOLVED: gcc.target/mips/reorgbug-1.c -O0 : Unrecognised > option: -O2 for " dg-options 1 "-O2 -msoft-float -mips2" " > ERROR: gcc.target/mips/reorgbug-1.c -O1 : Unrecognised option: -O2 > for " dg-options 1 "-O2 -msoft-float -mips2" " > UNRESOLVED: gcc.target/mips/reorgbug-1.c -O1 : Unrecognised > option: -O2 for " dg-options 1 "-O2 -msoft-float -mips2" " > ERROR: gcc.target/mips/reorgbug-1.c -O2 -flto > -fno-use-linker-plugin -flto-partition=none : Unrecognised option: -O2 > for " dg-options 1 "-O2 -msoft-float -mips2" " > UNRESOLVED: gcc.target/mips/reorgbug-1.c -O2 -flto > -fno-use-linker-plugin -flto-partition=none : Unrecognised option: -O2 > for " dg-options 1 "-O2 -msoft-float -mips2" " > ERROR: gcc.target/mips/reorgbug-1.c -O2 -flto -fuse-linker-plugin > -fno-fat-lto-objects : Unrecognised option: -O2 for " dg-options 1 > "-O2 -msoft-float -mips2" " > UNRESOLVED: gcc.target/mips/reorgbug-1.c -O2 -flto > -fuse-linker-plugin -fno-fat-lto-objects : Unrecognised option: -O2 > for " dg-options 1 "-O2 -msoft-float -mips2" " > ERROR: gcc.target/mips/reorgbug-1.c -O2 : Unrecognised option: -O2 > for " dg-options 1 "-O2 -msoft-float -mips2" " > UNRESOLVED: gcc.target/mips/reorgbug-1.c -O2 : Unrecognised > option: -O2 for " dg-options 1 "-O2 -msoft-float -mips2" " > ERROR: gcc.target/mips/reorgbug-1.c -O3 -g : Unrecognised option: > -O2 for " dg-options 1 "-O2 -msoft-float -mips2" " > UNRESOLVED: gcc.target/mips/reorgbug-1.c -O3 -g : Unrecognised > option: -O2 for " dg-options 1 "-O2 -msoft-float -mips2" " > ERROR: gcc.target/mips/reorgbug-1.c -Os : Unrecognised option: -O2 > for " dg-options 1 "-O2 -msoft-float -mips2" " > UNRESOLVED: gcc.target/mips/reorgbug-1.c -Os : Unrecognised > option: -O2 for " dg-options 1 "-O2 -msoft-float -mips2" " > > I don't know why? just delete the "-O2" options in dg-options, then > the test passed. > > diff --git a/gcc/testsuite/gcc.target/mips/reorgbug-1.c > b/gcc/testsuite/gcc.target/mips/reorgbug-1.c > index b820a2b..9537d21 100644 > --- a/gcc/testsuite/gcc.target/mips/reorgbug-1.c > +++ b/gcc/testsuite/gcc.target/mips/reorgbug-1.c > @@ -1,4 +1,4 @@ > -/* { dg-options "-O2 -msoft-float -mips2" } */ > +/* { dg-options "-msoft-float -mips2" } */ > > typedef long int __int32_t; > typedef long unsigned int __uint32_t; > > config info:Compiler version: 8.0.0 20170515 (experimental) (gcc trunk > r248067 mips64el o32 n32 n64) > Platform: mips64el-unknown-linux-gnu > configure flags: --prefix=/home/xuchenghua/toolchain/gcc-trunk-r248067 > --enable-bootstrap --enable-shared --enable-threads=posix > --enable-checking=release --enable-multilib--with-system-zlib > --enable-__cxa_atexit --disable-libunwind-exceptions > --enable-gnu-unique-object --enable-linker-build-id > --enable-languages=c,c++,fortran --enable-plugin > --enable-initfini-array --disable-libgcj --with-arch=mips64r2 > --with-abi=64 --with-multilib-list=32,n32,64 > --enable-gnu-indirect-function --with-long-double-128 > --build=mips64el-unknown-linux --target=mips64el-unknown-linux > --with-pkgversion='gcc trunk r248067 mips64el o32 n32 n64' > --disable-werror > > > paul > > On Tue, May 16, 2017 at 1:22 AM, Jeff Law <l...@redhat.com> wrote: > > > > > > There's a subtle bug in reorg.c's relax_delay_slots that my tester tripped > > this weekend. Not sure what changed code generation wise as the affected > > port built just fine last week. But it is what is is. > > > > > > > > Assume before this code we've set TARGET_LABEL to the code_label associated > > with DELAY_JUMP_INSN (which is what we want)... > > > > > > > > /* If the first insn at TARGET_LABEL is redundant with a previous > > insn, redirect the jump to the following insn and process again. > > We use next_real_insn instead of next_active_insn so we > > don't skip USE-markers, or we'll end up with incorrect > > liveness info. */ > > > > [ ... ] > > > > /* Similarly, if it is an unconditional jump with one insn in its > > delay list and that insn is redundant, thread the jump. */ > > rtx_sequence *trial_seq = > > trial ? dyn_cast <rtx_sequence *> (PATTERN (trial)) : NULL; > > if (trial_seq > > && trial_seq->len () == 2 > > && JUMP_P (trial_seq->insn (0)) > > && simplejump_or_return_p (trial_seq->insn (0)) > > && redundant_insn (trial_seq->insn (1), insn, vNULL)) > > { > > target_label = JUMP_LABEL (trial_seq->insn (0)); > > if (ANY_RETURN_P (target_label)) > > target_label = find_end_label (target_label); > > > > if (target_label > > && redirect_with_delay_slots_safe_p (delay_jump_insn, > > target_label, insn)) > > { > > update_block (trial_seq->insn (1), insn); > > reorg_redirect_jump (delay_jump_insn, target_label); > > next = insn; > > continue; > > } > > } > > > > /* See if we have a simple (conditional) jump that is useless. */ > > if (! INSN_ANNULLED_BRANCH_P (delay_jump_insn) > > && ! condjump_in_parallel_p (delay_jump_insn) > > && prev_active_insn (as_a<rtx_insn *> (target_label)) == insn > > > > Now assume that we get into the TRUE arm of that first conditional which > > sets a new value for TARGET_LABEL. Normally when this happens in > > relax_delay_slots we're going to unconditionally continue. But as we can > > see there's an inner conditional and if we don't get into its true arm, then > > we'll pop out a nesting level and execute the second outer IF. > > > > That second outer IF assumes that TARGET_LABEL still points to the code > > label associated with DELAY_JUMP_INSN. Opps. In my particular case it was > > NULL and caused an ICE. But I could probably construct a case where it > > pointed to a real label and could result in incorrect code generation. > > > > The fix is pretty simple. Just creating a new variable (to avoid -Wshadow) > > inside that first outer IF is sufficient. > > > > Tested by building the affected target (mipsisa64r2el-elf) through newlib. > > > > Installed on the trunk. > > > > jeff > > > > diff --git a/gcc/ChangeLog b/gcc/ChangeLog > > index 8cceb247a85..18b6ed59c73 100644 > > --- a/gcc/ChangeLog > > +++ b/gcc/ChangeLog > > @@ -1,5 +1,8 @@ > > 2017-05-15 Jeff Law <l...@redhat.com> > > > > + * reorg.c (relax_delay_slots): Create a new variable to hold > > + the temporary target rather than clobbering TARGET_LABEL. > > + > > * config/tilegx/tilegx.c (tilegx_expand_unaligned_load): Add > > missing argument to extract_bit_field call. > > * config/tilepro/tilepro.c (tilepro_expand_unaligned_load): > > Likewise. > > diff --git a/gcc/reorg.c b/gcc/reorg.c > > index 85ef7d6880c..1a6fd86e286 100644 > > --- a/gcc/reorg.c > > +++ b/gcc/reorg.c > > @@ -3351,16 +3351,16 @@ relax_delay_slots (rtx_insn *first) > > && simplejump_or_return_p (trial_seq->insn (0)) > > && redundant_insn (trial_seq->insn (1), insn, vNULL)) > > { > > - target_label = JUMP_LABEL (trial_seq->insn (0)); > > - if (ANY_RETURN_P (target_label)) > > - target_label = find_end_label (target_label); > > + rtx temp_label = JUMP_LABEL (trial_seq->insn (0)); > > + if (ANY_RETURN_P (temp_label)) > > + temp_label = find_end_label (temp_label); > > > > - if (target_label > > + if (temp_label > > && redirect_with_delay_slots_safe_p (delay_jump_insn, > > - target_label, insn)) > > + temp_label, insn)) > > { > > update_block (trial_seq->insn (1), insn); > > - reorg_redirect_jump (delay_jump_insn, target_label); > > + reorg_redirect_jump (delay_jump_insn, temp_label); > > next = insn; > > continue; > > } > > diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog > > index f198fc6b42b..9fb8c8598b8 100644 > > --- a/gcc/testsuite/ChangeLog > > +++ b/gcc/testsuite/ChangeLog > > @@ -1,3 +1,7 @@ > > +2017-05-15 Jeff Law <l...@redhat.com> > > + > > + * gcc.target/mips/reorgbug-1.c: New test. > > + > > 2017-05-15 Pierre-Marie de Rodat <dero...@adacore.com> > > > > * gnat.dg/specs/pack13.ads: New test. > > diff --git a/gcc/testsuite/gcc.target/mips/reorgbug-1.c > > b/gcc/testsuite/gcc.target/mips/reorgbug-1.c > > new file mode 100644 > > index 00000000000..b820a2b5df1 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/mips/reorgbug-1.c > > @@ -0,0 +1,39 @@ > > +/* { dg-options "-O2 -msoft-float -mips2" } */ > > + > > +typedef long int __int32_t; > > +typedef long unsigned int __uint32_t; > > +typedef union > > +{ > > + double value; > > + struct > > + { > > + __uint32_t msw; > > + __uint32_t lsw; > > + } > > + parts; > > +} > > +ieee_double_shape_type; > > +double > > +__ieee754_fmod (double x, double y, int z, int xx) > > +{ > > + __int32_t n, hx, hy, hz, ix, iy, sx, i; > > + __uint32_t lx, ly, lz; > > + ieee_double_shape_type ew_u; > > + ew_u.value = (x); > > + (lx) = ew_u.parts.lsw; > > + ew_u.value = (y); > > + (hy) = ew_u.parts.msw; > > + (ly) = ew_u.parts.lsw; > > + if (hy == 0 || hx >= 0x7ff00000) > > + return (x * y); > > + if (z) > > + { > > + if ((hx < hy) || (lx < ly)) > > + return x; > > + lz = lx - ly; > > + lx = lz + lz; > > + } > > + ieee_double_shape_type iw_u; > > + iw_u.parts.lsw = (lx); > > + return iw_u.value; > > +} > >