https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98138
--- Comment #17 from Kewen Lin <linkw at gcc dot gnu.org> --- ccp1: t0_83 = a0_79 + a1_80; t1_84 = a0_79 - a1_80; t2_85 = a2_81 + a3_82; t3_86 = a2_81 - a3_82; _63 = t0_83 + t2_85; tmp[i_71][0] = _63; _64 = t0_83 - t2_85; tmp[i_71][2] = _64; _65 = t1_84 + t3_86; tmp[i_71][1] = _65; _66 = t1_84 - t3_86; tmp[i_71][3] = _66; i_91 = i_71 + 1; => forwprop1: t0_83 = a0_79 + a1_80; t1_84 = a0_79 - a1_80; t2_85 = a2_81 + a3_82; t3_86 = a2_81 - a3_82; _63 = t0_83 + t2_85; tmp[i_71][0] = _63; _64 = t0_83 - t2_85; tmp[i_71][2] = _64; _65 = t1_84 + t3_86; tmp[i_71][1] = _65; _73 = a3_82 - a2_81; _66 = _73 + t1_84; // changed from t1_84 - t3_86; tmp[i_71][3] = _66; i_91 = i_71 + 1; due to match.pd rule: /* A - B -> A + (-B) if B is easily negatable. */ (simplify (minus @0 negate_expr_p@1) (if (!FIXED_POINT_TYPE_P (type)) (plus @0 (negate @1))))