https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115793
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- This bugreport is based on the unwarranted assumption that UBSAN reports all UB even at higher optimization levels. It doesn't, that is part of the tradeoff between code speed and amount of reported issues. We don't report all the UB in clearly dead code even at -O0, here VRP simply figures out that the multiplication result would be # RANGE [irange] int [-INF, +INF] MASK 0xe441 VALUE 0x8d9f133a _2 = .UBSAN_CHECK_MUL (56506, 42049); and because that result is only used in (_2 & 65534) == 0 comparison, that comparison is folded to 0 and so the multiplication is optimized away. With e.g. -O2 -fsanitize=undefined, one generally gets diagnosed UB that will still happen in the program, which won't be DCEd.