dojump: Optimize a == a or a != a [PR98169]
authorJakub Jelinek <jakub@redhat.com>
Thu, 10 Dec 2020 10:46:08 +0000 (11:46 +0100)
committerJakub Jelinek <jakub@redhat.com>
Thu, 10 Dec 2020 10:46:08 +0000 (11:46 +0100)
commit66dea8899df6475d5cb289491dbbff307c16c1a7
tree4bea67d1dcec9e6977298d72c1d0abbaa6f80dd6
parenta2a17ae7d85e420db5fe0c7ab2f59a470e2c7a78
dojump: Optimize a == a or a != a [PR98169]

If the backend doesn't have floating point EQ or NE comparison, dojump.c
splits it into ORDERED && UNEQ or UNORDERED || LTGT.  If both comparison
operands are the same, we know the result of the second comparison though,
a == b is equivalent to a ord b and a != b is equivalent to a unord b,
and thus can just use ORDERED or UNORDERED.

On the testcase, this changes f1:
- ucomiss %xmm0, %xmm0
- movl $1, %eax
- jp .L3
- jne .L3
- ret
- .p2align 4,,10
- .p2align 3
-.L3:
  xorl %eax, %eax
+ ucomiss %xmm0, %xmm0
+ setnp %al
and f3:
- ucomisd %xmm0, %xmm0
- movl $1, %eax
- jp .L8
- jne .L8
- ret
- .p2align 4,,10
- .p2align 3
-.L8:
  xorl %eax, %eax
+ ucomisd %xmm0, %xmm0
+ setnp %al
while keeping the same code for f2 and f4.

2020-12-10  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/98169
* dojump.c (do_compare_rtx_and_jump): Don't split self-EQ/NE
comparisons, just use ORDERED or UNORDERED.

* gcc.target/i386/pr98169.c: New test.
gcc/dojump.c
gcc/testsuite/gcc.target/i386/pr98169.c [new file with mode: 0644]