This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Update check after force_const_mem call in the plus_constant function to see if the value returned is not a NULL_RTX.
- From: Andrew Bennett <Andrew dot Bennett at imgtec dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 2 Jun 2015 14:19:52 +0000
- Subject: [PATCH] Update check after force_const_mem call in the plus_constant function to see if the value returned is not a NULL_RTX.
- Authentication-results: sourceware.org; auth=none
Hi,
In the plus_constant function in explow.c the code to update a constant pool value
does not deal with the case where the value returned from force_const_mem is a
NULL_RTX. This occurs for the MIPS target because its
cannot_force_const_mem target function does not allow constants (so that the
move expanders can deal with them later on), this then causes the force_const_mem
function to return a NULL_RTX and then causes GCC to segmentation fault when calling
the memory_address_p function.
The fix is to add a check that the tem variable is not a NULL_RTX before
the memory_address_p function call. I have tested the fix on the mips-mti-linux-gnu
target for both mips32r2 o32 and mips64r2 n64 and there have been no regressions.
The patch and ChangeLog are below.
Ok to commit?
Many thanks,
Andrew
* explow.c (plus_constant): Update check after force_const_mem call to see if the
value returned is not a NULL_RTX.
diff --git a/gcc/explow.c b/gcc/explow.c
index d1a2bf8..8745aea 100644
--- a/gcc/explow.c
+++ b/gcc/explow.c
@@ -132,7 +132,9 @@ plus_constant (machine_mode mode, rtx x, HOST_WIDE_INT c,
{
tem = plus_constant (mode, get_pool_constant (XEXP (x, 0)), c);
tem = force_const_mem (GET_MODE (x), tem);
- if (memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
+ /* Targets may disallow some constants in the constant pool, thus
+ force_const_mem may return NULL_RTX. */
+ if (tem && memory_address_p (GET_MODE (tem), XEXP (tem, 0)))
return tem;
}
break;