gcc 4.2.4 support
[openwrt/svn-archive/archive.git] / toolchain / gcc / patches / 4.2.4 / 905-avr32_fix_folding_machine_reorg_optimizations.patch
diff --git a/toolchain/gcc/patches/4.2.4/905-avr32_fix_folding_machine_reorg_optimizations.patch b/toolchain/gcc/patches/4.2.4/905-avr32_fix_folding_machine_reorg_optimizations.patch
new file mode 100644 (file)
index 0000000..b72e47a
--- /dev/null
@@ -0,0 +1,46 @@
+Index: gcc-4.2.3/gcc/config/avr32/avr32.c
+===================================================================
+--- gcc-4.2.3.orig/gcc/config/avr32/avr32.c    2008-05-21 13:45:58.533289214 +0200
++++ gcc-4.2.3/gcc/config/avr32/avr32.c 2008-05-21 13:45:59.762288215 +0200
+@@ -6323,23 +6323,24 @@
+                 /* If used any other place than as a pointer or as the
+                destination register we failed */
+                 if (!(single_set (scan)
+-                    && GET_CODE (PATTERN (scan)) == SET
+-                    && ((MEM_P (SET_DEST (PATTERN (scan)))
+-                        && REG_P (XEXP (SET_DEST (PATTERN (scan)), 0))
+-                        && REGNO (XEXP (SET_DEST (PATTERN (scan)), 0)) ==
+-                          REGNO (reg)) || (MEM_P (SET_SRC (PATTERN (scan)))
+-                              &&
+-                              REG_P (XEXP
+-                                  (SET_SRC (PATTERN (scan)),
+-                                      0))
+-                                      &&
+-                                      REGNO (XEXP
+-                                          (SET_SRC (PATTERN (scan)),
+-                                              0)) == REGNO (reg))))
+-                                              && !(GET_CODE (PATTERN (scan)) == SET
+-                                                  && REG_P (SET_DEST (PATTERN (scan)))
+-                                                  && !regno_use_in (REGNO (reg),
+-                                                      SET_SRC (PATTERN (scan)))))
++                      && GET_CODE (PATTERN (scan)) == SET
++                      && ((MEM_P (SET_DEST (PATTERN (scan)))
++                           && REG_P (XEXP (SET_DEST (PATTERN (scan)), 0))
++                           && REGNO (XEXP (SET_DEST (PATTERN (scan)), 0)) == REGNO (reg))
++                          || (MEM_P (SET_SRC (PATTERN (scan)))
++                              && REG_P (XEXP (SET_SRC (PATTERN (scan)), 0))
++                              && REGNO (XEXP
++                                        (SET_SRC (PATTERN (scan)), 0)) == REGNO (reg))))
++                    && !(GET_CODE (PATTERN (scan)) == SET
++                         && REG_P (SET_DEST (PATTERN (scan)))
++                         && !regno_use_in (REGNO (reg),
++                                           SET_SRC (PATTERN (scan)))))
++                  break;
++
++                /* We cannot replace the pointer in TImode insns
++                   as these has a differene addressing mode than the other
++                   memory insns. */
++                if ( GET_MODE (SET_DEST (PATTERN (scan))) == TImode )
+                   break;
+                 /* Check if register is dead or set in this insn */