]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/51071 (ICE in gimple_has_side_effects, at gimple.c:2513)
authorRichard Guenther <rguenther@suse.de>
Thu, 10 Nov 2011 12:22:46 +0000 (12:22 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 10 Nov 2011 12:22:46 +0000 (12:22 +0000)
2011-11-10  Richard Guenther  <rguenther@suse.de>

PR middle-end/51071
* gimple.c (gimple_has_side_effects): Remove checking code
that doesn't belong here.

* gcc.dg/torture/pr51071.c: New testcase.

From-SVN: r181253

gcc/ChangeLog
gcc/gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr51071.c [new file with mode: 0644]

index 380779b5d106073d8036e784893f38d2052f9cac..56505f75a350236cd1433ace2758d2623e2fbbfa 100644 (file)
@@ -1,3 +1,9 @@
+2011-11-10  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/51071
+       * gimple.c (gimple_has_side_effects): Remove checking code
+       that doesn't belong here.
+
 2011-11-10  Ira Rosen  <ira.rosen@linaro.org>
 
        PR tree-optimization/51058
index 57f15af313c4ed72e9f3d1f4adc251adf3036a1b..6168d33ac0508ee85ad98a3260c567063873a183 100644 (file)
@@ -2457,8 +2457,6 @@ gimple_set_modified (gimple s, bool modifiedp)
 bool
 gimple_has_side_effects (const_gimple s)
 {
-  unsigned i;
-
   if (is_gimple_debug (s))
     return false;
 
@@ -2474,47 +2472,15 @@ gimple_has_side_effects (const_gimple s)
 
   if (is_gimple_call (s))
     {
-      unsigned nargs = gimple_call_num_args (s);
-      tree fn;
+      int flags = gimple_call_flags (s);
 
-      if (!(gimple_call_flags (s) & (ECF_CONST | ECF_PURE)))
-        return true;
-      else if (gimple_call_flags (s) & ECF_LOOPING_CONST_OR_PURE)
-       /* An infinite loop is considered a side effect.  */
+      /* An infinite loop is considered a side effect.  */
+      if (!(flags & (ECF_CONST | ECF_PURE))
+         || (flags & ECF_LOOPING_CONST_OR_PURE))
        return true;
 
-      if (gimple_call_lhs (s)
-          && TREE_SIDE_EFFECTS (gimple_call_lhs (s)))
-       {
-         gcc_checking_assert (gimple_has_volatile_ops (s));
-         return true;
-       }
-
-      fn = gimple_call_fn (s);
-      if (fn && TREE_SIDE_EFFECTS (fn))
-        return true;
-
-      for (i = 0; i < nargs; i++)
-        if (TREE_SIDE_EFFECTS (gimple_call_arg (s, i)))
-         {
-           gcc_checking_assert (gimple_has_volatile_ops (s));
-           return true;
-         }
-
       return false;
     }
-  else
-    {
-      for (i = 0; i < gimple_num_ops (s); i++)
-       {
-         tree op = gimple_op (s, i);
-         if (op && TREE_SIDE_EFFECTS (op))
-           {
-             gcc_checking_assert (gimple_has_volatile_ops (s));
-             return true;
-           }
-       }
-    }
 
   return false;
 }
index 833db9b117ac30156e508df8d93e79fdb453b57b..c36aa0612e0dba178784528658000e421ee10c4a 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-10  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/51071
+       * gcc.dg/torture/pr51071.c: New testcase.
+
 2011-11-10  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/loop_optimization9.ad[sb]: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr51071.c b/gcc/testsuite/gcc.dg/torture/pr51071.c
new file mode 100644 (file)
index 0000000..99af958
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do compile } */
+
+void foo (void);
+void bar (void *);
+extern int t;
+
+static void kmalloc_large (int size, int flags)
+{
+  (void) size;
+  (void) flags;
+  foo ();
+  bar (({__here:&&__here;}));
+}
+
+static void kmalloc (int size, int flags)
+{
+  if (size)
+    {
+      if ((unsigned long) size > 0x1000)
+       kmalloc_large (size, flags);
+
+      if (flags)
+       bar (({__here:&&__here;}));
+    }
+}
+
+void compress_file_range (int i, int j, int k)
+{
+  int nr_pages = ({j < k;});
+
+  if (i || t)
+    kmalloc (0x1000UL * nr_pages, 0x40UL);
+}