re PR middle-end/36753 (Forward propagation interacts badly with global register...
authorPaolo Bonzini <bonzini@gnu.org>
Thu, 17 Jul 2008 09:07:31 +0000 (09:07 +0000)
committerPaolo Bonzini <bonzini@gcc.gnu.org>
Thu, 17 Jul 2008 09:07:31 +0000 (09:07 +0000)
gcc:
2008-07-17  Paolo Bonzini  <bonzini@gnu.org>

PR rtl-optimization/36753
* fwprop.c (use_killed_between): Don't shortcut
single-definition global registers.

gcc/testsuite:
2008-07-17  Paolo Bonzini  <bonzini@gnu.org>

PR rtl-optimization/36753
* gcc.target/i386/pr36753.c: New.

From-SVN: r137913

gcc/ChangeLog
gcc/fwprop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr36753.c [new file with mode: 0644]

index 322e47d8399307a558bbe729c7c5fcac843dba6f..7933b10d60cbeed043d09b92a97ea1746764c3e0 100644 (file)
@@ -1,3 +1,9 @@
+2008-07-17  Paolo Bonzini  <bonzini@gnu.org>
+
+       PR rtl-optimization/36753
+       * fwprop.c (use_killed_between): Don't shortcut
+       single-definition global registers.
+
 2008-07-16  Jan Hubicka  <jh@suse.cz>
 
        * cgraph.h (varpool_empty_needed_queue): Declare.
index e670001964415b6d4e0fb52909da8db7e097ce1f..fbe432974f4179ec1225f3b14f7caf66496f94cc 100644 (file)
@@ -527,10 +527,15 @@ use_killed_between (struct df_ref *use, rtx def_insn, rtx target_insn)
     return true;
 
   /* Check if the reg in USE has only one definition.  We already
-     know that this definition reaches use, or we wouldn't be here.  */
+     know that this definition reaches use, or we wouldn't be here.
+     However, this is invalid for hard registers because if they are
+     live at the beginning of the function it does not mean that we
+     have an uninitialized access.  */
   regno = DF_REF_REGNO (use);
   def = DF_REG_DEF_CHAIN (regno);
-  if (def && (def->next_reg == NULL))
+  if (def
+      && def->next_reg == NULL
+      && regno >= FIRST_PSEUDO_REGISTER)
     return false;
 
   /* Check locally if we are in the same basic block.  */
index 54da1a1b18d683c13ff46dc509296f6d98744530..ec7dc0540d8cde5dab503947f4dec3d2f151f690 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-17  Paolo Bonzini  <bonzini@gnu.org>
+
+       PR rtl-optimization/36753
+       * gcc.target/i386/pr36753.c: New.
+
 2008-07-17  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/36825
diff --git a/gcc/testsuite/gcc.target/i386/pr36753.c b/gcc/testsuite/gcc.target/i386/pr36753.c
new file mode 100644 (file)
index 0000000..2d43d42
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-options "-O2" } */
+/* { dg-do run } */
+
+#if defined __i386__
+#define REG "edi"
+#else
+#define REG "r14"
+#endif
+
+register unsigned long *ds asm(REG);
+
+extern void abort (void);
+
+__attribute__ ((noinline)) void
+test (void)
+{
+  *++ds = 31337;
+}
+
+int
+main ()
+{
+  unsigned long stack[2];
+  stack[0] = 0;
+  stack[1] = 0;
+  ds = stack;
+  test ();
+  if (ds != stack + 1 || *ds != 31337)
+    abort ();
+  return 0;
+}