SPARC: Make sure that jump is to a label in errata workaround
authorDaniel Cederman <cederman@gaisler.com>
Tue, 19 Dec 2017 08:04:52 +0000 (08:04 +0000)
committerSebastian Huber <sh@gcc.gnu.org>
Tue, 19 Dec 2017 08:04:52 +0000 (08:04 +0000)
In some cases the jump could be to a return instruction and in those cases the
next_active_insn() function tries to follow an invalid pointer which leads to a
crash. This error did not manifest when using a 32-bit version of GCC which is
why I did not detect it before.

gcc/
* config/sparc/sparc.c (sparc_do_work_around_errata): Make sure
the jump is to a label.

From-SVN: r255807

gcc/ChangeLog
gcc/config/sparc/sparc.c

index 9c0419d83334317f5d0bea14cd55cf109c368b5f..31a60f1757d0fc20aca7703c849d6d3b5604ec0a 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-19  Daniel Cederman  <cederman@gaisler.com>
+
+       * config/sparc/sparc.c (sparc_do_work_around_errata): Make sure
+       the jump is to a label.
+
 2017-12-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/83444
index c7c0bd82e3b3d51c08427541f1983f80540c5104..288264f0e8c048ddeff338fd02623c132864ce36 100644 (file)
@@ -1066,6 +1066,7 @@ sparc_do_work_around_errata (void)
         floating-point operation or a floating-point branch.  */
       if (sparc_fix_gr712rc
          && jump
+         && jump_to_label_p (jump)
          && get_attr_branch_type (jump) == BRANCH_TYPE_ICC)
        {
          rtx_insn *target = next_active_insn (JUMP_LABEL_AS_INSN (jump));
@@ -1085,7 +1086,7 @@ sparc_do_work_around_errata (void)
          && mem_ref (SET_SRC (set))
          && REG_P (SET_DEST (set)))
        {
-         if (jump)
+         if (jump && jump_to_label_p (jump))
            {
              rtx_insn *target = next_active_insn (JUMP_LABEL_AS_INSN (jump));
              if (target && atomic_insn_for_leon3_p (target))