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?