On Mon, Aug 08, 2016 at 12:55:59PM +0930, Alan Modra wrote: > On Mon, Aug 08, 2016 at 12:13:18PM +0930, Alan Modra wrote: > > This patch fixes a case where reload blindly assumes a subreg mem > > is OK if its address has been partially reloaded by > > legitimize_reload_address. The change ought to be fairly obvious > > considering that the analogous non-subreg case only gives a win to > > address_reloaded[i] == 1. Bootstrapped and regression tested > > powerpc64le-linux using > > RUNTESTFLAGS="--target_board=unix'{-mlra,-mno-lra}'" > > to run the testsuite using both lra and reload. OK for mainline > > and active branches? > > When I look at the correct bootstrap I see I have some regressions. > Sorry for the noise, patch withdrawn.
Hi Ulrich, Bernd, It turns out that the patch just exposed an existing rs6000 backend problem, that made the result of forcing a constant to memory invalid even for the "m" constraint. So please consider the patch again. Segher, is this rs6000 patch OK? Bootstrapped as above. PR target/72771 * config/rs6000/rs6000.c (toc_relative_expr_p): Allow lo_sum/high toc refs created during reload. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 7176939..8b8997b 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -7938,8 +7938,8 @@ constant_pool_expr_p (rtx op) static const_rtx tocrel_base, tocrel_offset; /* Return true if OP is a toc pointer relative address (the output - of create_TOC_reference). If STRICT, do not match high part or - non-split -mcmodel=large/medium toc pointer relative addresses. */ + of create_TOC_reference). If STRICT, do not match non-split + -mcmodel=large/medium toc pointer relative addresses. */ bool toc_relative_expr_p (const_rtx op, bool strict) @@ -7949,13 +7949,17 @@ toc_relative_expr_p (const_rtx op, bool strict) if (TARGET_CMODEL != CMODEL_SMALL) { - /* Only match the low part. */ - if (GET_CODE (op) == LO_SUM - && REG_P (XEXP (op, 0)) - && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict)) - op = XEXP (op, 1); - else if (strict) + /* When strict ensure we have everything tidy. */ + if (strict + && !(GET_CODE (op) == LO_SUM + && REG_P (XEXP (op, 0)) + && INT_REG_OK_FOR_BASE_P (XEXP (op, 0), strict))) return false; + + /* When not strict, allow non-split toc addresses and also allow + lo_sum/high addresses created during reload. */ + if (GET_CODE (op) == LO_SUM) + op = XEXP (op, 1); } tocrel_base = op; -- Alan Modra Australia Development Lab, IBM