https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126372

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #3)
> For -Ofast -g also reproducible on a Zen4 host.  IIRC milc was sensitive to
> code layout changes.  Once I throw perf at it the difference vanishes.
> 
> There is only
> 
> -check_unitarity.c:128:9: optimized: basic block part vectorized using 16
> byte vectors
> -check_unitarity.c:145:9: optimized: basic block part vectorized using 16
> byte vectors
> +check_unitarity.c:146:5: optimized: basic block part vectorized using 16
> byte vectors
> +m_mat_nn.c:88:32: optimized: basic block part vectorized using 16 byte
> vectors
> 
> 
> The m_mat_nn.c (mult_su3_nn) part is us now vectorizing
> 
> void mult_su3_nn( su3_matrix *a, su3_matrix *b, su3_matrix *c ){
>   int i,j;
>   register double t,ar,ai,br,bi,cr,ci;
>     for(i=0;i<3;i++)for(j=0;j<3;j++){
> 
>         ar=a->e[i][0].real; ai=a->e[i][0].imag;
>         br=b->e[0][j].real; bi=b->e[0][j].imag;
>         cr=ar*br; t=ai*bi; cr -= t;
>         ci=ar*bi; t=ai*br; ci += t;
> 
>         ar=a->e[i][1].real; ai=a->e[i][1].imag;
>         br=b->e[1][j].real; bi=b->e[1][j].imag;
>         t=ar*br; cr += t; t=ai*bi; cr -= t;
>         t=ar*bi; ci += t; t=ai*br; ci += t;
> 
>         ar=a->e[i][2].real; ai=a->e[i][2].imag;
>         br=b->e[2][j].real; bi=b->e[2][j].imag;
>         t=ar*br; cr += t; t=ai*bi; cr -= t;  <---  this
>         t=ar*bi; ci += t; t=ai*br; ci += t;  <---
> 
>         c->e[i][j].real=cr;  <--- in addition to this
>         c->e[i][j].imag=ci;
>     }
> }
> 
> vectorizing c->e[1][2].real = <plus reduction>
> 
> +  vectp.627_1209 = &b_10(D)->e[2][2];
> +  vect_bi_120.628_1210 = MEM <vector(2) double> [(double *)vectp.627_1209];
> +  _1213 = BIT_FIELD_REF <vect_bi_120.628_1210, 64, 64>;
> +  _1212 = BIT_FIELD_REF <vect_bi_120.628_1210, 64, 0>;
> ...
> +  vectp.630_1214 = &a_7(D)->e[1][2];
> +  vectp.630_1225 = vectp.630_1214;
> +  vect_ai_323.636_1226 = MEM <vector(2) double> [(double *)vectp.630_1225];
> +  vect_ar_71.637_1227 = VEC_PERM_EXPR <vect_ai_323.636_1226,
> vect_ai_323.636_1226, { 1, 0 }>;
> +  vect_t_611.638_1228 = vect_bi_120.628_1210 * vect_ar_71.637_1227;
> ...
> +  _1229 = .REDUC_PLUS (vect_t_611.638_1228);
> +  _1230 = ci_382 + t_370;
> +  _1231 = _1230 + t_329;
> +  _1232 = _1231 + t_335;
> +  _1233 = _1229 + _1232;
> +  ci_612 = _1233;
> 
> as this has common nodes with the rest it only alters costs slightly,
> increasing profitability even:
> 
> -m_mat_nn.c:90:17: note: Cost model analysis for part in loop 0:
> -  Vector cost: 1804
> -  Scalar cost: 2004
> +  Vector cost: 1928
> +  Scalar cost: 2128
> 
> but then it's probably, overall, not a very profitable vectorization
> of scalar code.
> 
> 
> 
> The check_unitarity.c:check_su3 change looks like a good one, replacing
> three separate plus reductions with a combined MAX reduction and vectorized
> sqrt.

Ignore this ... this was milc.

Reply via email to