From e30ce0a36c89794543381b3699cc23011af4e85c Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 15 May 2017 11:21:31 -0600 Subject: [PATCH] reorg.c (relax_delay_slots): Create a new variable to hold the temporary target rather than clobbering... * reorg.c (relax_delay_slots): Create a new variable to hold the temporary target rather than clobbering TARGET_LABEL. * gcc.target/mips/reorgbug-1.c: New test. From-SVN: r248067 --- gcc/ChangeLog | 3 ++ gcc/reorg.c | 12 +++---- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.target/mips/reorgbug-1.c | 39 ++++++++++++++++++++++ 4 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/mips/reorgbug-1.c 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 + * 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 + + * gcc.target/mips/reorgbug-1.c: New test. + 2017-05-15 Pierre-Marie de Rodat * 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; +} -- 2.30.2