re PR target/34916 (gcc.c-torture/execute/pr27364.c fails with -O1, -O2 and -Os)
authorAndy Hutchinson <hutchinsonandy@aim.com>
Fri, 4 Apr 2008 23:45:46 +0000 (23:45 +0000)
committerAndy Hutchinson <hutchinsonandy@gcc.gnu.org>
Fri, 4 Apr 2008 23:45:46 +0000 (23:45 +0000)
PR rtl-optimization/34916
PR middle-end/35519
* combine.c (create_log_links): Do not create duplicate LOG_LINKS
between instruction pairs

From-SVN: r133920

gcc/ChangeLog
gcc/combine.c

index a4fe162f6bd8413c4d7963c3ff442329951cd2fe..a1a95f991af7c019eb14e32eae2623c4b1f8f481 100644 (file)
@@ -1,3 +1,10 @@
+2008-04-04 Andy Hutchinson <hutchinsonandy@aim.com>
+
+       PR rtl-optimization/34916
+       PR middle-end/35519
+       * combine.c (create_log_links): Do not create duplicate LOG_LINKS
+       between instruction pairs.
+
 2008-04-04  Naveen.H.S  <naveen.hs@kpitcummins.com>
 
        * doc/invoke.texi: Document -mbitops for SH.
index 0fca12da9dbebc466a21bc116c44b83ca479c571..db828e8e4166dcdd3b559667925fb5fe5924300c 100644 (file)
@@ -1,6 +1,6 @@
 /* Optimize by combining instructions for GNU compiler.
    Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -976,8 +976,18 @@ create_log_links (void)
                      assignments later.  */
                   if (regno >= FIRST_PSEUDO_REGISTER
                       || asm_noperands (PATTERN (use_insn)) < 0)
-                    LOG_LINKS (use_insn) =
-                      alloc_INSN_LIST (insn, LOG_LINKS (use_insn));
+                   {
+                     /* Don't add duplicate links between instructions.  */
+                     rtx links;
+                     for (links = LOG_LINKS (use_insn); links;
+                          links = XEXP (links, 1))
+                       if (insn == XEXP (links, 0))
+                         break;
+
+                     if (!links)
+                       LOG_LINKS (use_insn) =
+                         alloc_INSN_LIST (insn, LOG_LINKS (use_insn));
+                   }
                 }
               next_use[regno] = NULL_RTX;
             }