Richard Sandiford <richard.sandif...@linaro.org> writes:
> This patch adds a new "poly_int" class to represent polynomial integers
> of the form:
>
>   C0 + C1*X1 + C2*X2 ... + Cn*Xn
>
> It also adds poly_int-based typedefs for offsets and sizes of various
> precisions.  In these typedefs, the Ci coefficients are compile-time
> constants and the Xi indeterminates are run-time invariants.  The number
> of coefficients is controlled by the target and is initially 1 for all
> ports.
>
> Most routines can handle general coefficient counts, but for now a few
> are specific to one or two coefficients.  Support for other coefficient
> counts can be added when needed.
>
> The patch also adds a new macro, IN_TARGET_CODE, that can be
> set to indicate that a TU contains target-specific rather than
> target-independent code.  When this macro is set and the number of
> coefficients is 1, the poly-int.h classes define a conversion operator
> to a constant.  This allows most existing target code to work without
> modification.  The main exceptions are:
>
> - values passed through ..., which need an explicit conversion to a
>   constant
>
> - ?: expression in which one arm ends up being a polynomial and the
>   other remains a constant.  In these cases it would be valid to convert
>   the constant to a polynomial and the polynomial to a constant, so a
>   cast is needed to break the ambiguity.
>
> The patch also adds a new target hook to return the estimated
> value of a polynomial for costing purposes.
>
> The patch also adds operator<< on wide_ints (it was already defined
> for offset_int and widest_int).  I think this was originally excluded
> because >> is ambiguous for wide_int, but << is useful for converting
> bytes to bits, etc., so is worth defining on its own.  The patch also
> adds operator% and operator/ for offset_int and widest_int, since those
> types are always signed.  These changes allow the poly_int interface to
> be more predictable.
>
> I'd originally tried adding the tests as selftests, but that ended up
> bloating cc1 by at least a third.  It also took a while to build them
> at -O2.  The patch therefore uses plugin tests instead, where we can
> force the tests to be built at -O0.  They still run in negligible time
> when built that way.

Changes in v2:

- Drop the controversial known_zero etc. wrapper functions.
- Fix the operator<<= bug that Martin found.
- Switch from "t" to "type" in SFINAE classes (requested by Martin).

Not changed in v2:

- Default constructors are still empty.  I agree it makes sense to use
  "= default" when we switch to C++11, but it would be dangerous for
  that to make "poly_int64 x;" less defined than it is now.

Tested as before.

Thanks,
Richard


2017-11-08  Richard Sandiford  <richard.sandif...@linaro.org>
            Alan Hayward  <alan.hayw...@arm.com>
            David Sherwood  <david.sherw...@arm.com>

gcc/
        * poly-int.h: New file.
        * poly-int-types.h: Likewise.
        * coretypes.h: Include them.
        (POLY_INT_CONVERSION): Define.
        * target.def (estimated_poly_value): New hook.
        * doc/tm.texi.in (TARGET_ESTIMATED_POLY_VALUE): New hook.
        * doc/tm.texi: Regenerate.
        * doc/poly-int.texi: New file.
        * doc/gccint.texi: Include it.
        * doc/rtl.texi: Describe restrictions on subreg modes.
        * Makefile.in (TEXI_GCCINT_FILES): Add poly-int.texi.
        * genmodes.c (NUM_POLY_INT_COEFFS): Provide a default definition.
        (emit_insn_modes_h): Emit a definition of NUM_POLY_INT_COEFFS.
        * targhooks.h (default_estimated_poly_value): Declare.
        * targhooks.c (default_estimated_poly_value): New function.
        * target.h (estimated_poly_value): Likewise.
        * wide-int.h (WI_UNARY_RESULT): Use wi::binary_traits.
        (wi::unary_traits): Delete.
        (wi::binary_traits::signed_shift_result_type): Define for
        offset_int << HOST_WIDE_INT, etc.
        (generic_wide_int::operator <<=): Define for all types and use
        wi::lshift instead of <<.
        (wi::hwi_with_prec): Add a default constructor.
        (wi::ints_for): New class.
        (operator <<): Define for all wide-int types.
        (operator /): New function.
        (operator %): Likewise.
        * selftest.h (ASSERT_MUST_EQ, ASSERT_MUST_EQ_AT, ASSERT_MAY_NE)
        (ASSERT_MAY_NE_AT): New macros.

gcc/testsuite/
        * gcc.dg/plugin/poly-int-tests.h,
        gcc.dg/plugin/poly-int-test-1.c,
        gcc.dg/plugin/poly-int-01_plugin.c,
        gcc.dg/plugin/poly-int-02_plugin.c,
        gcc.dg/plugin/poly-int-03_plugin.c,
        gcc.dg/plugin/poly-int-04_plugin.c,
        gcc.dg/plugin/poly-int-05_plugin.c,
        gcc.dg/plugin/poly-int-06_plugin.c,
        gcc.dg/plugin/poly-int-07_plugin.c: New tests.
        * gcc.dg/plugin/plugin.exp: Run them.

Attachment: poly-001-poly-int-h.diff.gz
Description: application/gzip

Reply via email to