https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108688

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think the bug is in the match.pd
/* Simplify a bit extraction from a bit insertion for the cases with
   the inserted element fully covering the extraction or the insertion
   not touching the extraction.  */
(simplify
 (BIT_FIELD_REF (bit_insert @0 @1 @ipos) @rsize @rpos)
 (with
  {
    unsigned HOST_WIDE_INT isize;
    if (INTEGRAL_TYPE_P (TREE_TYPE (@1)))
      isize = TYPE_PRECISION (TREE_TYPE (@1));
    else
      isize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (@1)));
  }
  (switch
   (if (wi::leu_p (wi::to_wide (@ipos), wi::to_wide (@rpos))
        && wi::leu_p (wi::to_wide (@rpos) + wi::to_wide (@rsize),
                      wi::to_wide (@ipos) + isize))
    (BIT_FIELD_REF @1 @rsize { wide_int_to_tree (bitsizetype,
                                                 wi::to_wide (@rpos)
                                                 - wi::to_wide (@ipos)); }))
   (if (wi::geu_p (wi::to_wide (@ipos),
                   wi::to_wide (@rpos) + wi::to_wide (@rsize))
        || wi::geu_p (wi::to_wide (@rpos),
                      wi::to_wide (@ipos) + isize))
    (BIT_FIELD_REF @0 @rsize @rpos)))))
which folds
  _ifc__35 = BIT_INSERT_EXPR <_ifc__34, _2, 0 (7 bits)>;
  _ifc__31 = BIT_FIELD_REF <_ifc__35, 2, 0>;
where 34/35 have unsigned char type, 31 signed:2 and 2 signed:7.

So, in this case it wants to extract low 2 bits out of the 7 bits _2 which is
invalid
because _2 doesn't have mode precision.  If it tried to extract 7 bits out of
it, we have:
(simplify
 (BIT_FIELD_REF @0 @1 integer_zerop)
 (if (tree_int_cst_equal (@1, TYPE_SIZE (TREE_TYPE (@0))))
  (view_convert @0)))
simplification but that one wouldn't trigger, because those signed:2 types have
TYPE_SIZE 8 rather than 7, only TYPE_PRECISION of 7.

Reply via email to