On Fri, 2020-07-10 at 16:40 +0100, Richard Sandiford wrote:
> In some cases, expand_expr_real_2 prefers to use the mode of the
> caller-suggested target instead of the mode of the expression when
> passing values to reduce_to_bit_field_precision.  E.g.:
> 
>       else if (target == 0)
>         op0 = convert_to_mode (mode, op0,
>                                TYPE_UNSIGNED (TREE_TYPE
>                                               (treeop0)));
>       else
>         {
>           convert_move (target, op0,
>                         TYPE_UNSIGNED (TREE_TYPE (treeop0)));
>           op0 = target;
>         }
> 
> where “op0” might not have “mode” for the “else” branch,
> but does for all the others.
> 
> reduce_to_bit_field_precision discards the suggested target if it
> has the wrong mode.  This patch moves that to expand_expr_real_2
> instead (conditional on reduce_bit_field).
> 
> Sorry for the breakage.  This is what I'd done in the original
> version of the patch, after checking all uses of REDUCE_BIT_FIELD.
> I then forgot why it was necessary and tried to “simplify” the
> patch for backports.
> 
> Tested on arm-linux-gnueabihf, where it restores bootstrap.
> Other tests still ongoing.  OK to install if it passes?
> 
> Richard
> 
> 
> gcc/
>       PR middle-end/96151
>       * expr.c (expand_expr_real_2): When reducing bit fields,
>       clear the target if it has a different mode from the expression.
>       (reduce_to_bit_field_precision): Don't do that here.  Instead
>       assert that the target already has the correct mode.
OK.  Note I think this is also affecting csky and mips too.

Jeff
> 

Reply via email to