From: Jakub Jelinek Date: Tue, 12 Oct 2021 07:55:41 +0000 (+0200) Subject: openmp: Avoid calling clear_type_padding_in_mask in the common case where there can... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=377a7aaeb9d5cce6521e5c2ca3e284897dbed7e2;p=thirdparty%2Fgcc.git openmp: Avoid calling clear_type_padding_in_mask in the common case where there can't be any padding We can use the clear_padding_type_may_have_padding_p function, which is conservative for e.g. RECORD_TYPE/UNION_TYPE, but for the floating and complex floating types is accurate. clear_type_padding_in_mask is more expensive because we need to allocate memory, fill it, call the function which itself is more expensive and then analyze the memory, so for the common case of float/double atomics or even long double on most targets we can avoid that. 2021-10-12 Jakub Jelinek gcc/ * gimple-fold.h (clear_padding_type_may_have_padding_p): Declare. * gimple-fold.c (clear_padding_type_may_have_padding_p): No longer static. gcc/c-family/ * c-omp.c (c_finish_omp_atomic): Use clear_padding_type_may_have_padding_p. (cherry picked from commit 8e1fe3f779185cc678493ceda42c2e620a5c1387) --- diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 34c16660513a..887546261218 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,12 @@ +2021-10-12 Tobias Burnus + + Backported from master: + 2021-10-12 Jakub Jelinek + + * gimple-fold.h (clear_padding_type_may_have_padding_p): Declare. + * gimple-fold.c (clear_padding_type_may_have_padding_p): No longer + static. + 2021-10-11 Marcel Vollweiler Backported from master: diff --git a/gcc/c-family/ChangeLog.omp b/gcc/c-family/ChangeLog.omp index 4d19a6e56c7c..48ca80ae1538 100644 --- a/gcc/c-family/ChangeLog.omp +++ b/gcc/c-family/ChangeLog.omp @@ -1,3 +1,11 @@ +2021-10-12 Tobias Burnus + + Backported from master: + 2021-10-12 Jakub Jelinek + + * c-omp.c (c_finish_omp_atomic): Use + clear_padding_type_may_have_padding_p. + 2021-10-06 Tobias Burnus Backported from master: diff --git a/gcc/c-family/c-omp.c b/gcc/c-family/c-omp.c index 72552a6062d2..e77aa4620286 100644 --- a/gcc/c-family/c-omp.c +++ b/gcc/c-family/c-omp.c @@ -382,7 +382,9 @@ c_finish_omp_atomic (location_t loc, enum tree_code code, bool clear_padding = false; HOST_WIDE_INT non_padding_start = 0; HOST_WIDE_INT non_padding_end = 0; - if (BITS_PER_UNIT == 8 && CHAR_BIT == 8) + if (BITS_PER_UNIT == 8 + && CHAR_BIT == 8 + && clear_padding_type_may_have_padding_p (cmptype)) { HOST_WIDE_INT sz = int_size_in_bytes (cmptype), i; gcc_assert (sz > 0); diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 0581338ea5fc..999a3c961b75 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -4429,7 +4429,7 @@ clear_padding_real_needs_padding_p (tree type) /* Return true if TYPE might contain any padding bits. */ -static bool +bool clear_padding_type_may_have_padding_p (tree type) { switch (TREE_CODE (type)) diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h index f495dac9e714..33f4ab09f31a 100644 --- a/gcc/gimple-fold.h +++ b/gcc/gimple-fold.h @@ -35,6 +35,7 @@ extern tree maybe_fold_and_comparisons (tree, enum tree_code, tree, tree, enum tree_code, tree, tree); extern tree maybe_fold_or_comparisons (tree, enum tree_code, tree, tree, enum tree_code, tree, tree); +extern bool clear_padding_type_may_have_padding_p (tree); extern void clear_type_padding_in_mask (tree, unsigned char *); extern bool optimize_atomic_compare_exchange_p (gimple *); extern void fold_builtin_atomic_compare_exchange (gimple_stmt_iterator *);