aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2017-12-22 02:07:31 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2017-12-22 02:07:31 +0000
commit18408e962e5afb9cb3f45f897cc8dd1f9b91417f (patch)
tree0e7d1c33665858f6ba7e584ff9b9744de0b9c9c2
parentcacb2cce55df175925c16dd3c640e08c4c8a8374 (diff)
downloadgcc-18408e962e5afb9cb3f45f897cc8dd1f9b91417f.zip
gcc-18408e962e5afb9cb3f45f897cc8dd1f9b91417f.tar.gz
gcc-18408e962e5afb9cb3f45f897cc8dd1f9b91417f.tar.bz2
[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
-rw-r--r--gcc/c-family/ChangeLog8
-rw-r--r--gcc/c-family/c-semantics.c23
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/pr83527.c26
4 files changed, 59 insertions, 4 deletions
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 <aoliva@redhat.com>
+
+ 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 <aoliva@redhat.com>
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 <aoliva@redhat.com>
+
+ PR debug/83527
+ PR debug/83419
+ * gcc.dg/pr83527.c: New.
+
2017-12-21 Martin Sebor <msebor@redhat.com>
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);
+ }
+}