https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109088
--- Comment #17 from JuzheZhong <juzhe.zhong at rivai dot ai> --- Sorry for confusing and not enough information. I am trying to transform: + reduc_1 = PHI <..., reduc_2> + ... + if (...) + tmp1 = reduc_1 + rhs1; + tmp2 = tmp1 + rhs2; + tmp3 = tmp2 + rhs3; + ... + reduc_3 = tmpN-1 + rhsN-1; + + reduc_2 = PHI <reduc_1, reduc_3> First transform the first statement: tmp1 = reduc_1 + rhs1; into tmp1 = rhs1 + 0; Then it will become bogus data move assignment: tmp1 = rhs1. The later PASS will eliminate it. Then, transform the reduction PHI: reduc_1 = PHI <..., reduc_2> into if-convert statement: reduc_1 = PHI <_ifc__35(8), 0(18)> Thid, transform + reduc_3 = tmpN-1 + rhsN-1; + + reduc_2 = PHI <reduc_1, reduc_3> into : reduc_3 = tmpN-1 + rhsN-1; _ifc__35 = .COND_ADD (condition, reduc_1, reduc_3, reduc_1); So finally: result_1 = PHI <_ifc__35(8), 0(18)> ... tmp1 = rhs1; tmp2 = tmp1 + rhs2; tmp3 = tmp2 + rhs3; ... reduc_3 = tmpN-1 + rhsN-1; _ifc__35 = .COND_ADD (condition, reduc_1, reduc_3, reduc_1);