This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix avoid_constant_pool_reference (PR middle-end/77377)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Eric Botcazou <ebotcazou at adacore dot com>, Richard Biener <rguenther at suse dot de>, Jeff Law <law at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 29 Aug 2016 21:43:50 +0200
- Subject: [PATCH] Fix avoid_constant_pool_reference (PR middle-end/77377)
- Authentication-results: sourceware.org; auth=none
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
Returning c from avoid_constant_pool_reference for constant pool references
is only fine if the modes match and offset is zero, otherwise if the offset
is sane, we can try to simplify it as subreg. But, returning c for out of
bounds offsets is always wrong, and especially if the mode doesn't match, it
can results in all kinds of ICEs.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2016-08-29 Jakub Jelinek <jakub@redhat.com>
PR middle-end/77377
* simplify-rtx.c (avoid_constant_pool_reference): For out of bounds
constant pool reference return x instead of c.
* gcc.target/i386/pr77377.c: New test.
--- gcc/simplify-rtx.c.jj 2016-08-12 17:33:46.000000000 +0200
+++ gcc/simplify-rtx.c 2016-08-29 13:32:38.126859949 +0200
@@ -251,15 +251,14 @@ avoid_constant_pool_reference (rtx x)
/* If we're accessing the constant in a different mode than it was
originally stored, attempt to fix that up via subreg simplifications.
If that fails we have no choice but to return the original memory. */
- if ((offset != 0 || cmode != GET_MODE (x))
- && offset >= 0 && offset < GET_MODE_SIZE (cmode))
+ if (offset == 0 && cmode == GET_MODE (x))
+ return c;
+ else if (offset >= 0 && offset < GET_MODE_SIZE (cmode))
{
rtx tem = simplify_subreg (GET_MODE (x), c, cmode, offset);
if (tem && CONSTANT_P (tem))
return tem;
}
- else
- return c;
}
return x;
--- gcc/testsuite/gcc.target/i386/pr77377.c.jj 2016-08-29 13:39:01.707328239 +0200
+++ gcc/testsuite/gcc.target/i386/pr77377.c 2016-08-29 13:38:55.901396832 +0200
@@ -0,0 +1,6 @@
+/* PR middle-end/77377 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -msse" } */
+/* { dg-additional-options "-fpic" { target fpic } } */
+
+#include "../../c-c++-common/pr59037.c"
Jakub