https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120996
--- Comment #8 from Dhruv Chawla <dhruvc at nvidia dot com> --- Reduced further to: === #include <cstdint> #include <cstddef> #include <cmath> #define PPWI 64 #define ZERO 0.0f #define QUARTER 0.25f #define HALF 0.5f #define ONE 1.0f #define TWO 2.0f #define FOUR 4.0f // Energy evaluation parameters #define HBTYPE_F 70 #define HBTYPE_E 69 struct Atom { float x, y, z; int32_t type; }; struct FFParams { int32_t hbtype; float radius; float elsc; }; void use (float); void fasten_main (size_t natlig, size_t natpro, const Atom *protein, const Atom *ligand, const FFParams *forcefield, float lpos_x[PPWI], float lpos_y[PPWI], float lpos_z[PPWI]) { for (size_t il = 0; il < natlig; il++) { const Atom l_atom = ligand[il]; const FFParams l_params = forcefield[l_atom.type]; for (size_t ip = 0; ip < natpro; ip++) { const Atom p_atom = protein[ip]; const FFParams p_params = forcefield[p_atom.type]; const float radij = p_params.radius + l_params.radius; const float elcdst = (p_params.hbtype == HBTYPE_F && l_params.hbtype == HBTYPE_F) ? FOUR : TWO; const float elcdst1 = (p_params.hbtype == HBTYPE_F && l_params.hbtype == HBTYPE_F) ? QUARTER : HALF; const float chrg_init = l_params.elsc * p_params.elsc; #pragma omp simd for (int l = 0; l < PPWI; l++) { // Calculate distance between atoms const float x = lpos_x[l] - p_atom.x; const float y = lpos_y[l] - p_atom.y; const float z = lpos_z[l] - p_atom.z; const float distij = sqrtf (x * x + y * y + z * z); const float distbb = distij - radij; float chrg_e = chrg_init * ((distbb < ZERO ? ONE : (ONE - distbb * elcdst1)) * (distbb < elcdst ? ONE : ZERO)); use (chrg_e); } } } } ===