https://gcc.gnu.org/PR91702 From d57faea9337ad595d005687247c3322252f70ba1 Mon Sep 17 00:00:00 2001 From: rsandifo Date: Sun, 7 Jul 2019 09:49:14 +0000 Subject: [PATCH] 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 gcc/ * config/mips/mips.c (mips_split_move): Zero-initialize addr and check whether addr.reg is nonnull before using it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@273174 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/config/mips/mips.c | 4 ++-- --- 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 -- 2.23.0