Hi, I found for the follow code:
#define N 256 int a[N][N][N], b[N][N][N]; int d[N][N], c[N][N]; void __attribute__((noinline)) double_reduc (int n) { for (int k = 0; k < n; k++) { for (int l = 0; l < n; l++) { c[k][l] = 0; for (int m = 0; m < n; m++) c[k][l] += a[k][m][l] * d[k][m] + b[k][m][l] * d[k][m]; } } } I dumped the file after loop interchange and got the following information: <bb 3> [local count: 118111600]: # m_46 = PHI <0(7), m_45(11)> # ivtmp_44 = PHI <_42(7), ivtmp_43(11)> _39 = _49 + 1; <bb 4> [local count: 955630224]: # l_48 = PHI <0(3), l_47(12)> # ivtmp_41 = PHI <_39(3), ivtmp_40(12)> c_I_I_lsm.5_18 = c[k_28][l_48]; c_I_I_lsm.5_53 = m_46 != 0 ? c_I_I_lsm.5_18 : 0; _2 = a[k_28][m_46][l_48]; _3 = d[k_28][m_46]; _4 = _2 * _3; _5 = b[k_28][m_46][l_48]; _6 = _3 * _5; _7 = _4 + _6; _8 = _7 + c_I_I_lsm.5_53; c[k_28][l_48] = _8; l_47 = l_48 + 1; ivtmp_40 = ivtmp_41 - 1; if (ivtmp_40 != 0) goto <bb 12>; [89.00%] else goto <bb 5>; [11.00%] we can see '_3 = d[k_28][m_46];' is a loop invariant. Do we need to add a loop invariant motion pass after the loop interchange? BR, Lijia He