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;