Hi! On the following testcase, match.pd during GENERIC folding changes the -1U / x < y into __imag__ .MUL_OVERFLOW (x, y), but unfortunately unlike for normal calls nothing sets TREE_SIDE_EFFECTS on the call. There is the process_call_operands function that non-internal call creation calls and it is usable for internal calls too, e.g. TREE_SIDE_EFFECTS is derived from checking whether the call has side-effects (non-ECF_{CONST,PURE}; we have those for internal calls) and from whether any of the arguments has TREE_SIDE_EFFECTS.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2020-04-28 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/94809 * tree.c (build_call_expr_internal_loc_array): Call process_call_operands. * gcc.c-torture/execute/pr94809.c: New test. --- gcc/tree.c.jj 2020-04-27 14:31:09.260018763 +0200 +++ gcc/tree.c 2020-04-28 00:22:07.537891047 +0200 @@ -11523,6 +11523,7 @@ build_call_expr_internal_loc_array (loca CALL_EXPR_ARG (t, i) = args[i]; SET_EXPR_LOCATION (t, loc); CALL_EXPR_IFN (t) = ifn; + process_call_operands (t); return t; } --- gcc/testsuite/gcc.c-torture/execute/pr94809.c.jj 2020-04-28 00:26:23.647107159 +0200 +++ gcc/testsuite/gcc.c-torture/execute/pr94809.c 2020-04-28 00:25:42.289718195 +0200 @@ -0,0 +1,12 @@ +/* PR tree-optimization/94809 */ + +int +main () +{ + int a = 0; + unsigned long long one = 1; + ((-1ULL / one) < a++, one); + if (a != 1) + __builtin_abort (); + return 0; +} Jakub