This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Transformation of relational expression


Hello,

I am compiling code like this:

    int test(int x, int eq, int lt, int gt) {
        return x < 2000 ? lt : x > 2000 ? gt : eq;
    }

and expect that compiler would generate one CMP instruction for both
comparisons:

        cmpl    $2000, %edi
        jl      .L37
        jne     .L38
    ...

however result is quite different:

        cmpl    $1999, %edi
        jle     .L37
        cmpl    $2000, %edi
        jne     .L38

For some reason, compiler transforms (x < 2000) to (x <= 1999). Though
such transformation looks semantically legal, not sure it is really
necessary here. Especially taking into account that it impedes
subsequent optimizations.

It seems that 'maybe_canonicalize_comparison' from gcc/fold-const.c is
responsible for such transformation (I am using 5.3.0, as for trunk it
seems that some part of such logic is moved to gcc/match.pd).

I wonder why such transformation is necessary. What benefits does it offer?

Thank you,
Dmytro


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]