From 18408e962e5afb9cb3f45f897cc8dd1f9b91417f Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Fri, 22 Dec 2017 02:07:31 +0000 Subject: [PATCH] [SFN] sync up debug-only stmt list's side effects with empty stmts too for gcc/c-family/ChangeLog PR debug/83527 PR debug/83419 * c-semantics.c (only_debug_stmts_after_p): New. (pop_stmt_list): Clear side effects in debug-only stmt list. Check for single nondebug stmt followed by debug stmts only. for gcc/testsuite/ChangeLog PR debug/83527 PR debug/83419 * gcc.dg/pr83527.c: New. From-SVN: r255966 --- gcc/c-family/ChangeLog | 8 ++++++++ gcc/c-family/c-semantics.c | 23 +++++++++++++++++++---- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/pr83527.c | 26 ++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr83527.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 6f62034..ba61fce 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,11 @@ +2017-12-22 Alexandre Oliva + + PR debug/83527 + PR debug/83419 + * c-semantics.c (only_debug_stmts_after_p): New. + (pop_stmt_list): Clear side effects in debug-only stmt list. + Check for single nondebug stmt followed by debug stmts only. + 2017-12-21 Alexandre Oliva PR debug/83419 diff --git a/gcc/c-family/c-semantics.c b/gcc/c-family/c-semantics.c index 3a972c3..21d908e 100644 --- a/gcc/c-family/c-semantics.c +++ b/gcc/c-family/c-semantics.c @@ -35,6 +35,17 @@ push_stmt_list (void) return t; } +/* Return TRUE if, after I, there are any nondebug stmts. */ + +static inline bool +only_debug_stmts_after_p (tree_stmt_iterator i) +{ + for (tsi_next (&i); !tsi_end_p (i); tsi_next (&i)) + if (TREE_CODE (tsi_stmt (i)) != DEBUG_BEGIN_STMT) + return false; + return true; +} + /* Finish the statement tree rooted at T. */ tree @@ -99,11 +110,15 @@ pop_stmt_list (tree t) while (!tsi_end_p (i) && TREE_CODE (tsi_stmt (i)) == DEBUG_BEGIN_STMT) tsi_next (&i); - /* If there's only one nondebug stmt in the list, we'd have - extracted the stmt and dropped the list, and we'd take - TREE_SIDE_EFFECTS from that statement, so keep the list's + /* If there are only debug stmts in the list, without them + we'd have an empty stmt without side effects. If there's + only one nondebug stmt, we'd have extracted the stmt and + dropped the list, and we'd take TREE_SIDE_EFFECTS from + that statement. In either case, keep the list's TREE_SIDE_EFFECTS in sync. */ - if (tsi_one_before_end_p (i)) + if (tsi_end_p (i)) + TREE_SIDE_EFFECTS (t) = 0; + else if (only_debug_stmts_after_p (i)) TREE_SIDE_EFFECTS (t) = TREE_SIDE_EFFECTS (tsi_stmt (i)); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 79ee49c..3969bd2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2017-12-22 Alexandre Oliva + + PR debug/83527 + PR debug/83419 + * gcc.dg/pr83527.c: New. + 2017-12-21 Martin Sebor PR testsuite/83462 diff --git a/gcc/testsuite/gcc.dg/pr83527.c b/gcc/testsuite/gcc.dg/pr83527.c new file mode 100644 index 0000000..effef43 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83527.c @@ -0,0 +1,26 @@ +/* PR debug/83527 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug" } */ + +extern void fn2(void); +extern void fn3(void); +int a, b; +void fn1() { + int c; + short d; + switch (a) { + case 32800: + fn2(); + case 32769: + b = 0; + case 32771: + case 32772: + case 32782: + fn3(); + } + if (d || c) { + do + ; + while (0); + } +} -- 2.7.4