https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67921
--- Comment #6 from bin.cheng <amker.cheng at gmail dot com> --- The fact is GCC calls function: chrec_fold_minus (type, chrec1, chrec2) // type == sizetype // chrec1 == 4 - (sizetype) &c // chrec2 == (sizetype) ((int *) p1_8(D) + ((sizetype) a_23 * 24 + 4)) And so calls below function at the end of chrec_fold_plus_1: return fold_build2 (code, type, fold_convert (type, op0), fold_convert (type, op1)); // code == MINUS_EXPR // type == sizetype // op0 == 4 - (sizetype) &c // op1 == (sizetype) ((int *) p1_8(D) + ((sizetype) a_23 * 24 + 4)) In fold_build_loc, the associate logic is trigged and below expression is returned: ((sizetype) -((int *) p1_8(D) + ((sizetype) a_23 * 24 + 4)) - (sizetype) &c) + 4 With this returned CHREC, the following resolve_mixer tries to apply NEGATE_EXPR by calling below function: chrec_fold_multiply (type, fold_convert (type, integer_minus_one_node), op0); // type == int * // op0 == (int *) p1_8(D) + ((sizetype) a_23 * 24 + 4) So the issue boils down to question whether it's valid to fold expression like: "4 - (sizetype) &c - (sizetype) ((int *) p1_8(D) + ((sizetype) a_23 * 24 + 4))" to: "((sizetype) -((int *) p1_8(D) + ((sizetype) a_23 * 24 + 4)) - (sizetype) &c) + 4" It seems invalid to me, but if in any case it's valid, then problem is in IVOPT/sanitizer which introduce operation on pointers converted into sizetype.