Hi! On 2021-08-19T17:41:17+0000, ci_not...@linaro.org wrote: > Successfully identified regression in *gcc* in CI configuration > tcwg_gcc_bootstrap/master-arm-bootstrap. So far, this commit has regressed > CI configurations: > - tcwg_gcc_bootstrap/master-arm-bootstrap > > Culprit: > <cut> > commit e4f16e9f357a38ec702fb69a0ffab9d292a6af9b > Author: Thomas Schwinge <tho...@codesourcery.com> > Date: Fri Aug 13 17:53:12 2021 +0200 > > Add more self-tests for 'hash_map' with Value type with non-trivial > constructor/destructor > > ... to document the current behavior. > > gcc/ > * hash-map-tests.c (test_map_of_type_with_ctor_and_dtor): Extend. > (test_map_of_type_with_ctor_and_dtor_expand): Add function. > (hash_map_tests_c_tests): Call it. > </cut>
Confirming: correctly identified the culprit. ;-) See also <https://gcc.gnu.org/PR101959> "[12 Regression] hash_map self test bootstrap failure". Fixed yesterday via commit bb04a03c6f9bacc890118b9e12b657503093c2f8 "Make 'gcc/hash-map-tests.c:test_map_of_type_with_ctor_and_dtor_expand' work on 32-bit architectures [PR101959]". Grüße Thomas > Results regressed to (for first_bad == > e4f16e9f357a38ec702fb69a0ffab9d292a6af9b) > # reset_artifacts: > -10 > # true: > 0 > # build_abe binutils: > 1 > # First few build errors in logs: > # 00:02:51 cc1: internal compiler error: in fail, at selftest.c:47 > # 00:02:51 cc1plus: internal compiler error: in fail, at selftest.c:47 > # 00:02:51 make[3]: *** [s-selftest-c] Error 1 > # 00:02:51 make[3]: *** [s-selftest-c++] Error 1 > # 00:02:51 make[2]: *** [all-stage1-gcc] Error 2 > # 00:02:51 make[1]: *** [stage1-bubble] Error 2 > # 00:02:51 make: *** [all] Error 2 > > from (for last_good == 602fca427df6c5f7452677cfcdd16a5b9a3ca86a) > # reset_artifacts: > -10 > # true: > 0 > # build_abe binutils: > 1 > # build_abe bootstrap: > 2 > > Artifacts of last_good build: > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/artifact/artifacts/build-602fca427df6c5f7452677cfcdd16a5b9a3ca86a/ > Artifacts of first_bad build: > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/artifact/artifacts/build-e4f16e9f357a38ec702fb69a0ffab9d292a6af9b/ > Build top page/logs: > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/ > > Configuration details: > > > Reproduce builds: > <cut> > mkdir investigate-gcc-e4f16e9f357a38ec702fb69a0ffab9d292a6af9b > cd investigate-gcc-e4f16e9f357a38ec702fb69a0ffab9d292a6af9b > > git clone https://git.linaro.org/toolchain/jenkins-scripts > > mkdir -p artifacts/manifests > curl -o artifacts/manifests/build-baseline.sh > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/artifact/artifacts/manifests/build-baseline.sh > --fail > curl -o artifacts/manifests/build-parameters.sh > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/artifact/artifacts/manifests/build-parameters.sh > --fail > curl -o artifacts/test.sh > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/artifact/artifacts/test.sh > --fail > chmod +x artifacts/test.sh > > # Reproduce the baseline build (build all pre-requisites) > ./jenkins-scripts/tcwg_gnu-build.sh @@ artifacts/manifests/build-baseline.sh > > # Save baseline build state (which is then restored in artifacts/test.sh) > mkdir -p ./bisect > rsync -a --del --delete-excluded --exclude /bisect/ --exclude /artifacts/ > --exclude /gcc/ ./ ./bisect/baseline/ > > cd gcc > > # Reproduce first_bad build > git checkout --detach e4f16e9f357a38ec702fb69a0ffab9d292a6af9b > ../artifacts/test.sh > > # Reproduce last_good build > git checkout --detach 602fca427df6c5f7452677cfcdd16a5b9a3ca86a > ../artifacts/test.sh > > cd .. > </cut> > > History of pending regressions and results: > https://git.linaro.org/toolchain/ci/base-artifacts.git/log/?h=linaro-local/ci/tcwg_gcc_bootstrap/master-arm-bootstrap > > Artifacts: > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/artifact/artifacts/ > Build log: > https://ci.linaro.org/job/tcwg_gcc_bootstrap-bisect-master-arm-bootstrap/1/consoleText > > Full commit (up to 1000 lines): > <cut> > commit e4f16e9f357a38ec702fb69a0ffab9d292a6af9b > Author: Thomas Schwinge <tho...@codesourcery.com> > Date: Fri Aug 13 17:53:12 2021 +0200 > > Add more self-tests for 'hash_map' with Value type with non-trivial > constructor/destructor > > ... to document the current behavior. > > gcc/ > * hash-map-tests.c (test_map_of_type_with_ctor_and_dtor): Extend. > (test_map_of_type_with_ctor_and_dtor_expand): Add function. > (hash_map_tests_c_tests): Call it. > --- > gcc/hash-map-tests.c | 152 > +++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 152 insertions(+) > > diff --git a/gcc/hash-map-tests.c b/gcc/hash-map-tests.c > index 5b6b192cd28..257f2be0c26 100644 > --- a/gcc/hash-map-tests.c > +++ b/gcc/hash-map-tests.c > @@ -278,6 +278,156 @@ test_map_of_type_with_ctor_and_dtor () > > ASSERT_TRUE (val_t::ndefault + val_t::ncopy == val_t::ndtor); > } > + > + > + /* Verify basic construction and destruction of Value objects. */ > + { > + /* Configure, arbitrary. */ > + const size_t N_init = 0; > + const int N_elem = 28; > + > + void *a[N_elem]; > + for (size_t i = 0; i < N_elem; ++i) > + a[i] = &a[i]; > + > + val_t::ndefault = 0; > + val_t::ncopy = 0; > + val_t::nassign = 0; > + val_t::ndtor = 0; > + Map m (N_init); > + ASSERT_EQ (val_t::ndefault > + + val_t::ncopy > + + val_t::nassign > + + val_t::ndtor, 0); > + > + for (int i = 0; i < N_elem; ++i) > + { > + m.get_or_insert (a[i]); > + ASSERT_EQ (val_t::ndefault, 1 + i); > + ASSERT_EQ (val_t::ncopy, 0); > + ASSERT_EQ (val_t::nassign, 0); > + ASSERT_EQ (val_t::ndtor, i); > + > + m.remove (a[i]); > + ASSERT_EQ (val_t::ndefault, 1 + i); > + ASSERT_EQ (val_t::ncopy, 0); > + ASSERT_EQ (val_t::nassign, 0); > + ASSERT_EQ (val_t::ndtor, 1 + i); > + } > + } > +} > + > +/* Verify aspects of 'hash_table::expand'. */ > + > +static void > +test_map_of_type_with_ctor_and_dtor_expand (bool remove_some_inline) > +{ > + /* Configure, so that hash table expansion triggers a few times. */ > + const size_t N_init = 0; > + const int N_elem = 70; > + size_t expand_c_expected = 4; > + size_t expand_c = 0; > + > + void *a[N_elem]; > + for (size_t i = 0; i < N_elem; ++i) > + a[i] = &a[i]; > + > + typedef hash_map <void *, val_t> Map; > + > + /* Note that we are starting with a fresh 'Map'. Even if an existing one > has > + been cleared out completely, there remain 'deleted' elements, and these > + would disturb the following logic, where we don't have access to the > + actual 'm_n_deleted' value. */ > + size_t m_n_deleted = 0; > + > + val_t::ndefault = 0; > + val_t::ncopy = 0; > + val_t::nassign = 0; > + val_t::ndtor = 0; > + Map m (N_init); > + > + /* In the following, in particular related to 'expand', we're adapting from > + the internal logic of 'hash_table', glossing over "some details" not > + relevant for this testing here. */ > + > + /* Per 'hash_table::hash_table'. */ > + size_t m_size; > + { > + unsigned int size_prime_index_ = hash_table_higher_prime_index (N_init); > + m_size = prime_tab[size_prime_index_].prime; > + } > + > + int n_expand_moved = 0; > + > + for (int i = 0; i < N_elem; ++i) > + { > + size_t elts = m.elements (); > + > + /* Per 'hash_table::find_slot_with_hash'. */ > + size_t m_n_elements = elts + m_n_deleted; > + bool expand = m_size * 3 <= m_n_elements * 4; > + > + m.get_or_insert (a[i]); > + if (expand) > + { > + ++expand_c; > + > + /* Per 'hash_table::expand'. */ > + { > + unsigned int nindex = hash_table_higher_prime_index (elts * 2); > + m_size = prime_tab[nindex].prime; > + } > + m_n_deleted = 0; > + > + /* All non-deleted elements have been moved. */ > + n_expand_moved += i; > + if (remove_some_inline) > + n_expand_moved -= (i + 2) / 3; > + } > + > + ASSERT_EQ (val_t::ndefault, 1 + i); > + ASSERT_EQ (val_t::ncopy, n_expand_moved); > + ASSERT_EQ (val_t::nassign, 0); > + if (remove_some_inline) > + ASSERT_EQ (val_t::ndtor, (i + 2) / 3); > + else > + ASSERT_EQ (val_t::ndtor, 0); > + > + /* Remove some inline. This never triggers an 'expand' here, but via > + 'm_n_deleted' does influence any following one. */ > + if (remove_some_inline > + && !(i % 3)) > + { > + m.remove (a[i]); > + /* Per 'hash_table::remove_elt_with_hash'. */ > + m_n_deleted++; > + > + ASSERT_EQ (val_t::ndefault, 1 + i); > + ASSERT_EQ (val_t::ncopy, n_expand_moved); > + ASSERT_EQ (val_t::nassign, 0); > + ASSERT_EQ (val_t::ndtor, 1 + (i + 2) / 3); > + } > + } > + ASSERT_EQ (expand_c, expand_c_expected); > + > + int ndefault = val_t::ndefault; > + int ncopy = val_t::ncopy; > + int nassign = val_t::nassign; > + int ndtor = val_t::ndtor; > + > + for (int i = 0; i < N_elem; ++i) > + { > + if (remove_some_inline > + && !(i % 3)) > + continue; > + > + m.remove (a[i]); > + ++ndtor; > + ASSERT_EQ (val_t::ndefault, ndefault); > + ASSERT_EQ (val_t::ncopy, ncopy); > + ASSERT_EQ (val_t::nassign, nassign); > + ASSERT_EQ (val_t::ndtor, ndtor); > + } > } > > /* Test calling empty on a hash_map that has a key type with non-zero > @@ -309,6 +459,8 @@ hash_map_tests_c_tests () > test_map_of_strings_to_int (); > test_map_of_int_to_strings (); > test_map_of_type_with_ctor_and_dtor (); > + test_map_of_type_with_ctor_and_dtor_expand (false); > + test_map_of_type_with_ctor_and_dtor_expand (true); > test_nonzero_empty_key (); > } > > </cut> ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955 _______________________________________________ linaro-toolchain mailing list linaro-toolchain@lists.linaro.org https://lists.linaro.org/mailman/listinfo/linaro-toolchain