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

Reply via email to