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
>