https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49959
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Note Pre is able to remove the casts since GCC 8. So the original testcase is fixed but if you change it to: #define ABS(X) (((X)>0)?(X):-(X)) unsigned long test_abs(int *cur) { unsigned long sad = 0; sad += ABS(cur[0]); return sad; } We still have the same issue as before.