Hi Thomas,

Thanks!

This CI should get faster turn around times soon; our goal is to get 
notifications to developers within 24 hours of bad commit hitting trunk.

--
Maxim Kuvyrkov
https://www.linaro.org

> On 19 Aug 2021, at 21:01, Thomas Schwinge <tho...@codesourcery.com> wrote:
> 
> 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

_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to