arm: fix rtl checking bootstrap (PR target/93312)
authorJakub Jelinek <jakub@redhat.com>
Sat, 18 Jan 2020 08:41:59 +0000 (09:41 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sat, 18 Jan 2020 08:41:59 +0000 (09:41 +0100)
As reported in PR93312, the:
> > > > > >         * config/arm/arm.c (clear_operation_p): New function.
change broke RTL checking bootstrap.

On the testcase from the PR (which is distilled from libgcc2.c, so I think
we don't need to add it into testsuite) we ICE because SET_DEST (elt) is
not a REG, but SUBREG.  The code uses REGNO on it, which is invalid, but
only stores it into a variable, then performs REG_P (reg) check,
determines it is not a REG and bails early.

The following patch just moves the regno variable initialization after that
check, it isn't used in between.  And, as a small optimization, because
reg doesn't change, doesn't use REGNO (reg) a second time to set last_regno.

2020-01-18  Jakub Jelinek  <jakub@redhat.com>

PR target/93312
* config/arm/arm.c (clear_operation_p): Don't use REGNO until
after checking the argument is a REG.  Don't use REGNO (reg)
again to set last_regno, reuse regno variable instead.

gcc/ChangeLog
gcc/config/arm/arm.c

index d837e95509ad9cd615c3b82dbf6135527a1bea9f..001e26d12dee6d7b76cc188cedbb2630398787a1 100644 (file)
@@ -1,8 +1,15 @@
+2020-01-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/93312
+       * config/arm/arm.c (clear_operation_p): Don't use REGNO until
+       after checking the argument is a REG.  Don't use REGNO (reg)
+       again to set last_regno, reuse regno variable instead.
+
 2020-01-17  David Malcolm  <dmalcolm@redhat.com>
 
        * doc/analyzer.texi (Limitations): Add note about NaN.
 
-2020-01-17  Mihail-Calin Ionescu <mihail.ionescu@arm.com>
+2020-01-17  Mihail-Calin Ionescu  <mihail.ionescu@arm.com>
            Sudakshina Das  <sudi.das@arm.com>
 
        * config/arm/arm.md (ashldi3): Generate thumb2_lsll for both reg
        * config/arm/t-rmprofile: Map v8.1-M multilibs to v8-M.
        * doc/invoke.texi: Document the armv8.1-m mve and dps options.
 
-2020-01-16  Mihail-Calin Ionescu <mihail.ionescu@arm.com>
-           Thomas Preud'homme <thomas.preudhomme@arm.com>
+2020-01-16  Mihail-Calin Ionescu  <mihail.ionescu@arm.com>
+           Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * config/arm/arm-cpus.in (ARMv8_1m_main): Redefine as an extension to
        Armv8-M Mainline.
        * config/arm/vfp.md (push_fpsysreg_insn): New define_insn.
        (pop_fpsysreg_insn): Likewise.
 
-2020-01-16  Mihail-Calin Ionescu <mihail.ionescu@arm.com>
-           Thomas Preud'homme <thomas.preudhomme@arm.com>
+2020-01-16  Mihail-Calin Ionescu  <mihail.ionescu@arm.com>
+           Thomas Preud'homme  <thomas.preudhomme@arm.com>
 
        * config/arm/arm-cpus.in (armv8_1m_main): New feature.
        (ARMv4, ARMv4t, ARMv5t, ARMv5te, ARMv5tej, ARMv6, ARMv6j, ARMv6k,
index 6ead410d1a8b307a646fda57b37b884fae7d0ab0..c47fc232f39e13f5033d97847aa9805dd9ab4a52 100644 (file)
@@ -13779,7 +13779,6 @@ clear_operation_p (rtx op, bool vfp)
        return false;
 
       reg = SET_DEST (elt);
-      regno = REGNO (reg);
       zero = SET_SRC (elt);
 
       if (!REG_P (reg)
@@ -13787,6 +13786,8 @@ clear_operation_p (rtx op, bool vfp)
          || zero != CONST0_RTX (SImode))
        return false;
 
+      regno = REGNO (reg);
+
       if (vfp)
        {
          if (i != 1 && regno != last_regno + 1)
@@ -13800,7 +13801,7 @@ clear_operation_p (rtx op, bool vfp)
            return false;
        }
 
-      last_regno = REGNO (reg);
+      last_regno = regno;
     }
 
   return true;