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;
> +}
>

Reply via email to