int foo (char* a, char* b, char* c, char* d) { int sum = 0; for (int i = 0; i != 32; i++) { sum += (a[i] * b[i] + c[i] * d[i]); } return sum; } int foo1 (char* a, char* b, char* c, char* d) { int sum = 0; int sum1 = 0; for (int i = 0; i != 32; i++) { sum += a[i] * b[i] sum1 += c[i] * d[i]; } return sum + sum1; } foo should be same as foo1, but it failed to be optimized to dot_prod_expr since current vect_recog_dot_prod_pattern only recognize sum += a[i] * b[i]; I think it can be extend to recog dot_prod_expr chain, as long as they're only used by the final sum reduction.
For foo1, _99 = .REDUC_PLUS (vect_patt_79.51_97); _90 = .REDUC_PLUS (vect_patt_28.43_88); _19 = _90 + _99; can be optimized to _tmp = vect_patt_79.51_97 + vect_patt_28.43_88; _19 = .REDUC_PLUS (_tmp);
Confirmed.