From d9b84c2c9d645032094e3db8e5f361d26167c224 Mon Sep 17 00:00:00 2001 From: Vadim Paretsky Date: Thu, 18 May 2023 18:56:25 -0700 Subject: [PATCH] [OpenMP] remove usage of std::abs in the new loop collapse support code On some platforms, std::abs may inadvertently pull in a math library. This patch replaces its use in the new loop collapse code with a no thrills in-situ implementation. Differential Revision: https://reviews.llvm.org/D150882 --- openmp/runtime/src/kmp_collapse.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/openmp/runtime/src/kmp_collapse.cpp b/openmp/runtime/src/kmp_collapse.cpp index f7b72a1d69532..cbfc52567b43f 100644 --- a/openmp/runtime/src/kmp_collapse.cpp +++ b/openmp/runtime/src/kmp_collapse.cpp @@ -18,8 +18,6 @@ #include "kmp_str.h" #include "kmp_collapse.h" -#include - #if OMPT_SUPPORT #include "ompt-specific.h" #endif @@ -27,11 +25,18 @@ // OMPTODO: different style of comments (see kmp_sched) // OMPTODO: OMPT/OMPD +// avoid inadevertently using a library based abs +template T __kmp_abs(const T val) { + return (val < 0) ? -val: val; +} +kmp_uint32 __kmp_abs(const kmp_uint32 val) { return val; } +kmp_uint64 __kmp_abs(const kmp_uint64 val) { return val; } + //---------------------------------------------------------------------------- // Common functions for working with rectangular and non-rectangular loops //---------------------------------------------------------------------------- -template int sign(T val) { return (T(0) < val) - (val < T(0)); } +template int __kmp_sign(T val) { return (T(0) < val) - (val < T(0)); } //----------Loop canonicalization--------------------------------------------- @@ -131,7 +136,7 @@ kmp_loop_nest_iv_t kmp_calculate_trip_count_XX( // kmp_loop_nest_iv_t anyway bounds->trip_count = static_cast(bounds->ub0 - bounds->lb0) / - std::abs(bounds->step) + + __kmp_abs(bounds->step) + 1; } } else if (bounds->comparison == comparison_t::comp_greater_or_eq) { @@ -144,7 +149,7 @@ kmp_loop_nest_iv_t kmp_calculate_trip_count_XX( // kmp_loop_nest_iv_t anyway bounds->trip_count = static_cast(bounds->lb0 - bounds->ub0) / - std::abs(bounds->step) + + __kmp_abs(bounds->step) + 1; } } else { @@ -658,16 +663,16 @@ void kmp_calc_new_bounds_XX( T old_lb1 = bbounds.lb1; T old_ub1 = bbounds.ub1; - if (sign(old_lb1) != sign(old_ub1)) { + if (__kmp_sign(old_lb1) != __kmp_sign(old_ub1)) { // With this shape we can adjust to a rectangle: bbounds.lb1 = 0; bbounds.ub1 = 0; } else { // get upper and lower bounds to be parallel // with values in the old range. - // Note: std::abs didn't work here. - if (((sign(old_lb1) == -1) && (old_lb1 < old_ub1)) || - ((sign(old_lb1) == 1) && (old_lb1 > old_ub1))) { + // Note: abs didn't work here. + if (((old_lb1 < 0) && (old_lb1 < old_ub1)) || + ((old_lb1 > 0) && (old_lb1 > old_ub1))) { bbounds.lb1 = old_ub1; } else { bbounds.ub1 = old_lb1; @@ -804,13 +809,13 @@ kmp_calc_number_of_iterations_XX(const bounds_infoXX_template *bounds, iterations = (static_cast(original_ivs[ind]) - bounds->lb0 - bounds->lb1 * static_cast(original_ivs[bounds->outer_iv])) / - std::abs(bounds->step); + __kmp_abs(bounds->step); } else { KMP_DEBUG_ASSERT(bounds->comparison == comparison_t::comp_greater_or_eq); iterations = (bounds->lb0 + bounds->lb1 * static_cast(original_ivs[bounds->outer_iv]) - static_cast(original_ivs[ind])) / - std::abs(bounds->step); + __kmp_abs(bounds->step); } return iterations;