https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106333
Bug ID: 106333 Summary: Required condition omitted from generated code Product: gcc Version: 12.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: eran.kornblau at kaltura dot com Target Milestone: --- Hi, We bumped into a case where a required condition gets omitted from our code, we validated the issue on versions 11.1.0, 11.2.0, 11.3.0, 12.1.0. Version 10.3.0 is working as expected. The issue happens only when compiling with optimizations (I tested -O2), when running without any -Oxxx flag, it works as expected. The issue can be reproduced with these commands - $ docker run -it gcc:12.1.0 /bin/sh # cat > /tmp/x.c #include <stdio.h> #include <limits.h> #include <stdint.h> #include <string.h> #define NGX_LIVE_INVALID_PTS (LLONG_MAX) typedef struct { int64_t created; int64_t dts; uint32_t flags; int32_t pts_delay; } kmp_frame_t; static int test(kmp_frame_t *frame) { if (frame->dts >= NGX_LIVE_INVALID_PTS - frame->pts_delay && frame->pts_delay >= 0) { printf("bad!\n"); } else { printf("good!\n"); } } int main() { kmp_frame_t frame; memset(&frame, 0xff, sizeof(frame)); frame.dts = 149201707622903; test(&frame); return 0; } ^C # gcc -O2 /tmp/x.c -o /tmp/x ; /tmp/x bad! # gcc /tmp/x.c -o /tmp/x ; /tmp/x good! # Following the memset with 0xff, the value of frame.pts_delay is -1. Therefore, the second part of the if condition (frame->pts_delay >= 0) is expected to be false (the field is a signed int32_t), so we should get the string 'good!' printed. However, it seems the second part of the condition (following the &&) gets optimized out, and we get 'bad!' printed out. Thank you! Eran