This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 4/4] gcc/arc: Avoid JUMP_LABEL_AS_INSN for possible return jumps
- From: Andrew Burgess <andrew dot burgess at embecosm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Claudiu dot Zissulescu at synopsys dot com, gnu at amylaar dot uk, Andrew Burgess <andrew dot burgess at embecosm dot com>
- Date: Wed, 16 Dec 2015 00:15:23 +0000
- Subject: [PATCH 4/4] gcc/arc: Avoid JUMP_LABEL_AS_INSN for possible return jumps
- Authentication-results: sourceware.org; auth=none
- References: <cover dot 1450224136 dot git dot andrew dot burgess at embecosm dot com>
- References: <cover dot 1450224136 dot git dot andrew dot burgess at embecosm dot com>
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