c++: Drop TREE_READONLY on vars (possibly) initialized by tls wrapper [PR109164]
The following two testcases are miscompiled, because we keep TREE_READONLY on the vars even when they are (possibly) dynamically initialized by a TLS wrapper function. Normally cp_finish_decl drops TREE_READONLY from vars which need dynamic initialization, but for TLS we do this kind of initialization upon every access to those variables. Keeping them TREE_READONLY means e.g. PRE can hoist loads from those before loops which contain the TLS wrapper calls, so we can access the TLS variables before they are initialized. 2023-03-20 Jakub Jelinek <jakub@redhat.com> PR c++/109164 * cp-tree.h (var_needs_tls_wrapper): Declare. * decl2.cc (var_needs_tls_wrapper): No longer static. * decl.cc (cp_finish_decl): Clear TREE_READONLY on TLS variables for which a TLS wrapper will be needed. * g++.dg/tls/thread_local13.C: New test. * g++.dg/tls/thread_local13-aux.cc: New file. * g++.dg/tls/thread_local14.C: New test. * g++.dg/tls/thread_local14-aux.cc: New file.
Showing
- gcc/cp/cp-tree.h 1 addition, 0 deletionsgcc/cp/cp-tree.h
- gcc/cp/decl.cc 12 additions, 0 deletionsgcc/cp/decl.cc
- gcc/cp/decl2.cc 1 addition, 1 deletiongcc/cp/decl2.cc
- gcc/testsuite/g++.dg/tls/thread_local13-aux.cc 35 additions, 0 deletionsgcc/testsuite/g++.dg/tls/thread_local13-aux.cc
- gcc/testsuite/g++.dg/tls/thread_local13.C 21 additions, 0 deletionsgcc/testsuite/g++.dg/tls/thread_local13.C
- gcc/testsuite/g++.dg/tls/thread_local14-aux.cc 26 additions, 0 deletionsgcc/testsuite/g++.dg/tls/thread_local14-aux.cc
- gcc/testsuite/g++.dg/tls/thread_local14.C 19 additions, 0 deletionsgcc/testsuite/g++.dg/tls/thread_local14.C
Loading
Please register or sign in to comment