see.c (see_def_extension_not_merged): Use copy_rtx_if_shared to avoid invalid sharing.
authorRafael Avila de Espindola <espindola@google.com>
Wed, 28 May 2008 16:20:25 +0000 (16:20 +0000)
committerRafael Espindola <espindola@gcc.gnu.org>
Wed, 28 May 2008 16:20:25 +0000 (16:20 +0000)
2008-05-28  Rafael Espindola  <espindola@google.com>

* see.c (see_def_extension_not_merged): Use copy_rtx_if_shared to avoid
invalid sharing.

2008-05-28  Rafael Espindola  <espindola@google.com>

* gcc.dg/20080528-1.c: New test.

From-SVN: r136115

gcc/ChangeLog
gcc/see.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/20080528-1.c [new file with mode: 0644]

index 43e61a636b03f4062c993a85d8ac5e91f4926e0d..fe82a48d1bddcea8ed1a91c5cd8aa3ce6213f644 100644 (file)
@@ -1,3 +1,8 @@
+2008-05-28  Rafael Espindola  <espindola@google.com>
+
+       * see.c (see_def_extension_not_merged): Use copy_rtx_if_shared to avoid
+       invalid sharing.
+
 2008-05-28  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/36339
index dce51691cbe29f30ff0ae1e54501cb4e9be6bb83..5084b9765595172ebc99f378a90b45fb861b9e20 100644 (file)
--- a/gcc/see.c
+++ b/gcc/see.c
@@ -2554,6 +2554,17 @@ see_def_extension_not_merged (struct see_ref_s *curr_ref_s, rtx def_se)
 
   /* The manipulation succeeded.  Store the new manipulated reference.  */
 
+  /* It is possible for dest_reg to appear multiple times in ref_copy. In this
+     case, ref_copy now has invalid sharing. Copying solves the problem.
+     We don't use copy_rtx as an optimization for the common case (no sharing).
+     We can't just use copy_rtx_if_shared since it does nothing on INSNs.
+     Another possible solution would be to make validate_replace_rtx_1
+     public and use it instead of replace_rtx. */
+  reset_used_flags (PATTERN (ref_copy));
+  reset_used_flags (REG_NOTES (ref_copy));
+  PATTERN (ref_copy) = copy_rtx_if_shared (PATTERN (ref_copy));
+  REG_NOTES (ref_copy) = copy_rtx_if_shared (REG_NOTES (ref_copy));
+
   /* Try to simplify the new manipulated insn.  */
   validate_simplify_insn (ref_copy);
 
index 7533e3787181358623fc5a705fd769122438125e..c548a7d182876df528ef25da9c6de7e0eb26cb76 100644 (file)
@@ -1,3 +1,7 @@
+2008-05-28  Rafael Espindola  <espindola@google.com>
+
+       * gcc.dg/20080528-1.c: New test.
+
 2008-05-28  Arnaud Charlet  <charlet@adacore.com>
 
        * gnat.dg/old_errors.adb, gnat.dg/deep_old.adb: Adjust.
diff --git a/gcc/testsuite/gcc.dg/20080528-1.c b/gcc/testsuite/gcc.dg/20080528-1.c
new file mode 100644 (file)
index 0000000..9fe9780
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fsee" } */
+
+unsigned long g(int a, int b) {
+  return a / b;
+}
+unsigned long f(long int a) {
+  return g(a, 1<<13);
+}