aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-emutls.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-05-05 10:15:27 +0200
committerRichard Biener <rguenther@suse.de>2021-05-06 10:08:16 +0200
commitb5254d6b75fe6be669396cd1261f1cba829cc451 (patch)
tree06c551fc0f78bc3c3a7c573ffdb5ae7dd8261f28 /gcc/tree-emutls.c
parent2fd7689cb29c725f732acbd8a0a71eef35518859 (diff)
downloadgcc-b5254d6b75fe6be669396cd1261f1cba829cc451.zip
gcc-b5254d6b75fe6be669396cd1261f1cba829cc451.tar.gz
gcc-b5254d6b75fe6be669396cd1261f1cba829cc451.tar.bz2
ipa/100373 - fix emutls lowering compare-debug issue
emutls figured that tls uses in debug-insns need lowering but that obviously has effects on code-generation as can be seen in the following IL diff with the new testcase: <bb 2> [local count: 1073741824]: - a = 0; + # DEBUG BEGIN_STMT _4 = __builtin___emutls_get_address (&__emutls_v.b); + # DEBUG D#1 => *_4 + # DEBUG d => (long int) D#1 + # DEBUG BEGIN_STMT + a = 0; + # DEBUG BEGIN_STMT *_4 = 0; return; where it figured the debug use of b in the original <bb 2> [local count: 1073741824]: # DEBUG BEGIN_STMT # DEBUG D#1 => b # DEBUG d => (long int) D#1 # DEBUG BEGIN_STMT a = 0; needs lowering (it maybe does when we want to produce perfect debug but that's just bad luck). The following patch fixes this by avoiding to create a new emutls address when visiting debug stmts and instead resets them. Another option might be to simply not lower debug stmt uses but I have no way to verify actual debug info for this. 2021-05-05 Richard Biener <rguenther@suse.de> PR ipa/100373 * tree-emutls.c (gen_emutls_addr): Pass in whether we're dealing with a debug use and only query existing addresses if so. (lower_emutls_1): Avoid splitting out addresses for debug stmts, reset the debug stmt when we fail to find existing lowered addresses. (lower_emutls_phi_arg): Set wi.stmt. * gcc.dg/pr100373.c: New testcase.
Diffstat (limited to 'gcc/tree-emutls.c')
-rw-r--r--gcc/tree-emutls.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/tree-emutls.c b/gcc/tree-emutls.c
index 1c9c5d5..92cb619 100644
--- a/gcc/tree-emutls.c
+++ b/gcc/tree-emutls.c
@@ -394,13 +394,13 @@ struct lower_emutls_data
Append any new computation statements required to D->SEQ. */
static tree
-gen_emutls_addr (tree decl, struct lower_emutls_data *d)
+gen_emutls_addr (tree decl, struct lower_emutls_data *d, bool for_debug)
{
/* Compute the address of the TLS variable with help from runtime. */
tls_var_data *data = tls_map->get (varpool_node::get (decl));
tree addr = data->access;
- if (addr == NULL)
+ if (addr == NULL && !for_debug)
{
varpool_node *cvar;
tree cdecl;
@@ -480,7 +480,7 @@ lower_emutls_1 (tree *ptr, int *walk_subtrees, void *cb_data)
*ptr = t = unshare_expr (t);
/* If we're allowed more than just is_gimple_val, continue. */
- if (!wi->val_only)
+ if (!wi->val_only || is_gimple_debug (wi->stmt))
{
*walk_subtrees = 1;
return NULL_TREE;
@@ -536,7 +536,15 @@ lower_emutls_1 (tree *ptr, int *walk_subtrees, void *cb_data)
return NULL_TREE;
}
- addr = gen_emutls_addr (t, d);
+ addr = gen_emutls_addr (t, d, is_gimple_debug (wi->stmt));
+ if (!addr)
+ {
+ gimple_debug_bind_reset_value (wi->stmt);
+ update_stmt (wi->stmt);
+ wi->changed = false;
+ /* Stop walking operands. */
+ return error_mark_node;
+ }
if (is_addr)
{
/* Replace "&var" with "addr" in the statement. */
@@ -590,6 +598,7 @@ lower_emutls_phi_arg (gphi *phi, unsigned int i,
memset (&wi, 0, sizeof (wi));
wi.info = d;
wi.val_only = true;
+ wi.stmt = phi;
walk_tree (&pd->def, lower_emutls_1, &wi, NULL);
/* For normal statements, we let update_stmt do its job. But for phi