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 4/4] gcc/arc: Avoid JUMP_LABEL_AS_INSN for possible return jumps


We currently call JUMP_LABEL_AS_INSN on a jump instruction that might
have SIMPLE_RETURN as it's jump label, this triggers the assertions as
SIMPLE_RETURN is of type rtx_extra, not rtx_insn.

This commit first calls JUMP_LABEL then uses ANY_RETURN_P to catch all
of the return style jump labels.  After this we can use the safe_as_a
cast mechanism to safely convert the jump label to an rtx_insn.

There's a test included, but this issue is also hit in the tests:
    gcc.c-torture/execute/20000605-2.c
    gcc.dg/torture/pr68083.c

gcc/ChangeLog:

	* config/arc/arc.c (arc_loop_hazard): Don't convert the jump label
	rtx to an rtx_insn until we confirm it's not a return rtx.

gcc/testsuite/ChangeLog:

	* gcc.target/arc/loop-hazard-1.c: New file.
---
 gcc/ChangeLog                                |  5 +++++
 gcc/config/arc/arc.c                         | 15 ++++++++-------
 gcc/testsuite/ChangeLog                      |  4 ++++
 gcc/testsuite/gcc.target/arc/loop-hazard-1.c | 16 ++++++++++++++++
 4 files changed, 33 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/arc/loop-hazard-1.c

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dcc0930..bd2621d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
 2015-12-09  Andrew Burgess  <andrew.burgess@embecosm.com>
 
+	* config/arc/arc.c (arc_loop_hazard): Don't convert the jump label
+	rtx to an rtx_insn until we confirm it's not a return rtx.
+
+2015-12-09  Andrew Burgess  <andrew.burgess@embecosm.com>
+
 	* config/arc/arc.md (*storeqi_update): Use 'memory_operand' and
 	fix RTL pattern to include the plus.
 	(*storehi_update): Likewise.
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 5bc2bce..2c0f8b9 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -7987,6 +7987,7 @@ static bool
 arc_loop_hazard (rtx_insn *pred, rtx_insn *succ)
 {
   rtx_insn *jump  = NULL;
+  rtx label_rtx = NULL_RTX;
   rtx_insn *label = NULL;
   basic_block succ_bb;
 
@@ -8013,22 +8014,22 @@ arc_loop_hazard (rtx_insn *pred, rtx_insn *succ)
   else
     return false;
 
-  label = JUMP_LABEL_AS_INSN (jump);
-  if (!label)
-    return false;
-
   /* Phase 2b: Make sure is not a millicode jump.  */
   if ((GET_CODE (PATTERN (jump)) == PARALLEL)
       && (XVECEXP (PATTERN (jump), 0, 0) == ret_rtx))
     return false;
 
-  /* Phase 2c: Make sure is not a simple_return.  */
-  if ((GET_CODE (PATTERN (jump)) == SIMPLE_RETURN)
-      || (GET_CODE (label) == SIMPLE_RETURN))
+  label_rtx = JUMP_LABEL (jump);
+  if (!label_rtx)
+    return false;
+
+  /* Phase 2c: Make sure is not a return.  */
+  if (ANY_RETURN_P (label_rtx))
     return false;
 
   /* Pahse 2d: Go to the target of the jump and check for aliveness of
      LP_COUNT register.  */
+  label = safe_as_a <rtx_insn *> (label_rtx);
   succ_bb = BLOCK_FOR_INSN (label);
   if (!succ_bb)
     {
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6ab629a..b98706f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
 2015-12-09  Andrew Burgess  <andrew.burgess@embecosm.com>
 
+	* gcc.target/arc/loop-hazard-1.c: New file.
+
+2015-12-09  Andrew Burgess  <andrew.burgess@embecosm.com>
+
 	* gcc.target/arc/load-update.c: New file.
 
 2015-12-09  Andrew Burgess  <andrew.burgess@embecosm.com>
diff --git a/gcc/testsuite/gcc.target/arc/loop-hazard-1.c b/gcc/testsuite/gcc.target/arc/loop-hazard-1.c
new file mode 100644
index 0000000..7c688bb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arc/loop-hazard-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+/* This caused an assertion within arc_loop_hazard.  */
+
+unsigned a, b;
+
+long fn1()
+{
+  long c = 1, d = 0;
+  while (a && c && b)
+    c <<= 1;
+  while (c)
+    d |= c;
+  return d;
+}
-- 
2.5.1


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