OSDN Git Service

2008-05-28 Rafael Espindola <espindola@google.com>
authorespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 May 2008 16:20:25 +0000 (16:20 +0000)
committerespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 28 May 2008 16:20:25 +0000 (16:20 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136115 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 43e61a6..fe82a48 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 dce5169..5084b97 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 7533e37..c548a7d 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);
+}