https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94802

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |uros at gcc dot gnu.org

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So shall we deal with that at the RTL level instead then?

Given testcase1:
/* PR tree-optimization/94802 */
/* { dg-do compile } */
/* { dg-options "-O2" } */

void foo (void);

int
f1 (int a, int b)
{
  return (a - b) >= 0;
}

int
f2 (int a, int b)
{
  return (a - b) > 0;
}

int
f3 (int a, int b)
{
  return (a - b) <= 0;
}

int
f4 (int a, int b)
{
  return (a - b) < 0;
}

void
f5 (int a, int b)
{
  if ((a - b) >= 0)
    foo ();
}

void
f6 (int a, int b)
{
  if ((a - b) > 0)
    foo ();
}

void
f7 (int a, int b)
{
  if ((a - b) <= 0)
    foo ();
}

void
f8 (int a, int b)
{
  if ((a - b) < 0)
    foo ();
}

and testcase2, it would be nice to emit the same or at least as good as code
for the first one as for the second one, but the testcase1 to testcase2
difference is:
@@ -6,10 +6,9 @@
 f1:
 .LFB0:
        .cfi_startproc
-       subl    %esi, %edi
-       notl    %edi
-       movl    %edi, %eax
-       shrl    $31, %eax
+       xorl    %eax, %eax
+       cmpl    %esi, %edi
+       setge   %al
        ret
        .cfi_endproc
 .LFE0:
@@ -20,9 +19,8 @@ f1:
 f2:
 .LFB1:
        .cfi_startproc
-       subl    %esi, %edi
        xorl    %eax, %eax
-       testl   %edi, %edi
+       cmpl    %esi, %edi
        setg    %al
        ret
        .cfi_endproc
@@ -34,9 +32,8 @@ f2:
 f3:
 .LFB2:
        .cfi_startproc
-       subl    %esi, %edi
        xorl    %eax, %eax
-       testl   %edi, %edi
+       cmpl    %esi, %edi
        setle   %al
        ret
        .cfi_endproc
@@ -48,9 +45,9 @@ f3:
 f4:
 .LFB3:
        .cfi_startproc
-       subl    %esi, %edi
-       movl    %edi, %eax
-       shrl    $31, %eax
+       xorl    %eax, %eax
+       cmpl    %esi, %edi
+       setl    %al
        ret
        .cfi_endproc
 .LFE3:
@@ -62,7 +59,7 @@ f5:
 .LFB4:
        .cfi_startproc
        cmpl    %esi, %edi
-       jns     .L8
+       jge     .L8
        ret
        .p2align 4,,10
        .p2align 3
@@ -77,8 +74,7 @@ f5:
 f6:
 .LFB5:
        .cfi_startproc
-       subl    %esi, %edi
-       testl   %edi, %edi
+       cmpl    %esi, %edi
        jg      .L11
        ret
        .p2align 4,,10
@@ -94,8 +90,7 @@ f6:
 f7:
 .LFB6:
        .cfi_startproc
-       subl    %esi, %edi
-       testl   %edi, %edi
+       cmpl    %esi, %edi
        jle     .L14
        ret
        .p2align 4,,10
@@ -112,7 +107,7 @@ f8:
 .LFB7:
        .cfi_startproc
        cmpl    %esi, %edi
-       js      .L17
+       jl      .L17
        ret
        .p2align 4,,10
        .p2align 3

We have *cmp<mode>_minus_1 that handles some of this, but not everything.
And now that I think more about it, it can't be done at the RTL level, because
we've lost the information that the subtraction has undefined overflow; when it
overflows, it has different behavior.

Reply via email to