]> git.ipfire.org Git - thirdparty/gcc.git/commit
expr: Move reduce_bit_field target mode check [PR96151]
authorRichard Sandiford <richard.sandiford@arm.com>
Fri, 10 Jul 2020 18:06:46 +0000 (19:06 +0100)
committerGiuliano Belinassi <giuliano.belinassi@usp.br>
Mon, 17 Aug 2020 16:17:18 +0000 (13:17 -0300)
commitfa996702bb7cc98f15034bf6b60919db944e96b1
treee5ab11767cd98dd0d0332ecb3c3aa32aa0537292
parent2038366ff0fb28602660dad61701899268df70ed
expr: Move reduce_bit_field target mode check [PR96151]

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).

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.
gcc/expr.c