https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77881
Bug ID: 77881 Summary: [5/6/7 Regression] Non-optimal signed comparison on x86_64 since r146817 Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: jakub at gcc dot gnu.org Target Milestone: --- int foo (long long int a, int b) { if (a >= 0 || b) baz (); } int bar (long long int a, int b) { if (a < 0 || b) baz (); } on x86_64-linux with -O2 is compiled into following starting with r146817: testq %rdi, %rdi jns .L4 testl %esi, %esi jne .L4 for foo, which looks reasonable, and shrq $63, %rdi testb %dil, %dil jne .L9 testl %esi, %esi jne .L9 in bar, where I'd expect and we used to emit in the past testq %rdi, %rdi js .L9 testl %esi, %esi jne .L9 or something similar. I wonder if we want a combine pattern that would transform right shift by precision - 1 followed by comparison of the result against 0 if the result of the right shift is dead into just signed comparison.