aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-07-07 09:49:14 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-07-07 09:49:14 +0000
commitf40ce450f3c4b1cfd0a7e9c68e0c2a60d04b2a03 (patch)
tree90b1d02254fad6b9e9a1469c17d9526c069c2344 /gcc
parent389aba0d2d8b437002017f9636676a81241140eb (diff)
downloadgcc-f40ce450f3c4b1cfd0a7e9c68e0c2a60d04b2a03.zip
gcc-f40ce450f3c4b1cfd0a7e9c68e0c2a60d04b2a03.tar.gz
gcc-f40ce450f3c4b1cfd0a7e9c68e0c2a60d04b2a03.tar.bz2
Fix uninitialised use in mips_split_move
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/mips/mips.c4
2 files changed, 7 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index edb8df5..13622c8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index cbebb45..e0535b1 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -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