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]

[RFA][PATCH] Fix tree-optimization/59919


As noted in the PR, we have a call to a non-returning function which occurs within a function that calls setjmp.

The non-returning call ends its containing basic block and there are no normal outgoing edges from that block. Because the containing function calls setjmp, there is an abnormal edge from the block containing the non-returning call.

ie:

;;   basic block 2, loop depth 0, count 0, freq 10000, maybe hot
;;    prev block 0, next block 3, flags: (NEW, REACHABLE)
;;    pred:       ENTRY [100.0%]  (FALLTHRU,EXECUTABLE)
  bar (p_3(D));
;;    succ:       3 [100.0%]  (ABNORMAL,EXECUTABLE)

;;   basic block 3, loop depth 0, count 0, freq 10000, maybe hot
;;   Invalid sum of incoming frequencies 15000, should be 10000
;;    prev block 2, next block 4, flags: (NEW, REACHABLE, IRREDUCIBLE_LOOP)
;;    pred:       2 [100.0%]  (ABNORMAL,EXECUTABLE)
;;                3 [50.0%]  (ABNORMAL,DFS_BACK,IRREDUCIBLE_LOOP,EXECUTABLE)
  setjmp (_4(D));
  _6 = &p_3(D)->i;
  foo (_6);
;;    succ:       3 [50.0%]  (ABNORMAL,DFS_BACK,IRREDUCIBLE_LOOP,EXECUTABLE)
;;                4 [50.0%]  (FALLTHRU,EXECUTABLE)

;;   basic block 4, loop depth 0, count 0, freq 5000, maybe hot
;;    prev block 3, next block 1, flags: (NEW, REACHABLE)
;;    pred:       3 [50.0%]  (FALLTHRU,EXECUTABLE)
  return;

We want to insert an ASSERT_EXPR for the call to bar to assert that p_3 is non-null (because of the non-null attribute)

The code to insert ASSERT_EXPRs doesn't know where to insert the ASSERT_EXPR and aborts.

This patch simply avoids registering ASSERT_EXPR insertions that arise as a result of non-returning calls.

Bootstrapped and regression tested on x86_64-unknown-linux-gnu. OK for the trunk?

Jeff

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2998c72..e27f5b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-23  Jeff Law  <law@redhat.com>
+
+	PR tree-optimization/59919
+	* tree-vrp.c (find_assert_locations_1): Do not register asserts
+	for non-returning calls.
+
 2014-01-23  Pat Haugen  <pthaugen@us.ibm.com>
 
 	* config/rs6000/rs6000.c (rs6000_option_override_internal): Don't
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 564d425..44e135a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-01-23  Jeff Law  <law@redhat.com>
+
+	PR tree-optimization/59919
+	* gcc.c-torture/compile/pr59919.c: New test.
+
 2014-01-23  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/58980
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr59919.c b/gcc/testsuite/gcc.c-torture/compile/pr59919.c
new file mode 100644
index 0000000..6809caa
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr59919.c
@@ -0,0 +1,18 @@
+typedef int jmp_buf[10];
+struct S
+{
+  int i;
+  jmp_buf buf;
+};
+
+void setjmp (jmp_buf);
+void foo (int *);
+__attribute__ ((__noreturn__, __nonnull__)) void bar (struct S *);
+
+void
+baz (struct S *p)
+{
+  bar (p);
+  setjmp (p->buf);
+  foo (&p->i);
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index f6da192..3d43d93 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -5891,8 +5891,13 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
 		    }
 		}
 
-	      register_new_assert_for (op, op, comp_code, value, bb, NULL, si);
-	      need_assert = true;
+	      /* Do not register any assertions for a non-returning call.  */
+	      if (!is_gimple_call (stmt) || !gimple_call_noreturn_p (stmt))
+		{
+		  register_new_assert_for (op, op, comp_code,
+					   value, bb, NULL, si);
+		  need_assert = true;
+		}
 	    }
 	}
 

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