This is the mail archive of the
mailing list for the GCC project.
Re: [PATCH rs6000] remove implicit static var outputs of toc_relative_expr_p
On Wed, Jun 28, 2017 at 03:21:49PM -0500, Aaron Sawdey wrote:
> > It is probably nicer to have a separate function for
> > toc_relative_expr_p
> > and one to pull the base/offset out. And maybe don't keep it cached
> > for
> > the output function either? It has all info it needs, right, the
> > full
> > address RTX? I don't think it is measurably slower to pull the
> > address
> > apart an extra time?
> I think it doesn't make a lot of sense to have two functions as you
> have to do nearly all the work just to get the true/false return value,
> you have to completely compute tocrel_base.
Right, but how much work is that? And it will get rid of all the cached
stuff, simplifying things quite a bit. None of this is new in your
patch of course.
> /* Return true if OP is a toc pointer relative address (the output
> of create_TOC_reference). If STRICT, do not match non-split
> - -mcmodel=large/medium toc pointer relative addresses. */
> + -mcmodel=large/medium toc pointer relative addresses. Place base
> + and offset pieces in TOCREL_BASE and TOCREL_OFFSET respectively. */
"If those are non-NULL"?
> -toc_relative_expr_p (const_rtx op, bool strict)
> +toc_relative_expr_p (const_rtx op, bool strict, const_rtx *tocrel_base_ret,
> + const_rtx *tocrel_offset_ret)
> if (!TARGET_TOC)
> return false;
> - tocrel_base = op;
> - tocrel_offset = const0_rtx;
> + const_rtx tocrel_base = op;
> + const_rtx tocrel_offset = const0_rtx;
> if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), GET_MODE (op)))
> tocrel_base = XEXP (op, 0);
> - tocrel_offset = XEXP (op, 1);
> + if (tocrel_offset_ret)
> + tocrel_offset = XEXP (op, 1);
Lose the "if"? Or do you get a compiler warning then?
> @@ -8674,7 +8686,8 @@
> legitimate_constant_pool_address_p (const_rtx x, machine_mode mode,
> bool strict)
> - return (toc_relative_expr_p (x, strict)
> + const_rtx tocrel_base, tocrel_offset;
> + return (toc_relative_expr_p (x, strict, &tocrel_base, &tocrel_offset)
> && (TARGET_CMODEL != CMODEL_MEDIUM
> || constant_pool_expr_p (XVECEXP (tocrel_base, 0, 0))
> || mode == QImode
Use NULL for the args here, instead?
The patch is okay for trunk with those things taken care of. Thanks,