backport: re PR c/81687 (Compiler drops label in OpenMP region)

2017-09-07  Jakub Jelinek  <jakub@redhat.com>

	Backported from mainline
	2017-08-09  Jakub Jelinek  <jakub@redhat.com>

	PR c/81687
	* omp-low.c (omp_copy_decl): Don't remap FORCED_LABEL or DECL_NONLOCAL
	LABEL_DECLs.
	* tree-cfg.c (move_stmt_op): Don't adjust DECL_CONTEXT of FORCED_LABEL
	or DECL_NONLOCAL labels.
	(move_stmt_r) <case GIMPLE_LABEL>: Adjust DECL_CONTEXT of FORCED_LABEL
	or DECL_NONLOCAL labels here.

	* testsuite/libgomp.c/pr81687-1.c: New test.
	* testsuite/libgomp.c/pr81687-2.c: New test.

From-SVN: r251853
This commit is contained in:
Jakub Jelinek 2017-09-07 22:26:34 +02:00 committed by Jakub Jelinek
parent 4330b878c7
commit 9e2e13bd6d
6 changed files with 92 additions and 1 deletions

View File

@ -1,6 +1,16 @@
2017-09-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2017-08-09 Jakub Jelinek <jakub@redhat.com>
PR c/81687
* omp-low.c (omp_copy_decl): Don't remap FORCED_LABEL or DECL_NONLOCAL
LABEL_DECLs.
* tree-cfg.c (move_stmt_op): Don't adjust DECL_CONTEXT of FORCED_LABEL
or DECL_NONLOCAL labels.
(move_stmt_r) <case GIMPLE_LABEL>: Adjust DECL_CONTEXT of FORCED_LABEL
or DECL_NONLOCAL labels here.
2017-08-03 Jakub Jelinek <jakub@redhat.com>
PR target/81621

View File

@ -800,6 +800,8 @@ omp_copy_decl (tree var, copy_body_data *cb)
if (TREE_CODE (var) == LABEL_DECL)
{
if (FORCED_LABEL (var) || DECL_NONLOCAL (var))
return var;
new_var = create_artificial_label (DECL_SOURCE_LOCATION (var));
DECL_CONTEXT (new_var) = current_function_decl;
insert_decl_map (&ctx->cb, var, new_var);

View File

@ -6667,7 +6667,15 @@ move_stmt_op (tree *tp, int *walk_subtrees, void *data)
*tp = t = out->to;
}
DECL_CONTEXT (t) = p->to_context;
/* For FORCED_LABELs we can end up with references from other
functions if some SESE regions are outlined. It is UB to
jump in between them, but they could be used just for printing
addresses etc. In that case, DECL_CONTEXT on the label should
be the function containing the glabel stmt with that LABEL_DECL,
rather than whatever function a reference to the label was seen
last time. */
if (!FORCED_LABEL (t) && !DECL_NONLOCAL (t))
DECL_CONTEXT (t) = p->to_context;
}
else if (p->remap_decls_p)
{
@ -6785,6 +6793,21 @@ move_stmt_r (gimple_stmt_iterator *gsi_p, bool *handled_ops_p,
case GIMPLE_OMP_RETURN:
case GIMPLE_OMP_CONTINUE:
break;
case GIMPLE_LABEL:
{
/* For FORCED_LABEL, move_stmt_op doesn't adjust DECL_CONTEXT,
so that such labels can be referenced from other regions.
Make sure to update it when seeing a GIMPLE_LABEL though,
that is the owner of the label. */
walk_gimple_op (stmt, move_stmt_op, wi);
*handled_ops_p = true;
tree label = gimple_label_label (as_a <glabel *> (stmt));
if (FORCED_LABEL (label) || DECL_NONLOCAL (label))
DECL_CONTEXT (label) = p->to_context;
}
break;
default:
if (is_gimple_omp (stmt))
{

View File

@ -1,6 +1,12 @@
2017-09-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2017-08-09 Jakub Jelinek <jakub@redhat.com>
PR c/81687
* testsuite/libgomp.c/pr81687-1.c: New test.
* testsuite/libgomp.c/pr81687-2.c: New test.
2017-07-27 Jakub Jelinek <jakub@redhat.com>
PR c/45784

View File

@ -0,0 +1,23 @@
/* PR c/81687 */
/* { dg-do link } */
/* { dg-additional-options "-O2" } */
extern int printf (const char *, ...);
int
main ()
{
#pragma omp parallel
{
lab1:
printf ("lab1=%p\n", (void *)(&&lab1));
}
lab2:
#pragma omp parallel
{
lab3:
printf ("lab2=%p\n", (void *)(&&lab2));
}
printf ("lab3=%p\n", (void *)(&&lab3));
return 0;
}

View File

@ -0,0 +1,27 @@
/* PR c/81687 */
/* { dg-do link } */
/* { dg-additional-options "-O2" } */
int
main ()
{
__label__ lab4, lab5, lab6;
volatile int l = 0;
int m = l;
void foo (int x) { if (x == 1) goto lab4; }
void bar (int x) { if (x == 2) goto lab5; }
void baz (int x) { if (x == 3) goto lab6; }
#pragma omp parallel
{
foo (m + 1);
lab4:;
}
#pragma omp task
{
bar (m + 2);
lab5:;
}
baz (m + 3);
lab6:;
return 0;
}