On Tue, Oct 10, 2023 at 9:29 PM Jiufu Guo <guoji...@linux.ibm.com> wrote:

> Hi,
>
> There are some piece of code like below in rs6000.cc:
>
>  ...
>  if (xx)
>    return x;
>  else if (yy)
>    return y;
>  ... //else if chain
>  else
>    return d;
>
> Using early outs would be more preferable for this kind of code.
>

Why?

This seems like premature optimization.

Thanks, David


>
> The whole function rs6000_emit_set_long_const and num_insns_constant_gpr
> are refined.  And similar code are also restuctured in rs6000.cc.
>
> This patch pass bootstrap and regtest on ppc64{,le}.
> Is this ok for trunk?
>
> BR,
> Jeff (Jiufu Guo)
>
> gcc/ChangeLog:
>
>         * config/rs6000/rs6000.cc (vspltis_shifted): Adopt early outs.
>         (rs6000_cost_data::determine_suggested_unroll_factor): Likewise.
>         (num_insns_constant_gpr): Likewise.
>         (easy_altivec_constant): Likewise.
>         (output_vec_const_move): Likewise.
>         (rs6000_expand_vector_set): Likewise.
>         (rs6000_legitimize_address): Likewise.
>         (rs6000_emit_set_long_const): Likewise.
>         (rs6000_preferred_reload_class): Likewise.
>         (rs6000_can_change_mode_class): Likewise.
>         (rs6000_output_move_128bit): Likewise.
>         (rs6000_emit_vector_cond_expr): Likewise.
>         (adjacent_mem_locations): Likewise.
>         (is_fusable_store): Likewise.
>         (insn_terminates_group_p): Likewise.
>         (rs6000_elf_reloc_rw_mask): Likewise.
>         (rs6000_rtx_costs): Likewise.
>         (rs6000_scalar_mode_supported_p): Likewise.
>         (rs6000_update_ipa_fn_target_info): Likewise.
>         (reg_to_non_prefixed): Likewise.
>         (rs6000_split_logical_inner): Likewise.
>         (rs6000_opaque_type_invalid_use_p): Likewise.
>
> ---
>  gcc/config/rs6000/rs6000.cc | 495 ++++++++++++++++++------------------
>  1 file changed, 249 insertions(+), 246 deletions(-)
>
> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
> index d10d22a5816..43681d9eb08 100644
> --- a/gcc/config/rs6000/rs6000.cc
> +++ b/gcc/config/rs6000/rs6000.cc
> @@ -5522,24 +5522,22 @@
> rs6000_cost_data::determine_suggested_unroll_factor (loop_vec_info
> loop_vinfo)
>         to vectorize it with the unrolled VF any more if the actual
> iteration
>         count is in between.  */
>      return 1;
> -  else
> -    {
> -      unsigned int epil_niter_unr = est_niter % unrolled_vf;
> -      unsigned int epil_niter = est_niter % vf;
> -      /* Even if we have partial vector support, it can be still
> inefficent
> -        to calculate the length when the iteration count is unknown, so
> -        only expect it's good to unroll when the epilogue iteration count
> -        is not bigger than VF (only one time length calculation).  */
> -      if (LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)
> -         && epil_niter_unr <= vf)
> -       return uf;
> -      /* Without partial vector support, conservatively unroll this when
> -        the epilogue iteration count is less than the original one
> -        (epilogue execution time wouldn't be longer than before).  */
> -      else if (!LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)
> -              && epil_niter_unr <= epil_niter)
> -       return uf;
> -    }
> +
> +  unsigned int epil_niter_unr = est_niter % unrolled_vf;
> +  unsigned int epil_niter = est_niter % vf;
> +  /* Even if we have partial vector support, it can be still inefficent
> +     to calculate the length when the iteration count is unknown, so
> +     only expect it's good to unroll when the epilogue iteration count
> +     is not bigger than VF (only one time length calculation).  */
> +  if (LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo) && epil_niter_unr
> <= vf)
> +    return uf;
> +
> +  /* Without partial vector support, conservatively unroll this when
> +     the epilogue iteration count is less than the original one
> +     (epilogue execution time wouldn't be longer than before).  */
> +  if (!LOOP_VINFO_CAN_USE_PARTIAL_VECTORS_P (loop_vinfo)
> +      && epil_niter_unr <= epil_niter)
> +    return uf;
>
>    return 1;
>  }
> @@ -6044,35 +6042,31 @@ num_insns_constant_gpr (HOST_WIDE_INT value)
>      return 1;
>
>    /* constant loadable with addis */
> -  else if ((value & 0xffff) == 0
> -          && (value >> 31 == -1 || value >> 31 == 0))
> +  if ((value & 0xffff) == 0 && (value >> 31 == -1 || value >> 31 == 0))
>      return 1;
>
>    /* PADDI can support up to 34 bit signed integers.  */
> -  else if (TARGET_PREFIXED && SIGNED_INTEGER_34BIT_P (value))
> +  if (TARGET_PREFIXED && SIGNED_INTEGER_34BIT_P (value))
>      return 1;
>
> -  else if (TARGET_POWERPC64)
> -    {
> -      HOST_WIDE_INT low = sext_hwi (value, 32);
> -      HOST_WIDE_INT high = value >> 31;
> +  if (!TARGET_POWERPC64)
> +    return 2;
>
> -      if (high == 0 || high == -1)
> -       return 2;
> +  /* TARGET_POWERPC64 */
> +  HOST_WIDE_INT low = sext_hwi (value, 32);
> +  HOST_WIDE_INT high = value >> 31;
> +
> +  if (high == 0 || high == -1)
> +    return 2;
>
> -      high >>= 1;
> +  high >>= 1;
>
> -      if (low == 0 || low == high)
> -       return num_insns_constant_gpr (high) + 1;
> -      else if (high == 0)
> -       return num_insns_constant_gpr (low) + 1;
> -      else
> -       return (num_insns_constant_gpr (high)
> -               + num_insns_constant_gpr (low) + 1);
> -    }
> +  if (low == 0 || low == high)
> +    return num_insns_constant_gpr (high) + 1;
> +  if (high == 0)
> +    return num_insns_constant_gpr (low) + 1;
>
> -  else
> -    return 2;
> +  return (num_insns_constant_gpr (high) + num_insns_constant_gpr (low) +
> 1);
>  }
>
>  /* Helper for num_insns_constant.  Allow constants formed by the
> @@ -6378,7 +6372,7 @@ vspltis_shifted (rtx op)
>         {
>           if (elt_val == 0)
>             {
> -             for (j = i+1; j < nunits; ++j)
> +             for (j = i + 1; j < nunits; ++j)
>                 {
>                   unsigned elt2 = BYTES_BIG_ENDIAN ? j : nunits - 1 - j;
>                   if (const_vector_elt_as_int (op, elt2) != 0)
> @@ -6388,9 +6382,9 @@ vspltis_shifted (rtx op)
>               return (nunits - i) * GET_MODE_SIZE (inner);
>             }
>
> -         else if ((elt_val & mask) == mask)
> +         if ((elt_val & mask) == mask)
>             {
> -             for (j = i+1; j < nunits; ++j)
> +             for (j = i + 1; j < nunits; ++j)
>                 {
>                   unsigned elt2 = BYTES_BIG_ENDIAN ? j : nunits - 1 - j;
>                   if ((const_vector_elt_as_int (op, elt2) & mask) != mask)
> @@ -6400,8 +6394,7 @@ vspltis_shifted (rtx op)
>               return -((nunits - i) * GET_MODE_SIZE (inner));
>             }
>
> -         else
> -           return 0;
> +         return 0;
>         }
>      }
>
> @@ -6428,7 +6421,7 @@ easy_altivec_constant (rtx op, machine_mode mode)
>    if (mode == V2DFmode)
>      return zero_constant (op, mode) ? 8 : 0;
>
> -  else if (mode == V2DImode)
> +  if (mode == V2DImode)
>      {
>        if (!CONST_INT_P (CONST_VECTOR_ELT (op, 0))
>           || !CONST_INT_P (CONST_VECTOR_ELT (op, 1)))
> @@ -6445,7 +6438,7 @@ easy_altivec_constant (rtx op, machine_mode mode)
>      }
>
>    /* V1TImode is a special container for TImode.  Ignore for now.  */
> -  else if (mode == V1TImode)
> +  if (mode == V1TImode)
>      return 0;
>
>    /* Start with a vspltisw.  */
> @@ -6695,11 +6688,10 @@ output_vec_const_move (rtx *operands)
>           if (TARGET_P9_VECTOR)
>             return "xxspltib %x0,0";
>
> -         else if (dest_vmx_p)
> +         if (dest_vmx_p)
>             return "vspltisw %0,0";
>
> -         else
> -           return "xxlxor %x0,%x0,%x0";
> +         return "xxlxor %x0,%x0,%x0";
>         }
>
>        if (all_ones_constant (vec, mode))
> @@ -6707,14 +6699,13 @@ output_vec_const_move (rtx *operands)
>           if (TARGET_P9_VECTOR)
>             return "xxspltib %x0,255";
>
> -         else if (dest_vmx_p)
> +         if (dest_vmx_p)
>             return "vspltisw %0,-1";
>
> -         else if (TARGET_P8_VECTOR)
> +         if (TARGET_P8_VECTOR)
>             return "xxlorc %x0,%x0,%x0";
>
> -         else
> -           gcc_unreachable ();
> +         gcc_unreachable ();
>         }
>
>        vec_const_128bit_type vsx_const;
> @@ -6745,13 +6736,11 @@ output_vec_const_move (rtx *operands)
>        if (TARGET_P9_VECTOR
>           && xxspltib_constant_p (vec, mode, &num_insns, &xxspltib_value))
>         {
> -         if (num_insns == 1)
> -           {
> -             operands[2] = GEN_INT (xxspltib_value & 0xff);
> -             return "xxspltib %x0,%2";
> -           }
> +         if (num_insns != 1)
> +           return "#";
>
> -         return "#";
> +         operands[2] = GEN_INT (xxspltib_value & 0xff);
> +         return "xxspltib %x0,%2";
>         }
>      }
>
> @@ -7482,13 +7471,14 @@ rs6000_expand_vector_set (rtx target, rtx val, rtx
> elt_rtx)
>               rs6000_expand_vector_set_var_p9 (target, val, elt_rtx);
>               return;
>             }
> -         else if (TARGET_VSX)
> +
> +         if (TARGET_VSX)
>             {
>               rs6000_expand_vector_set_var_p7 (target, val, elt_rtx);
>               return;
>             }
> -         else
> -           gcc_assert (CONST_INT_P (elt_rtx));
> +
> +         gcc_assert (CONST_INT_P (elt_rtx));
>         }
>
>        rtx insn = NULL_RTX;
> @@ -9095,35 +9085,37 @@ legitimate_lo_sum_address_p (machine_mode mode,
> rtx x, int strict)
>
>        return CONSTANT_P (x) || large_toc_ok;
>      }
> -  else if (TARGET_MACHO)
> -    {
> -      if (GET_MODE_NUNITS (mode) != 1)
> -       return false;
> -      if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
> -         && !(/* see above  */
> -              TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode)))
> -       return false;
> +
> +  if (!TARGET_MACHO)
> +    return false;
> +
> +  /* TARGET_MACHO */
> +  if (GET_MODE_NUNITS (mode) != 1)
> +    return false;
> +  if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
> +      && !(/* see above  */
> +          TARGET_HARD_FLOAT && (mode == DFmode || mode == DDmode)))
> +    return false;
> +
>  #if TARGET_MACHO
> -      if (MACHO_DYNAMIC_NO_PIC_P || !flag_pic)
> -       return CONSTANT_P (x);
> +  if (MACHO_DYNAMIC_NO_PIC_P || !flag_pic)
> +    return CONSTANT_P (x);
>  #endif
> -      /* Macho-O PIC code from here.  */
> -      if (GET_CODE (x) == CONST)
> -       x = XEXP (x, 0);
>
> -      /* SYMBOL_REFs need to be wrapped in an UNSPEC_MACHOPIC_OFFSET.  */
> -      if (SYMBOL_REF_P (x))
> -       return false;
> +  /* Macho-O PIC code from here.  */
> +  if (GET_CODE (x) == CONST)
> +    x = XEXP (x, 0);
>
> -      /* So this is OK if the wrapped object is const.  */
> -      if (GET_CODE (x) == UNSPEC
> -         && XINT (x, 1) == UNSPEC_MACHOPIC_OFFSET)
> -       return CONSTANT_P (XVECEXP (x, 0, 0));
> -      return CONSTANT_P (x);
> -    }
> -  return false;
> -}
> +  /* SYMBOL_REFs need to be wrapped in an UNSPEC_MACHOPIC_OFFSET.  */
> +  if (SYMBOL_REF_P (x))
> +    return false;
>
> +  /* So this is OK if the wrapped object is const.  */
> +  if (GET_CODE (x) == UNSPEC && XINT (x, 1) == UNSPEC_MACHOPIC_OFFSET)
> +    return CONSTANT_P (XVECEXP (x, 0, 0));
> +
> +  return CONSTANT_P (x);
> +}
>
>  /* Try machine-dependent ways of modifying an illegitimate address
>     to be legitimate.  If we find one, return the new, valid address.
> @@ -9166,13 +9158,13 @@ rs6000_legitimize_address (rtx x, rtx oldx
> ATTRIBUTE_UNUSED,
>        /* For TImode with load/store quad, restrict addresses to just a
> single
>          pointer, so it works with both GPRs and VSX registers.  */
>        /* Make sure both operands are registers.  */
> -      else if (GET_CODE (x) == PLUS
> +      if (GET_CODE (x) == PLUS
>                && (mode != TImode || !TARGET_VSX))
>         return gen_rtx_PLUS (Pmode,
>                              force_reg (Pmode, XEXP (x, 0)),
>                              force_reg (Pmode, XEXP (x, 1)));
> -      else
> -       return force_reg (Pmode, x);
> +
> +      return force_reg (Pmode, x);
>      }
>    if (SYMBOL_REF_P (x) && !TARGET_MACHO)
>      {
> @@ -9217,7 +9209,8 @@ rs6000_legitimize_address (rtx x, rtx oldx
> ATTRIBUTE_UNUSED,
>                                          gen_int_mode (high_int, Pmode)),
> 0);
>        return plus_constant (Pmode, sum, low_int);
>      }
> -  else if (GET_CODE (x) == PLUS
> +
> +  if (GET_CODE (x) == PLUS
>            && REG_P (XEXP (x, 0))
>            && !CONST_INT_P (XEXP (x, 1))
>            && GET_MODE_NUNITS (mode) == 1
> @@ -9225,11 +9218,10 @@ rs6000_legitimize_address (rtx x, rtx oldx
> ATTRIBUTE_UNUSED,
>                || (/* ??? Assume floating point reg based on mode?  */
>                    TARGET_HARD_FLOAT && (mode == DFmode || mode ==
> DDmode)))
>            && !avoiding_indexed_address_p (mode))
> -    {
> -      return gen_rtx_PLUS (Pmode, XEXP (x, 0),
> -                          force_reg (Pmode, force_operand (XEXP (x, 1),
> 0)));
> -    }
> -  else if ((TARGET_ELF
> +    return gen_rtx_PLUS (Pmode, XEXP (x, 0),
> +                        force_reg (Pmode, force_operand (XEXP (x, 1),
> 0)));
> +
> +  if ((TARGET_ELF
>  #if TARGET_MACHO
>             || !MACHO_DYNAMIC_NO_PIC_P
>  #endif
> @@ -9253,13 +9245,14 @@ rs6000_legitimize_address (rtx x, rtx oldx
> ATTRIBUTE_UNUSED,
>         emit_insn (gen_macho_high (Pmode, reg, x));
>        return gen_rtx_LO_SUM (Pmode, reg, x);
>      }
> -  else if (TARGET_TOC
> +
> +  if (TARGET_TOC
>            && SYMBOL_REF_P (x)
>            && constant_pool_expr_p (x)
>            && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x),
> Pmode))
>      return create_TOC_reference (x, NULL_RTX);
> -  else
> -    return x;
> +
> +  return x;
>  }
>
>  /* Debug version of rs6000_legitimize_address.  */
> @@ -10487,11 +10480,14 @@ rs6000_emit_set_long_const (rtx dest,
> HOST_WIDE_INT c)
>    ud4 = (c >> 48) & 0xffff;
>
>    if ((ud4 == 0xffff && ud3 == 0xffff && ud2 == 0xffff && (ud1 & 0x8000))
> -      || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000)))
> -    emit_move_insn (dest, GEN_INT (sext_hwi (ud1, 16)));
> +      || (ud4 == 0 && ud3 == 0 && ud2 == 0 && !(ud1 & 0x8000)))
> +    {
> +      emit_move_insn (dest, GEN_INT (sext_hwi (ud1, 16)));
> +      return;
> +    }
>
> -  else if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
> -          || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
> +  if ((ud4 == 0xffff && ud3 == 0xffff && (ud2 & 0x8000))
> +      || (ud4 == 0 && ud3 == 0 && !(ud2 & 0x8000)))
>      {
>        temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
>
> @@ -10499,26 +10495,35 @@ rs6000_emit_set_long_const (rtx dest,
> HOST_WIDE_INT c)
>                       GEN_INT (sext_hwi (ud2 << 16, 32)));
>        if (ud1 != 0)
>         emit_move_insn (dest, gen_rtx_IOR (DImode, temp, GEN_INT (ud1)));
> +
> +      return;
>      }
> -  else if (ud4 == 0xffff && ud3 == 0xffff && !(ud2 & 0x8000) && ud1 == 0)
> +
> +  if (ud4 == 0xffff && ud3 == 0xffff && !(ud2 & 0x8000) && ud1 == 0)
>      {
>        /* lis; xoris */
>        temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
>        emit_move_insn (temp, GEN_INT (sext_hwi ((ud2 | 0x8000) << 16,
> 32)));
>        emit_move_insn (dest, gen_rtx_XOR (DImode, temp, GEN_INT
> (0x80000000)));
> +
> +      return;
>      }
> -  else if (ud4 == 0xffff && ud3 == 0xffff && (ud1 & 0x8000))
> +
> +  if (ud4 == 0xffff && ud3 == 0xffff && (ud1 & 0x8000))
>      {
>        /* li; xoris */
>        temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
>        emit_move_insn (temp, GEN_INT (sext_hwi (ud1, 16)));
>        emit_move_insn (dest, gen_rtx_XOR (DImode, temp,
>                                          GEN_INT ((ud2 ^ 0xffff) << 16)));
> +      return;
>      }
> -  else if (can_be_built_by_li_lis_and_rotldi (c, &shift, &mask)
> -          || can_be_built_by_li_lis_and_rldicl (c, &shift, &mask)
> -          || can_be_built_by_li_lis_and_rldicr (c, &shift, &mask)
> -          || can_be_built_by_li_and_rldic (c, &shift, &mask))
> +
> +  /* li/lis; rldicl/rldicr/rldic */
> +  if (can_be_built_by_li_lis_and_rotldi (c, &shift, &mask)
> +      || can_be_built_by_li_lis_and_rldicl (c, &shift, &mask)
> +      || can_be_built_by_li_lis_and_rldicr (c, &shift, &mask)
> +      || can_be_built_by_li_and_rldic (c, &shift, &mask))
>      {
>        temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
>        unsigned HOST_WIDE_INT imm = (c | ~mask);
> @@ -10530,8 +10535,11 @@ rs6000_emit_set_long_const (rtx dest,
> HOST_WIDE_INT c)
>        if (mask != HOST_WIDE_INT_M1)
>         temp = gen_rtx_AND (DImode, temp, GEN_INT (mask));
>        emit_move_insn (dest, temp);
> +
> +      return;
>      }
> -  else if (ud3 == 0 && ud4 == 0)
> +
> +  if (ud3 == 0 && ud4 == 0)
>      {
>        temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
>
> @@ -10543,24 +10551,27 @@ rs6000_emit_set_long_const (rtx dest,
> HOST_WIDE_INT c)
>           emit_move_insn (temp, GEN_INT (sext_hwi (ud2 << 16, 32)));
>           emit_move_insn (dest,
>                           gen_rtx_AND (DImode, temp, GEN_INT
> (0xffffffff)));
> +         return;
>         }
> -      else if (!(ud1 & 0x8000))
> +
> +      if (!(ud1 & 0x8000))
>         {
>           /* li; oris */
>           emit_move_insn (temp, GEN_INT (ud1));
>           emit_move_insn (dest,
>                           gen_rtx_IOR (DImode, temp, GEN_INT (ud2 << 16)));
> +         return;
>         }
> -      else
> -       {
> -         /* lis; ori; rldicl */
> -         emit_move_insn (temp, GEN_INT (sext_hwi (ud2 << 16, 32)));
> -         emit_move_insn (temp, gen_rtx_IOR (DImode, temp, GEN_INT (ud1)));
> -         emit_move_insn (dest,
> -                         gen_rtx_AND (DImode, temp, GEN_INT
> (0xffffffff)));
> -       }
> +
> +      /* lis; ori; rldicl */
> +      emit_move_insn (temp, GEN_INT (sext_hwi (ud2 << 16, 32)));
> +      emit_move_insn (temp, gen_rtx_IOR (DImode, temp, GEN_INT (ud1)));
> +      emit_move_insn (dest, gen_rtx_AND (DImode, temp, GEN_INT
> (0xffffffff)));
> +
> +      return;
>      }
> -  else if (ud1 == ud3 && ud2 == ud4)
> +
> +  if (ud1 == ud3 && ud2 == ud4)
>      {
>        temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
>        HOST_WIDE_INT num = (ud2 << 16) | ud1;
> @@ -10568,9 +10579,11 @@ rs6000_emit_set_long_const (rtx dest,
> HOST_WIDE_INT c)
>        rtx one = gen_rtx_AND (DImode, temp, GEN_INT (0xffffffff));
>        rtx two = gen_rtx_ASHIFT (DImode, temp, GEN_INT (32));
>        emit_move_insn (dest, gen_rtx_IOR (DImode, one, two));
> +
> +      return;
>      }
> -  else if ((ud4 == 0xffff && (ud3 & 0x8000))
> -          || (ud4 == 0 && ! (ud3 & 0x8000)))
> +
> +  if ((ud4 == 0xffff && (ud3 & 0x8000)) || (ud4 == 0 && !(ud3 & 0x8000)))
>      {
>        temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode);
>
> @@ -10581,8 +10594,11 @@ rs6000_emit_set_long_const (rtx dest,
> HOST_WIDE_INT c)
>                       gen_rtx_ASHIFT (DImode, temp, GEN_INT (16)));
>        if (ud1 != 0)
>         emit_move_insn (dest, gen_rtx_IOR (DImode, temp, GEN_INT (ud1)));
> +
> +      return;
>      }
> -  else if (TARGET_PREFIXED)
> +
> +  if (TARGET_PREFIXED)
>      {
>        if (can_create_pseudo_p ())
>         {
> @@ -10594,60 +10610,55 @@ rs6000_emit_set_long_const (rtx dest,
> HOST_WIDE_INT c)
>
>           emit_insn (gen_rotldi3_insert_3 (dest, temp, GEN_INT (32), temp1,
>                                            GEN_INT (0xffffffff)));
> +         return;
>         }
> -      else
> -       {
> -         /* pli A,H + sldi A,32 + paddi A,A,L.  */
> -         emit_move_insn (dest, GEN_INT ((ud4 << 16) | ud3));
>
> -         emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT
> (32)));
> +      /* pli A,H + sldi A,32 + paddi A,A,L.  */
> +      emit_move_insn (dest, GEN_INT ((ud4 << 16) | ud3));
> +      emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
>
> -         bool can_use_paddi = REGNO (dest) != FIRST_GPR_REGNO;
> +      bool can_use_paddi = REGNO (dest) != FIRST_GPR_REGNO;
> +      /* Use paddi for the low 32 bits.  */
> +      if (ud2 != 0 && ud1 != 0 && can_use_paddi)
> +       emit_move_insn (dest, gen_rtx_PLUS (DImode, dest,
> +                                           GEN_INT ((ud2 << 16) | ud1)));
>
> -         /* Use paddi for the low 32 bits.  */
> -         if (ud2 != 0 && ud1 != 0 && can_use_paddi)
> -           emit_move_insn (dest, gen_rtx_PLUS (DImode, dest,
> -                                               GEN_INT ((ud2 << 16) |
> ud1)));
> +      /* Use oris, ori for low 32 bits.  */
> +      if (ud2 != 0 && (ud1 == 0 || !can_use_paddi))
> +       emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2 <<
> 16)));
> +      if (ud1 != 0 && (ud2 == 0 || !can_use_paddi))
> +       emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
>
> -         /* Use oris, ori for low 32 bits.  */
> -         if (ud2 != 0 && (ud1 == 0 || !can_use_paddi))
> -           emit_move_insn (dest,
> -                           gen_rtx_IOR (DImode, dest, GEN_INT (ud2 <<
> 16)));
> -         if (ud1 != 0 && (ud2 == 0 || !can_use_paddi))
> -           emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT
> (ud1)));
> -       }
> +      return;
>      }
> -  else
> -    {
> -      if (can_create_pseudo_p ())
> -       {
> -         /* lis HIGH,UD4 ; ori HIGH,UD3 ;
> -            lis LOW,UD2 ; ori LOW,UD1 ; rldimi LOW,HIGH,32,0.  */
> -         rtx high = gen_reg_rtx (DImode);
> -         rtx low = gen_reg_rtx (DImode);
> -         HOST_WIDE_INT num = (ud2 << 16) | ud1;
> -         rs6000_emit_set_long_const (low, sext_hwi (num, 32));
> -         num = (ud4 << 16) | ud3;
> -         rs6000_emit_set_long_const (high, sext_hwi (num, 32));
> -         emit_insn (gen_rotldi3_insert_3 (dest, high, GEN_INT (32), low,
> -                                          GEN_INT (0xffffffff)));
> -       }
> -      else
> -       {
> -         /* lis DEST,UD4 ; ori DEST,UD3 ; rotl DEST,32 ;
> -            oris DEST,UD2 ; ori DEST,UD1.  */
> -         emit_move_insn (dest, GEN_INT (sext_hwi (ud4 << 16, 32)));
> -         if (ud3 != 0)
> -           emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT
> (ud3)));
>
> -         emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT
> (32)));
> -         if (ud2 != 0)
> -           emit_move_insn (dest,
> -                           gen_rtx_IOR (DImode, dest, GEN_INT (ud2 <<
> 16)));
> -         if (ud1 != 0)
> -           emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT
> (ud1)));
> -       }
> +  /* using 5 insn to build the constant.  */
> +  if (can_create_pseudo_p ())
> +    {
> +      /* lis HIGH,UD4 ; ori HIGH,UD3 ;
> +        lis LOW,UD2 ; ori LOW,UD1 ; rldimi LOW,HIGH,32,0.  */
> +      rtx high = gen_reg_rtx (DImode);
> +      rtx low = gen_reg_rtx (DImode);
> +      HOST_WIDE_INT num = (ud2 << 16) | ud1;
> +      rs6000_emit_set_long_const (low, sext_hwi (num, 32));
> +      num = (ud4 << 16) | ud3;
> +      rs6000_emit_set_long_const (high, sext_hwi (num, 32));
> +      emit_insn (gen_rotldi3_insert_3 (dest, high, GEN_INT (32), low,
> +                                      GEN_INT (0xffffffff)));
> +      return;
>      }
> +
> +  /* lis DEST,UD4 ; ori DEST,UD3 ; rotl DEST,32 ;
> +     oris DEST,UD2 ; ori DEST,UD1.  */
> +  emit_move_insn (dest, GEN_INT (sext_hwi (ud4 << 16, 32)));
> +  if (ud3 != 0)
> +    emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud3)));
> +
> +  emit_move_insn (dest, gen_rtx_ASHIFT (DImode, dest, GEN_INT (32)));
> +  if (ud2 != 0)
> +    emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud2 <<
> 16)));
> +  if (ud1 != 0)
> +    emit_move_insn (dest, gen_rtx_IOR (DImode, dest, GEN_INT (ud1)));
>  }
>
>  /* Helper for the following.  Get rid of [r+r] memory refs
> @@ -13356,10 +13367,10 @@ rs6000_preferred_reload_class (rtx x, enum
> reg_class rclass)
>                 {
>                   if (TARGET_P8_VECTOR)
>                     return rclass;
> -                 else if (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
> +                 if (rclass == ALTIVEC_REGS || rclass == VSX_REGS)
>                     return ALTIVEC_REGS;
> -                 else
> -                   return NO_REGS;
> +
> +                 return NO_REGS;
>                 }
>
>               /* ISA 3.0 can load -128..127 using the XXSPLTIB instruction
> and
> @@ -13628,7 +13639,7 @@ rs6000_can_change_mode_class (machine_mode from,
>           if (to_float128_vector_p && from_float128_vector_p)
>             return true;
>
> -         else if (to_float128_vector_p || from_float128_vector_p)
> +         if (to_float128_vector_p || from_float128_vector_p)
>             return false;
>
>           /* TDmode in floating-mode registers must always go into a
> register
> @@ -13757,7 +13768,7 @@ rs6000_output_move_128bit (rtx operands[])
>                     ? "mfvsrd %0,%x1\n\tmfvsrld %L0,%x1"
>                     : "mfvsrd %L0,%x1\n\tmfvsrld %0,%x1");
>
> -         else if (TARGET_VSX && TARGET_DIRECT_MOVE && src_vsx_p)
> +         if (TARGET_VSX && TARGET_DIRECT_MOVE && src_vsx_p)
>             return "#";
>         }
>
> @@ -13766,12 +13777,12 @@ rs6000_output_move_128bit (rtx operands[])
>           if (src_vsx_p)
>             return "xxlor %x0,%x1,%x1";
>
> -         else if (TARGET_DIRECT_MOVE_128 && src_gpr_p)
> +         if (TARGET_DIRECT_MOVE_128 && src_gpr_p)
>             return (WORDS_BIG_ENDIAN
>                     ? "mtvsrdd %x0,%1,%L1"
>                     : "mtvsrdd %x0,%L1,%1");
>
> -         else if (TARGET_DIRECT_MOVE && src_gpr_p)
> +         if (TARGET_DIRECT_MOVE && src_gpr_p)
>             return "#";
>         }
>
> @@ -13789,34 +13800,33 @@ rs6000_output_move_128bit (rtx operands[])
>         {
>           if (TARGET_QUAD_MEMORY && quad_load_store_p (dest, src))
>             return "lq %0,%1";
> -         else
> -           return "#";
> +
> +         return "#";
>         }
>
> -      else if (TARGET_ALTIVEC && dest_vmx_p
> -              && altivec_indexed_or_indirect_operand (src, mode))
> +      if (TARGET_ALTIVEC && dest_vmx_p
> +         && altivec_indexed_or_indirect_operand (src, mode))
>         return "lvx %0,%y1";
>
> -      else if (TARGET_VSX && dest_vsx_p)
> +      if (TARGET_VSX && dest_vsx_p)
>         {
>           if (mode_supports_dq_form (mode)
>               && quad_address_p (XEXP (src, 0), mode, true))
>             return "lxv %x0,%1";
>
> -         else if (TARGET_P9_VECTOR)
> +         if (TARGET_P9_VECTOR)
>             return "lxvx %x0,%y1";
>
> -         else if (mode == V16QImode || mode == V8HImode || mode ==
> V4SImode)
> +         if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
>             return "lxvw4x %x0,%y1";
>
> -         else
> -           return "lxvd2x %x0,%y1";
> +         return "lxvd2x %x0,%y1";
>         }
>
> -      else if (TARGET_ALTIVEC && dest_vmx_p)
> +      if (TARGET_ALTIVEC && dest_vmx_p)
>         return "lvx %0,%y1";
>
> -      else if (dest_fp_p)
> +      if (dest_fp_p)
>         return "#";
>      }
>
> @@ -13825,51 +13835,47 @@ rs6000_output_move_128bit (rtx operands[])
>      {
>        if (src_gpr_p)
>         {
> -         if (TARGET_QUAD_MEMORY && quad_load_store_p (dest, src))
> +         if (TARGET_QUAD_MEMORY && quad_load_store_p (dest, src))
>             return "stq %1,%0";
> -         else
> -           return "#";
> +
> +         return "#";
>         }
>
> -      else if (TARGET_ALTIVEC && src_vmx_p
> -              && altivec_indexed_or_indirect_operand (dest, mode))
> +      if (TARGET_ALTIVEC && src_vmx_p
> +         && altivec_indexed_or_indirect_operand (dest, mode))
>         return "stvx %1,%y0";
>
> -      else if (TARGET_VSX && src_vsx_p)
> +      if (TARGET_VSX && src_vsx_p)
>         {
>           if (mode_supports_dq_form (mode)
>               && quad_address_p (XEXP (dest, 0), mode, true))
>             return "stxv %x1,%0";
>
> -         else if (TARGET_P9_VECTOR)
> +         if (TARGET_P9_VECTOR)
>             return "stxvx %x1,%y0";
>
> -         else if (mode == V16QImode || mode == V8HImode || mode ==
> V4SImode)
> +         if (mode == V16QImode || mode == V8HImode || mode == V4SImode)
>             return "stxvw4x %x1,%y0";
>
> -         else
> -           return "stxvd2x %x1,%y0";
> +         return "stxvd2x %x1,%y0";
>         }
>
> -      else if (TARGET_ALTIVEC && src_vmx_p)
> +      if (TARGET_ALTIVEC && src_vmx_p)
>         return "stvx %1,%y0";
>
> -      else if (src_fp_p)
> +      if (src_fp_p)
>         return "#";
>      }
>
>    /* Constants.  */
>    else if (dest_regno >= 0
> -          && (CONST_INT_P (src)
> -              || CONST_WIDE_INT_P (src)
> -              || CONST_DOUBLE_P (src)
> -              || GET_CODE (src) == CONST_VECTOR))
> +          && (CONST_INT_P (src) || CONST_WIDE_INT_P (src)
> +              || CONST_DOUBLE_P (src) || GET_CODE (src) == CONST_VECTOR))
>      {
>        if (dest_gpr_p)
>         return "#";
>
> -      else if ((dest_vmx_p && TARGET_ALTIVEC)
> -              || (dest_vsx_p && TARGET_VSX))
> +      if ((dest_vmx_p && TARGET_ALTIVEC) || (dest_vsx_p && TARGET_VSX))
>         return output_vec_const_move (operands);
>      }
>
> @@ -16201,7 +16207,7 @@ rs6000_emit_vector_cond_expr (rtx dest, rtx
> op_true, rtx op_false,
>           return 1;
>         }
>
> -      else if (op_true == constant_0 && op_false == constant_m1)
> +      if (op_true == constant_0 && op_false == constant_m1)
>         {
>           emit_insn (gen_rtx_SET (dest, gen_rtx_NOT (dest_mode, mask)));
>           return 1;
> @@ -18626,7 +18632,7 @@ adjacent_mem_locations (rtx mem1, rtx mem2)
>      {
>        if (off1 + size1 == off2)
>         return mem1;
> -      else if (off2 + size2 == off1)
> +      if (off2 + size2 == off1)
>         return mem2;
>      }
>
> @@ -19425,7 +19431,7 @@ is_fusable_store (rtx_insn *insn, rtx *str_mem)
>        if (INTEGRAL_MODE_P (mode))
>         /* Must be word or dword size.  */
>         return (size == 4 || size == 8);
> -      else if (FLOAT_MODE_P (mode))
> +      if (FLOAT_MODE_P (mode))
>         /* Must be dword size.  */
>         return (size == 8);
>      }
> @@ -19572,7 +19578,7 @@ insn_terminates_group_p (rtx_insn *insn, enum
> group_termination which_group)
>
>    if (which_group == current_group)
>      return last;
> -  else if (which_group == previous_group)
> +  if (which_group == previous_group)
>      return first;
>
>    return false;
> @@ -21189,10 +21195,10 @@ rs6000_elf_reloc_rw_mask (void)
>  {
>    if (flag_pic)
>      return 3;
> -  else if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
> +  if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
>      return 2;
> -  else
> -    return 0;
> +
> +  return 0;
>  }
>
>  /* Record an element in the table of global constructors.  SYMBOL is
> @@ -21617,28 +21623,26 @@ rs6000_xcoff_select_section (tree decl, int
> reloc,
>      {
>        if (TREE_PUBLIC (decl))
>         return read_only_data_section;
> -      else
> -       return read_only_private_data_section;
> +
> +      return read_only_private_data_section;
>      }
> -  else
> -    {
> +
>  #if HAVE_AS_TLS
> -      if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
> -       {
> -         if (bss_initializer_p (decl))
> -           return tls_comm_section;
> -         else if (TREE_PUBLIC (decl))
> -           return tls_data_section;
> -         else
> -           return tls_private_data_section;
> -       }
> -      else
> -#endif
> -       if (TREE_PUBLIC (decl))
> -       return data_section;
> -      else
> -       return private_data_section;
> +  if (TREE_CODE (decl) == VAR_DECL && DECL_THREAD_LOCAL_P (decl))
> +    {
> +      if (bss_initializer_p (decl))
> +       return tls_comm_section;
> +      if (TREE_PUBLIC (decl))
> +       return tls_data_section;
> +
> +      return tls_private_data_section;
>      }
> +#endif
> +
> +  if (TREE_PUBLIC (decl))
> +    return data_section;
> +
> +  return private_data_section;
>  }
>
>  static void
> @@ -22504,7 +22508,7 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int
> outer_code,
>           *total = COSTS_N_INSNS (1);
>           return true;
>         }
> -      else if (FLOAT_MODE_P (mode) && TARGET_PPC_GFXOPT &&
> TARGET_HARD_FLOAT)
> +      if (FLOAT_MODE_P (mode) && TARGET_PPC_GFXOPT && TARGET_HARD_FLOAT)
>         {
>           *total = rs6000_cost->fp;
>           return false;
> @@ -24232,10 +24236,10 @@ rs6000_scalar_mode_supported_p (scalar_mode mode)
>
>    if (DECIMAL_FLOAT_MODE_P (mode))
>      return default_decimal_float_supported_p ();
> -  else if (TARGET_FLOAT128_TYPE && (mode == KFmode || mode == IFmode))
> +  if (TARGET_FLOAT128_TYPE && (mode == KFmode || mode == IFmode))
>      return true;
> -  else
> -    return default_scalar_mode_supported_p (mode);
> +
> +  return default_scalar_mode_supported_p (mode);
>  }
>
>  /* Target hook for libgcc_floating_mode_supported_p.  */
> @@ -25670,7 +25674,8 @@ rs6000_update_ipa_fn_target_info (unsigned int
> &info, const gimple *stmt)
>         info |= RS6000_FN_TARGET_INFO_HTM;
>        return false;
>      }
> -  else if (gimple_code (stmt) == GIMPLE_CALL)
> +
> +  if (gimple_code (stmt) == GIMPLE_CALL)
>      {
>        tree fndecl = gimple_call_fndecl (stmt);
>        if (fndecl && fndecl_built_in_p (fndecl, BUILT_IN_MD))
> @@ -26725,23 +26730,22 @@ reg_to_non_prefixed (rtx reg, machine_mode mode)
>        if (mode == SFmode || size == 8 || FLOAT128_2REG_P (mode))
>         return NON_PREFIXED_D;
>
> -      else if (size < 8)
> +      if (size < 8)
>         return NON_PREFIXED_X;
>
> -      else if (TARGET_VSX && size >= 16
> +      if (TARGET_VSX && size >= 16
>                && (VECTOR_MODE_P (mode)
>                    || VECTOR_ALIGNMENT_P (mode)
>                    || mode == TImode || mode == CTImode))
>         return (TARGET_P9_VECTOR) ? NON_PREFIXED_DQ : NON_PREFIXED_X;
>
> -      else
> -       return NON_PREFIXED_DEFAULT;
> +      return NON_PREFIXED_DEFAULT;
>      }
>
>    /* Altivec registers use DS-mode for scalars, and DQ-mode for vectors,
> IEEE
>       128-bit floating point, and 128-bit integers.  Before power9, only
> indexed
>       addressing was available.  */
> -  else if (ALTIVEC_REGNO_P (r))
> +  if (ALTIVEC_REGNO_P (r))
>      {
>        if (!TARGET_P9_VECTOR)
>         return NON_PREFIXED_X;
> @@ -26749,23 +26753,22 @@ reg_to_non_prefixed (rtx reg, machine_mode mode)
>        if (mode == SFmode || size == 8 || FLOAT128_2REG_P (mode))
>         return NON_PREFIXED_DS;
>
> -      else if (size < 8)
> +      if (size < 8)
>         return NON_PREFIXED_X;
>
> -      else if (TARGET_VSX && size >= 16
> +      if (TARGET_VSX && size >= 16
>                && (VECTOR_MODE_P (mode)
>                    || VECTOR_ALIGNMENT_P (mode)
>                    || mode == TImode || mode == CTImode))
>         return NON_PREFIXED_DQ;
>
> -      else
> -       return NON_PREFIXED_DEFAULT;
> +      return NON_PREFIXED_DEFAULT;
>      }
>
>    /* GPR registers use DS-mode for 64-bit items on 64-bit systems, and
> D-mode
>       otherwise.  Assume that any other register, such as LR, CRs, etc.
> will go
>       through the GPR registers for memory operations.  */
> -  else if (TARGET_POWERPC64 && size >= 8)
> +  if (TARGET_POWERPC64 && size >= 8)
>      return NON_PREFIXED_DS;
>
>    return NON_PREFIXED_D;
> @@ -27125,7 +27128,7 @@ rs6000_split_logical_inner (rtx dest,
>               return;
>             }
>
> -         else if (value == mask)
> +         if (value == mask)
>             {
>               if (!rtx_equal_p (dest, op1))
>                 emit_insn (gen_rtx_SET (dest, op1));
> @@ -29234,7 +29237,7 @@ rs6000_opaque_type_invalid_use_p (gimple *stmt)
>         error ("type %<__vector_quad%> requires the %qs option", "-mmma");
>         return true;
>        }
> -    else if (mv == vector_pair_type_node)
> +    if (mv == vector_pair_type_node)
>        {
>         error ("type %<__vector_pair%> requires the %qs option", "-mmma");
>         return true;
> --
> 2.25.1
>
>

Reply via email to