https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114700
--- Comment #17 from Hu Lin <lin1.hu at intel dot com> --- (In reply to Jakub Jelinek from comment #16) > (In reply to Hu Lin from comment #11) > > I think it doesn't mean that's not a bug with -ftrapv, it should preserve > > all overflow traps. Because it doesn't work, we use -fsanitize=undefined > > instead of it. > > > > refer: Gcc's trapv is known not always to work correctly. > > No, -ftrapv isn't a debugging tool. There is no overflow in the expression > that GCC actually evaluates (into which the expression has been optimized). > If you have overflow in an expression that is never used, GCC with -ftrapv > will also > eliminate it as unused and won't diagnose the trap. > -fsanitize=undefined behaves in that case actually the same with -O1 and > higher (intentionally, to decrease the cost of the sanitization). So, one > needs to use -O0 -fsanitize=undefined to get as many cases of UB in the > program diagnosed as possible. OK, that look like GCC's -ftrapv is not the same as clang's. Then my added condition should be (optimize || !TYPE_OVERFLOW_SANITIZED (type)). > When a pattern already has one if, can't you just add that to the preexisting > if rather than adding yet another one. I made a mistake on this line, it should be + (if (!TYPE_OVERFLOW_SANITIZED (type)) (if (!ANY_INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_WRAPS (type)) (negate (view_convert @1)) (view_convert (negate @1)))) I can't just modify the preexisting if, the optimization shouldn't be used with -fsanitize=undefined.