https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95199
--- Comment #4 from Kaipeng Zhou <zhoukaipeng3 at huawei dot com> --- Sorry for not expressing clearly. I have debugged the testcase you provided. Not eliminating them is not caused by IFN. The relevant code is in the "get_computation_aff_1" function. In IVOPTs the IV_STEPs must be checked by function "constant_multiple_of" before using an IV variable to eliminate the other. But if the tree_code of input IV_STEP is SSA_NAME, the function will return false. In your testcase, the tree_code of IV_STEP is MULT_EXPR, so it return true. Gimple for my testcase: <bb 12> [local count: 8589933]: _83 = (sizetype) inc_y_22(D); _84 = _83 * POLY_INT_CST [16, 16]; _85 = (long unsigned int) inc_y_22(D); _86 = _85 * 8; _87 = (ssizetype) _86; _88 = _87 /[ex] 8; _89 = (long unsigned int) _88; _90 = VEC_SERIES_EXPR <0, _89>; vect_cst__95 = [vec_duplicate_expr] m_17(D); _97 = (sizetype) inc_x_20(D); _98 = _97 * POLY_INT_CST [16, 16]; _99 = (long unsigned int) inc_x_20(D); _100 = _99 * 8; _101 = (ssizetype) _100; _102 = _101 /[ex] 8; _103 = (long unsigned int) _102; _104 = VEC_SERIES_EXPR <0, _103>; _109 = (sizetype) inc_x_20(D); _110 = _109 * POLY_INT_CST [16, 16]; _111 = (long unsigned int) inc_x_20(D); _112 = _111 * 8; _113 = (ssizetype) _112; _114 = _113 /[ex] 8; _115 = (long unsigned int) _114; _116 = VEC_SERIES_EXPR <0, _115>; max_mask_123 = .WHILE_ULT (0, 1000, { 0, ... }); <bb 3> [local count: 429496649]: # vectp_b.3_91 = PHI <vectp_b.3_92(5), b_16(D)(12)> # vectp_a.7_105 = PHI <vectp_a.7_106(5), a_18(D)(12)> # vectp_a.11_117 = PHI <vectp_a.11_118(5), a_18(D)(12)> # ivtmp_120 = PHI <ivtmp_121(5), 0(12)> # loop_mask_93 = PHI <next_mask_124(5), max_mask_123(12)> vect__4.5_94 = .MASK_GATHER_LOAD (vectp_b.3_91, _90, 8, { 0.0, ... }, loop_mask_93); vect__5.6_96 = vect__4.5_94 * vect_cst__95; vect__9.9_107 = .MASK_GATHER_LOAD (vectp_a.7_105, _104, 8, { 0.0, ... }, loop_mask_93); vect__10.10_108 = vect__5.6_96 + vect__9.9_107; .MASK_SCATTER_STORE (vectp_a.11_117, _116, 8, vect__10.10_108, loop_mask_93); vectp_b.3_92 = vectp_b.3_91 + _84; vectp_a.7_106 = vectp_a.7_105 + _98; vectp_a.11_118 = vectp_a.11_117 + _110; ivtmp_121 = ivtmp_120 + POLY_INT_CST [2, 2]; _122 = (unsigned int) ivtmp_121; next_mask_124 = .WHILE_ULT (_122, 1000, { 0, ... }); if (next_mask_124 != { 0, ... }) goto <bb 5>; [98.00%] else goto <bb 4>; [2.00%] _98 and _110 are IV_STEPs. They are both SSA_NAME, so they cannot currently be eliminated in IVOPTs. I am not sure about my opinion. If wrong, please correct me. And can you provide some suggestions on how to solve this problem? Should I try to enhance the "constant_multiple_of" function?