(PR86989)
diff mbox series

Message ID 1ce37b29589f728614f979483c37045b1f6e582c.1535106410.git.segher@kernel.crashing.org
State New
Headers show
Series
  • (PR86989)
Related show

Commit Message

Segher Boessenkool Aug. 24, 2018, 10:44 a.m. UTC
There currently is nothing that prevents replacing the TOC_REGISTER in
a TOCREL unspec with something else, like a pseudo, or a memory ref.
This of course does not work.  Fix that.

Tested on powerpc64-linux {-m32,-m64}; committing.


Segher


2018-08-24  Segher Boessenkool  <segher@kernel.crashing.org>

	PR target/86989
	* config/rs6000/rs6000.c (toc_relative_expr_p): Check that the base is
	the TOC register.

---
 gcc/config/rs6000/rs6000.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Segher Boessenkool Sept. 12, 2018, 6:03 p.m. UTC | #1
On Fri, Aug 24, 2018 at 10:44:22AM +0000, Segher Boessenkool wrote:
> There currently is nothing that prevents replacing the TOC_REGISTER in
> a TOCREL unspec with something else, like a pseudo, or a memory ref.
> This of course does not work.  Fix that.

I backported this to 7 and 8 now.


Segher


> 	PR target/86989
> 	* config/rs6000/rs6000.c (toc_relative_expr_p): Check that the base is
> 	the TOC register.

Patch
diff mbox series

diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index a967912..ed33912 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -7932,7 +7932,9 @@  toc_relative_expr_p (const_rtx op, bool strict, const_rtx *tocrel_base_ret,
     *tocrel_offset_ret = tocrel_offset;
 
   return (GET_CODE (tocrel_base) == UNSPEC
-	  && XINT (tocrel_base, 1) == UNSPEC_TOCREL);
+	  && XINT (tocrel_base, 1) == UNSPEC_TOCREL
+	  && REG_P (XVECEXP (tocrel_base, 0, 1))
+	  && REGNO (XVECEXP (tocrel_base, 0, 1)) == TOC_REGISTER);
 }
 
 /* Return true if X is a constant pool address, and also for cmodel=medium