Message ID | 1ce37b29589f728614f979483c37045b1f6e582c.1535106410.git.segher@kernel.crashing.org |
---|---|
State | New |
Headers | show |
Series | (PR86989) | expand |
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.
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