target/90622: __builtin_avr_insert bits: Use BLD/BST for one bit in place.

If just one bit is inserted in the same position like with:
    __builtin_avr_insert_bits (0xFFFFF2FF, src, dst);
a BLD/BST sequence is better than XOR/AND/XOR.  Thus, don't fold that
case to the latter sequence.

gcc/
	PR target/90622
	* config/avr/avr.cc (avr_fold_builtin) [AVR_BUILTIN_INSERT_BITS]:
	Don't fold to XOR / AND / XOR if just one bit is copied to the
	same position.
This commit is contained in:
Georg-Johann Lay 2023-05-21 18:54:21 +02:00
parent c09471fbc7
commit dad3c18fbb

View file

@ -14425,10 +14425,13 @@ avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg,
if (changed)
return build_call_expr (fndecl, 3, tmap, tbits, tval);
/* If bits don't change their position we can use vanilla logic
to merge the two arguments. */
/* If bits don't change their position, we can use vanilla logic
to merge the two arguments... */
if (avr_map_metric (map, MAP_NONFIXED_0_7) == 0)
if (avr_map_metric (map, MAP_NONFIXED_0_7) == 0
// ...except when we are copying just one bit. In that
// case, BLD/BST is better than XOR/AND/XOR, see PR90622.
&& avr_map_metric (map, MAP_FIXED_0_7) != 1)
{
int mask_f = avr_map_metric (map, MAP_MASK_PREIMAGE_F);
tree tres, tmask = build_int_cst (val_type, mask_f ^ 0xff);