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

            Bug ID: 120403
           Summary: Can't collapse two equality into one
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hiraditya at msn dot com
  Target Milestone: ---

#include <stdint.h>

struct s {
    int x, y;
};

bool cmp(struct s s1, struct s s2) {
    return s1.x == s2.x && s1.y == s2.y;
}

struct t {
    int16_t x, y;
};

bool cmp_t(struct t s1, struct t s2) {
    return s1.x == s2.x && s1.y == s2.y;
}


$ gcc -O3 generates

```asm
cmp(s, s):
        xor     eax, eax
        cmp     edi, esi
        je      .L5
        ret
.L5:
        sar     rdi, 32
        sar     rsi, 32
        cmp     edi, esi
        sete    al
        ret
cmp_t(t, t):
        xor     eax, eax
        cmp     di, si
        je      .L9
        ret
.L9:
        sar     edi, 16
        sar     esi, 16
        cmp     di, si
        sete    al
        ret
```


clang -O3 generates

```asm
cmp(s, s):
        cmp     rdi, rsi
        sete    al
        ret

cmp_t(t, t):
        cmp     edi, esi
        sete    al
        ret
```

https://godbolt.org/z/8j71anzTW

Reply via email to