https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89691
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- It doesn't handle negative offsets, we're doing /* Optional constant offset. */ if (c_parser_next_token_is (parser, CPP_PLUS)) { c_parser_consume_token (parser); alias_off = c_parser_gimple_postfix_expression (parser).value; alias_off = fold_convert (alias_type, alias_off); } I tried to parse what -gimple dumps show (which indeed is the "ugly" hex number given the INTEGER_CSTs have pointer type). It works when you write __MEM <int, 16> ((char *)&x + _Literal (int) -2) = i; the magic _Literal forces (some) constant foldings/type conversions to be done so we get a single value rather than the syntactical negate of two. This shows elsewhere, too. Note it is required to not always parse -2 as literal since else you couldn't write an unfolded unary minus operation of a constant. OTOH I just figured we -gimple dump int foo (int i) { int j = -1; return j + i; } as int __GIMPLE () foo (int i) { int D_1910; int j; j = -1; D_1910 = j + i; return D_1910; } which is then wrong.