Robin Dapp <rd...@linux.ibm.com> writes:
> This lifts the restriction of not allowing constants for
> noce_convert_multiple.  The code later checks if a valid sequence
> is produced anyway.

OK, thanks.

I was initially worried that this might trump later, more targetted
optimisations, but it looks like that's already accounted for:

  /* If we would only put out one conditional move, the other strategies
     this pass tries are better optimized and will be more appropriate.
     Some targets want to strictly limit the number of conditional moves
     that are emitted, they set this through PARAM, we need to respect
     that.  */
  return count > 1 && count <= param;

Richard


> ---
>  gcc/ifcvt.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
> index eef6490626a..6006055f26a 100644
> --- a/gcc/ifcvt.c
> +++ b/gcc/ifcvt.c
> @@ -3269,7 +3269,9 @@ noce_convert_multiple_sets (struct noce_if_info 
> *if_info)
>        we'll end up trying to emit r4:HI = cond ? (r1:SI) : (r3:HI).
>        Wrap the two cmove operands into subregs if appropriate to prevent
>        that.  */
> -      if (GET_MODE (new_val) != GET_MODE (temp))
> +
> +      if (!CONSTANT_P (new_val)
> +       && GET_MODE (new_val) != GET_MODE (temp))
>       {
>         machine_mode src_mode = GET_MODE (new_val);
>         machine_mode dst_mode = GET_MODE (temp);
> @@ -3280,7 +3282,8 @@ noce_convert_multiple_sets (struct noce_if_info 
> *if_info)
>           }
>         new_val = lowpart_subreg (dst_mode, new_val, src_mode);
>       }
> -      if (GET_MODE (old_val) != GET_MODE (temp))
> +      if (!CONSTANT_P (old_val)
> +       && GET_MODE (old_val) != GET_MODE (temp))
>       {
>         machine_mode src_mode = GET_MODE (old_val);
>         machine_mode dst_mode = GET_MODE (temp);
> @@ -3409,9 +3412,9 @@ bb_ok_for_noce_convert_multiple_sets (basic_block 
> test_bb)
>        if (!REG_P (dest))
>       return false;
>  
> -      if (!(REG_P (src)
> -        || (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src))
> -            && subreg_lowpart_p (src))))
> +      if (!((REG_P (src) || CONSTANT_P (src))
> +         || (GET_CODE (src) == SUBREG && REG_P (SUBREG_REG (src))
> +           && subreg_lowpart_p (src))))
>       return false;
>  
>        /* Destination must be appropriate for a conditional write.  */

Reply via email to