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.burg...@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.burg...@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.burg...@embecosm.com> + * gcc.target/arc/loop-hazard-1.c: New file. + +2015-12-09 Andrew Burgess <andrew.burg...@embecosm.com> + * gcc.target/arc/load-update.c: New file. 2015-12-09 Andrew Burgess <andrew.burg...@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