Fix uninitialised use in mips_split_move
authorRichard Sandiford <richard.sandiford@arm.com>
Sun, 7 Jul 2019 09:49:14 +0000 (09:49 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 7 Jul 2019 09:49:14 +0000 (09:49 +0000)
While testing the fix for PR91068, I hit an rtl checking failure
while building newlib.  mips_split_move was decomposing an address that
happened to be symbolic and then tried to access the REGNO of the base
register field, which wasn't initialised but which by chance pointed to
valid memory.

2019-07-07  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* config/mips/mips.c (mips_split_move): Zero-initialize addr
and check whether addr.reg is nonnull before using it.

From-SVN: r273174

gcc/ChangeLog
gcc/config/mips/mips.c

index edb8df5e15d20592c3e4f274910d92618f305df3..13622c8abbee5771cfb8020fc3b5f594f6666535 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-07  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/mips/mips.c (mips_split_move): Zero-initialize addr
+       and check whether addr.reg is nonnull before using it.
+
 2019-07-06  Jakub Jelinek  <jakub@redhat.com>
 
        * omp-low.c (lower_rec_input_clauses): For lastprivate clauses in
index cbebb455fd5308b36248c01155a0091652ede9d3..e0535b18b7f00760d3d23bcd568f59e0296178fd 100644 (file)
@@ -4849,7 +4849,7 @@ mips_split_move (rtx dest, rtx src, enum mips_split_type split_type, rtx insn_)
      can forward SRC for DEST.  This is most useful if the next insn is a
      simple store.   */
   rtx_insn *insn = (rtx_insn *)insn_;
-  struct mips_address_info addr;
+  struct mips_address_info addr = {};
   if (insn)
     {
       rtx_insn *next = next_nonnote_nondebug_insn_bb (insn);
@@ -4862,7 +4862,7 @@ mips_split_move (rtx dest, rtx src, enum mips_split_type split_type, rtx insn_)
                {
                  rtx tmp = XEXP (src, 0);
                  mips_classify_address (&addr, tmp, GET_MODE (tmp), true);
-                 if (REGNO (addr.reg) != REGNO (dest))
+                 if (addr.reg && REGNO (addr.reg) != REGNO (dest))
                    validate_change (next, &SET_SRC (set), src, false);
                }
              else