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 >