Index: gcc-4.2.2/gcc/config/avr32/avr32.c
===================================================================
--- gcc-4.2.2.orig/gcc/config/avr32/avr32.c	2008-09-19 14:29:20.000000000 +0200
+++ gcc-4.2.2/gcc/config/avr32/avr32.c	2008-09-19 14:30:02.000000000 +0200
@@ -1788,7 +1788,7 @@
     {
       if (TREE_CODE (*node) != FUNCTION_DECL)
 	{
-	  warning ("`%s' attribute only applies to functions",
+	  warning (OPT_Wattributes,"`%s' attribute only applies to functions",
 		   IDENTIFIER_POINTER (name));
 	  *no_add_attrs = true;
 	}
@@ -1802,7 +1802,7 @@
 	{
 	  if (avr32_isr_value (args) == AVR32_FT_UNKNOWN)
 	    {
-	      warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
+	      warning (OPT_Wattributes,"`%s' attribute ignored", IDENTIFIER_POINTER (name));
 	      *no_add_attrs = true;
 	    }
 	}
@@ -1829,7 +1829,7 @@
 	    }
 	  else
 	    {
-	      warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name));
+	      warning (OPT_Wattributes,"`%s' attribute ignored", IDENTIFIER_POINTER (name));
 	    }
 	}
     }
@@ -1847,7 +1847,7 @@
 {
   if (TREE_CODE (*node) != FUNCTION_DECL)
     {
-      warning ("%qs attribute only applies to functions",
+      warning (OPT_Wattributes,"%qs attribute only applies to functions",
 	       IDENTIFIER_POINTER (name));
       *no_add_attrs = true;
     }
@@ -1866,13 +1866,13 @@
 {
   if (TREE_CODE (*node) == FUNCTION_TYPE || TREE_CODE (*node) == METHOD_TYPE)
     {
-      warning ("`%s' attribute not yet supported...",
+      warning (OPT_Wattributes,"`%s' attribute not yet supported...",
 	       IDENTIFIER_POINTER (name));
       *no_add_attrs = true;
       return NULL_TREE;
     }
 
-  warning ("`%s' attribute only applies to functions",
+  warning (OPT_Wattributes,"`%s' attribute only applies to functions",
 	   IDENTIFIER_POINTER (name));
   *no_add_attrs = true;
   return NULL_TREE;
@@ -4215,51 +4215,6 @@
 
 
 void
-avr32_asm_output_ascii (FILE * stream, char *ptr, int len)
-{
-  int i, i_new = 0;
-  char *new_ptr = xmalloc (4 * len);
-  if (new_ptr == NULL)
-    internal_error ("Out of memory.");
-
-  for (i = 0; i < len; i++)
-    {
-      if (ptr[i] == '\n')
-	{
-	  new_ptr[i_new++] = '\\';
-	  new_ptr[i_new++] = '0';
-	  new_ptr[i_new++] = '1';
-	  new_ptr[i_new++] = '2';
-	}
-      else if (ptr[i] == '\"')
-	{
-	  new_ptr[i_new++] = '\\';
-	  new_ptr[i_new++] = '\"';
-	}
-      else if (ptr[i] == '\\')
-	{
-	  new_ptr[i_new++] = '\\';
-	  new_ptr[i_new++] = '\\';
-	}
-      else if (ptr[i] == '\0' && i + 1 < len)
-	{
-	  new_ptr[i_new++] = '\\';
-	  new_ptr[i_new++] = '0';
-	}
-      else
-	{
-	  new_ptr[i_new++] = ptr[i];
-	}
-    }
-
-  /* Terminate new_ptr. */
-  new_ptr[i_new] = '\0';
-  fprintf (stream, "\t.ascii\t\"%s\"\n", new_ptr);
-  free (new_ptr);
-}
-
-
-void
 avr32_asm_output_label (FILE * stream, const char *name)
 {
   name = avr32_strip_name_encoding (name);
@@ -4444,12 +4399,15 @@
         rtx cmp;
         rtx cmp_op0, cmp_op1;
         rtx cond;
+        rtx dest;
+
         if ( GET_CODE (exp) == COND_EXEC )
           {
             cmp_op0 = XEXP (COND_EXEC_TEST (exp), 0);
             cmp_op1 = XEXP (COND_EXEC_TEST (exp), 1);
             cond = COND_EXEC_TEST (exp);
-          } 
+            dest = SET_DEST (COND_EXEC_CODE (exp));
+          }
         else
           {
             /* If then else conditional. compare operands are in operands
@@ -4457,6 +4415,7 @@
             cmp_op0 = recog_data.operand[4];
             cmp_op1 = recog_data.operand[5];
             cond = recog_data.operand[1];
+            dest = SET_DEST (exp);
           }
 
         if ( GET_CODE (cmp_op0) == AND )
@@ -4466,7 +4425,15 @@
                                  cmp_op0,
                                  cmp_op1);
         
-	if (is_compare_redundant (cmp, cond) == NULL_RTX)
+        /* Check if the conditional insns updates a register present
+           in the comparison, if so then we must reset the cc_status. */
+        if (REG_P (dest)
+            && (reg_mentioned_p (dest, cmp_op0)
+                || reg_mentioned_p (dest, cmp_op1)))
+          {
+            CC_STATUS_INIT;
+          }
+	else if (is_compare_redundant (cmp, cond) == NULL_RTX)
 	  {
 	    /* Reset the nonstandard flag */
 	    CC_STATUS_INIT;
