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

--- Comment #13 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
The divergence appears to stem from get_ref_base_and_extent:

        case MEM_REF:
[...]
          /* Hand back the decl for MEM[&decl, off].  */
          if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
            {
              if (integer_zerop (TREE_OPERAND (exp, 1)))
                exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
              else
                {
                  poly_offset_int off = mem_ref_offset (exp);
                  off <<= LOG2_BITS_PER_UNIT;
                  off += bit_offset;
                  poly_int64 off_hwi;
                  if (off.to_shwi (&off_hwi))
                    {
                      bit_offset = off_hwi;
                      exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
                    }
                }
            }

628                       poly_offset_int off = mem_ref_offset (exp);
(gdb) p debug_generic_expr(exp)
MEM[(char *)&ar3 + -9223372036854775808B]

which yields on the one hand:

(gdb) p off
$60 = {<poly_int_pod<1, generic_wide_int<fixed_wide_int_storage<128> > >> = {
    coeffs = {{<fixed_wide_int_storage<128>> = {val = {-9223372036854775808, 
            140737332966384, 140733193388032}, len = 1}, 
        static is_sign_extended = true}}}, <No data fields>}

and on the other hand:

(gdb) p off
$25 = {<poly_int_pod<1, generic_wide_int<fixed_wide_int_storage<128> > >> = {
    coeffs = {{<fixed_wide_int_storage<128>> = {val = {-9223372036854775808, 
            8097070, -9223372036854775808}, len = 1}, 
        static is_sign_extended = true}}}, <No data fields>}

Then
          off <<= LOG2_BITS_PER_UNIT;

yields on the one hand:

(gdb) p off
$67 = {<poly_int_pod<1, generic_wide_int<fixed_wide_int_storage<128> > >> = {
    coeffs = {{<fixed_wide_int_storage<128>> = {val = {0, -4, 
            140737488342640}, len = 2}, 
        static is_sign_extended = true}}}, <No data fields>}

and on the other hand:

$36 = {<poly_int_pod<1, generic_wide_int<fixed_wide_int_storage<128> > >> = {
    coeffs = {{<fixed_wide_int_storage<128>> = {val = {0, 824633720995, 
            140737334083072}, len = 1}, 
        static is_sign_extended = true}}}, <No data fields>}

The latter passes the off.to_shwi test whereas the former does not.

Reply via email to