http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39633

Georg-Johann Lay <gjl at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
   Last reconfirmed|2009-08-17 12:12:00         |2010-07-09 12:12
                 CC|avr at gjlay dot de         |gjl at gcc dot gnu.org
      Known to fail|                            |4.5.2, 4.6.1

--- Comment #6 from Georg-Johann Lay <gjl at gcc dot gnu.org> 2011-07-09 
15:48:55 UTC ---
I confirm it on 4.6.1, 4.5.0 and 4.5.2 (-fno-strict-overflow does not help)

I see the bug only for -O1 (in which case g_52=1) and not for other
optimization levels (in which case g_52=5).

The bug disappears if l_116 in func_1 is declared as uint32_t instead of
uint64_t.

In 4.6.1, g_52 is as follows:

-Os -fsplit-wide-types: 5
-Os -fno-split-wide-types: 1

This remains after adding the no_inline attribute to safe_add_func_int8_t_s_s
that gets compiler to:

safe_add_func_int8_t_s_s.constprop.0:
    cpi r24,lo8(125)     ;  _si1,     ;  6    *cmpqi/3
    brge .L2     ; ,     ;  7    branch
    subi r24,lo8(-(3))     ;  _si1,     ;  9    addqi3/2
.L2:
    ret     ;  28    return

With -Os -fsplit-wide-types, the compile of func_1 is(g_52=5 ok):

func_1:
/* prologue: function */
    ldi r24,lo8(0)     ;  l_116,     ;  3    *movqi/1
.L4:
    lds r25,g_52     ;  tmp52, g_52     ;  15    *movqi/4
    subi r25,lo8(-(1))     ;  tmp52,     ;  16    addqi3/2
    sts g_52,r25     ;  g_52, tmp52     ;  17    *movqi/3
    rcall safe_add_func_int8_t_s_s.constprop.0 ; 20 call_value_insn/3
    sbrc r24,7     ;  l_116,     ;  99    *sbrx_branchhi
    rjmp .L3     ; 
    cpi r24,lo8(13)     ;  l_116,     ;  60    *cmpqi/3
    brlo .L4     ; ,     ;  61    branch
.L3:
    ret     ;  98    return

With -Os -fno-split-wide-types, the compile of func_1 is (g_52=1 wrong):

func_1:
    push r8     ;      ;  90    *pushqi/1
    push r9     ;      ;  91    *pushqi/1
    push r10     ;      ;  92    *pushqi/1
    push r11     ;      ;  93    *pushqi/1
    push r12     ;      ;  94    *pushqi/1
    push r13     ;      ;  95    *pushqi/1
    push r14     ;      ;  96    *pushqi/1
    push r15     ;      ;  97    *pushqi/1
/* prologue: function */
    clr r8     ;  l_116     ;  3    *movqi/1
.L4:
    lds r24,g_52     ;  tmp52, g_52     ;  15    *movqi/4
    subi r24,lo8(-(1))     ;  tmp52,     ;  16    addqi3/2= 1]
    sts g_52,r24     ;  g_52, tmp52     ;  17    *movqi/3
    mov r24,r8     ; , l_116     ;  19    *movqi/1
    rcall safe_add_func_int8_t_s_s.constprop.0 ; 20 call_value_insn/3
    mov r8,r24     ;  l_116, D.2168     ;  22    *movqi/1
    lsl r24     ;  tmp54     ;  23    ashrqi3/5
    sbc r24,r24     ;  tmp54
    brne .L3     ; ,     ;  33    branch
    tst r24     ;  l_116     ;  36    *cmpqi/1
    brne .L3     ; ,     ;  37    branch
    tst r24     ;  l_116     ;  40    *cmpqi/1
    brne .L3     ; ,     ;  41    branch
    tst r24     ;  l_116     ;  44    *cmpqi/1
    brne .L3     ; ,     ;  45    branch
    tst r24     ;  l_116     ;  48    *cmpqi/1
    brne .L3     ; ,     ;  49    branch
    tst r24     ;  l_116     ;  52    *cmpqi/1
    brne .L3     ; ,     ;  53    branch
    tst r24     ;  l_116     ;  56    *cmpqi/1
    brne .L3     ; ,     ;  57    branch
    ldi r24,lo8(12)     ; ,     ;  89    *movqi/2
    cp r24,r8     ; , l_116     ;  60    *cmpqi/2
    brsh .L4     ; ,     ;  61    branch
.L3:
/* epilogue start */
    pop r15     ;      ;  100    popqi
    pop r14     ;      ;  101    popqi
    pop r13     ;      ;  102    popqi
    pop r12     ;      ;  103    popqi
    pop r11     ;      ;  104    popqi
    pop r10     ;      ;  105    popqi
    pop r9     ;      ;  106    popqi
    pop r8     ;      ;  107    popqi
    ret     ;  108    return_from_epilogue

Reply via email to