re PR tree-optimization/65002 (ICE: Segmentation fault)
authorIlya Enkovich <ilya.enkovich@intel.com>
Fri, 13 Feb 2015 09:44:07 +0000 (09:44 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Fri, 13 Feb 2015 09:44:07 +0000 (09:44 +0000)
gcc/

PR tree-optimization/65002
* tree-cfg.c (pass_data_fixup_cfg): Don't update
SSA on start.
* tree-sra.c (some_callers_have_no_vuse_p): New.
(ipa_early_sra): Reject functions whose callers
assume function is read only.

gcc/testsuite/

PR tree-optimization/65002
* gcc.dg/pr65002.C: New.

From-SVN: r220679

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr65002.C [new file with mode: 0644]
gcc/tree-cfg.c
gcc/tree-sra.c

index 1815502..19e729b 100644 (file)
@@ -1,3 +1,12 @@
+2015-02-13  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR tree-optimization/65002
+       * tree-cfg.c (pass_data_fixup_cfg): Don't update
+       SSA on start.
+       * tree-sra.c (some_callers_have_no_vuse_p): New.
+       (ipa_early_sra): Reject functions whose callers
+       assume function is read only.
+
 2015-02-13  Richard Biener  <rguenther@suse.de>
 
        PR lto/65015
index d958264..1aca0b5 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-13  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR tree-optimization/65002
+       * gcc.dg/pr65002.C: New.
+
 2015-02-13  Marek Polacek  <polacek@redhat.com>
 
        PR c/65040
diff --git a/gcc/testsuite/gcc.dg/pr65002.C b/gcc/testsuite/gcc.dg/pr65002.C
new file mode 100644 (file)
index 0000000..ac7c66b
--- /dev/null
@@ -0,0 +1,26 @@
+/* PR tree-optimization/65002 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+namespace fastmath {
+  template <typename T> float floor(const T &) __attribute__((const));
+  template <typename T> float floor(const T &p1) { return p1; }
+}
+using fastmath::floor;
+class A {
+public:
+  A(int, int);
+  virtual int m_fn1(float) const;
+};
+class B : A {
+public:
+  B(int, int p2) : A(entity, p2) {}
+  int m_fn1(float p1) const { long b(floor(p1)); }
+  int entity;
+};
+
+int a;
+void Convert() {
+  if (int *c = 0)
+    B(*c, a);
+}
index 2e23553..006bc08 100644 (file)
@@ -8754,7 +8754,7 @@ const pass_data pass_data_fixup_cfg =
   PROP_cfg, /* properties_required */
   0, /* properties_provided */
   0, /* properties_destroyed */
-  TODO_update_ssa_only_virtuals, /* todo_flags_start */
+  0, /* todo_flags_start */
   0, /* todo_flags_finish */
 };
 
index c6726a8..023b817 100644 (file)
@@ -4890,6 +4890,20 @@ some_callers_have_mismatched_arguments_p (struct cgraph_node *node,
   return false;
 }
 
+/* Return false if all callers have vuse attached to a call statement.  */
+
+static bool
+some_callers_have_no_vuse_p (struct cgraph_node *node,
+                            void *data ATTRIBUTE_UNUSED)
+{
+  struct cgraph_edge *cs;
+  for (cs = node->callers; cs; cs = cs->next_caller)
+    if (!cs->call_stmt || !gimple_vuse (cs->call_stmt))
+      return true;
+
+  return false;
+}
+
 /* Convert all callers of NODE.  */
 
 static bool
@@ -5116,6 +5130,15 @@ ipa_early_sra (void)
       goto simple_out;
     }
 
+  if (node->call_for_symbol_thunks_and_aliases
+       (some_callers_have_no_vuse_p, NULL, true))
+    {
+      if (dump_file)
+       fprintf (dump_file, "There are callers with no VUSE attached "
+                "to a call stmt.\n");
+      goto simple_out;
+    }
+
   bb_dereferences = XCNEWVEC (HOST_WIDE_INT,
                                 func_param_count
                                 * last_basic_block_for_fn (cfun));