On 6/19/23 08:23, Stefan Schulze Frielinghaus via Gcc-patches wrote:
Comparisons between memory and constants might be done in a smaller mode
resulting in smaller constants which might finally end up as immediates
instead of in the literal pool.

For example, on s390x a non-symmetric comparison like
   x <= 0x3fffffffffffffff
results in the constant being spilled to the literal pool and an 8 byte
memory comparison is emitted.  Ideally, an equivalent comparison
   x0 <= 0x3f
where x0 is the most significant byte of x, is emitted where the
constant is smaller and more likely to materialize as an immediate.

Similarly, comparisons of the form
   x >= 0x4000000000000000
can be shortened into x0 >= 0x40.

Bootstrapped and regtested on s390x, x64, aarch64, and powerpc64le.
Note, the new tests show that for the mentioned little-endian targets
the optimization does not materialize since either the costs of the new
instructions are higher or they do not match.  Still ok for mainline?

gcc/ChangeLog:

        * combine.cc (simplify_compare_const): Narrow comparison of
        memory and constant.
        (try_combine): Adapt new function signature.
        (simplify_comparison): Adapt new function signature.

gcc/testsuite/ChangeLog:

        * gcc.dg/cmp-mem-const-1.c: New test.
        * gcc.dg/cmp-mem-const-2.c: New test.
        * gcc.dg/cmp-mem-const-3.c: New test.
        * gcc.dg/cmp-mem-const-4.c: New test.
        * gcc.dg/cmp-mem-const-5.c: New test.
        * gcc.dg/cmp-mem-const-6.c: New test.
        * gcc.target/s390/cmp-mem-const-1.c: New test.
Sorry. I'd looked at this a while back, wanted to take another looksie and totally forgot about it.

OK for the trunk.  Thanks for your patience.

jeff

Reply via email to