This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix -Wduplicated-branches with -g (PR c/85094)


Hi!

With the introduction of DEBUG_BEGIN_STMT/-gstatement-frontiers on by
default, the -Wduplicated-branches warning doesn't work anymore with -g,
because operand_equal_p in OEP_LEXICOGRAPHIC mode doesn't consider
DEBUG_BEGIN_STMTs as equal unless they are pointer equal.  For the warning
we either need to ignore them completely (but that would need more changes,
as the hashing doesn't ignore them), or at least what the second hunk does,
consider them equal.  The first hunk is just an optimization, if
-Wduplicated-branches is used on extremely deeply nested STATEMENT_LISTs,
then for -fchecking we'd be computing the hashes etc. at the level of every
stmt of every STATEMENT_LIST; we need to do that just once at the toplevel.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2018-03-28  Jakub Jelinek  <jakub@redhat.com>

	PR c/85094
	* fold-const.c (operand_equal_p): Handle DEBUG_BEGIN_STMT.
	For STATEMENT_LIST, pass down OEP_LEXICOGRAPHIC and maybe
	OEP_NO_HASH_CHECK for recursive call, to avoid exponential
	checking.

	* c-c++-common/Wduplicated-branches-14.c: New test.

--- gcc/fold-const.c.jj	2018-03-27 12:54:43.657242009 +0200
+++ gcc/fold-const.c	2018-03-28 16:20:40.024574216 +0200
@@ -3479,7 +3479,8 @@ operand_equal_p (const_tree arg0, const_
 	      if (tsi_end_p (tsi1) && tsi_end_p (tsi2))
 		return 1;
 	      if (!operand_equal_p (tsi_stmt (tsi1), tsi_stmt (tsi2),
-				    OEP_LEXICOGRAPHIC))
+				    flags & (OEP_LEXICOGRAPHIC
+					     | OEP_NO_HASH_CHECK)))
 		return 0;
 	    }
 	}
@@ -3492,6 +3493,10 @@ operand_equal_p (const_tree arg0, const_
 	  if (flags & OEP_LEXICOGRAPHIC)
 	    return OP_SAME_WITH_NULL (0);
 	  return 0;
+	case DEBUG_BEGIN_STMT:
+	  if (flags & OEP_LEXICOGRAPHIC)
+	    return 1;
+	  return 0;
 	default:
 	  return 0;
 	 }
--- gcc/testsuite/c-c++-common/Wduplicated-branches-14.c.jj	2018-03-28 16:20:00.966553266 +0200
+++ gcc/testsuite/c-c++-common/Wduplicated-branches-14.c	2018-03-28 16:19:07.264524448 +0200
@@ -0,0 +1,16 @@
+/* PR c/85094 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -Wduplicated-branches -g" } */
+
+extern int g;
+
+void
+foo (int r)
+{
+  if (r < 64)
+    g -= 48;
+  else if (r < 80)	/* { dg-warning "this condition has identical branches" } */
+    g -= 64 - 45;
+  else
+    g -= 80 - 61;
+}

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]