arc.c (arc_loop_hazard): Don't convert the jump label rtx to an rtx_insn until we...
authorAndrew Burgess <andrew.burgess@embecosm.com>
Thu, 17 Dec 2015 10:53:43 +0000 (10:53 +0000)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Thu, 17 Dec 2015 10:53:43 +0000 (10:53 +0000)
2015-12-17  Andrew Burgess  <andrew.burgess@embecosm.com>
gcc:
        * 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:
        * gcc.target/arc/loop-hazard-1.c: New file

From-SVN: r231752

gcc/ChangeLog
gcc/config/arc/arc.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arc/loop-hazard-1.c [new file with mode: 0644]

index d992910f3930b8a8c0970c22b35c3c6b2577b263..375ab755e80357062167cc973295133a588c4b70 100644 (file)
@@ -1,3 +1,8 @@
+2015-12-17  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-17  Richard Biener  <rguenther@suse.de>
 
        * gimple-ssa.h (struct gimple_df): Remove modified_noreturn_calls
index 513d138780d235568b0a2b1552e5c398e1c5ce73..d3a6f27332a288a4b9cf7f3eb7e61a9e7103f29d 100644 (file)
@@ -8041,6 +8041,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;
 
@@ -8067,22 +8068,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)
     {
index 054bdf790f93b08adc1b93b06de527e6a052ed5b..674c868cf1100ab52b48cef6bd2196f0b779ef07 100644 (file)
        * gcc.dg/darwin-20040809-2.c: Likewise.
        * objc.dg/stabs-1.m: Likewise.
 
+2015-12-17  Andrew Burgess  <andrew.burgess@embecosm.com>
+
+       * gcc.target/arc/loop-hazard-1.c: New file.
+
 2015-12-17  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * gcc.target/arc/jump-around-jump.c (rtc_set_time): Declare.
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 (file)
index 0000000..7c688bb
--- /dev/null
@@ -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;
+}