avr-llvm / llvm

[MERGED UPSTREAM] AVR backend for the LLVM compiler library
220 stars 21 forks source link

[AVR] Touch up fixups #136

Closed agnat closed 9 years ago

agnat commented 9 years ago

Pass fixup value by reference to adjustFooBar(...) functions, adjusting the value in-place. Drop a missleading comment in processFixupValue(...).

I think it's a little less confusing this way... @dylanmckay, could you give it a review and maybe re-run your test case?

dylanmckay commented 9 years ago

My testcase is:

(exl.s):

    .text
    .file   "/home/dylan/Desktop/exl.ll"
    .globl  main
    .align  2
    .type   main,@function
main:                                   ; @main
; BB#0:                                 ; %entry
    push    r16
    push    r17
    push    r28
    push    r29
    in  r24, 61
    in  r25, 62
    std Y+31, r24               ; 2-byte Folded Spill
    std Y+32, r25               ; 2-byte Folded Spill
    call    init
    ldi r24, 0
    ldi r25, 0
    ldi r18, 1
    ldi r19, 0
    std Y+29, r18               ; 2-byte Folded Spill
    std Y+30, r19               ; 2-byte Folded Spill
    std Y+27, r24               ; 2-byte Folded Spill
    std Y+28, r25               ; 2-byte Folded Spill
    rjmp    LBB0_1
LBB0_1:                                 ; %while_body
                                        ; =>This Inner Loop Header: Depth=1
    ldd r24, Y+27               ; 2-byte Folded Reload
    ldd r25, Y+28               ; 2-byte Folded Reload
    ldd r18, Y+29               ; 2-byte Folded Reload
    ldd r19, Y+30               ; 2-byte Folded Reload
    in  r30, 61
    in  r31, 62
    sbiw    r30, 2
    andi    r30, 254
    andi    r31, 255
    in  r0, 63
    cli
    out 62, r31
    out 63, r0
    out 61, r30
    movw    r20, r30
    ldi r22, 232
    ldi r23, 3
    st  Z, r22
    std Z+1, r23
    ldi r22, 0
    ldi r23, 0
    ldi r30, 1
    ldi r31, 0
    cp  r18, r22
    cpc r19, r23
    std Y+25, r24               ; 2-byte Folded Spill
    std Y+26, r25               ; 2-byte Folded Spill
    std Y+23, r18               ; 2-byte Folded Spill
    std Y+24, r19               ; 2-byte Folded Spill
    std Y+21, r20               ; 2-byte Folded Spill
    std Y+22, r21               ; 2-byte Folded Spill
    std Y+19, r22               ; 2-byte Folded Spill
    std Y+20, r23               ; 2-byte Folded Spill
    std Y+17, r30               ; 2-byte Folded Spill
    std Y+18, r31               ; 2-byte Folded Spill
    breq    LBB0_3
; BB#2:                                 ; %while_body
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+19               ; 2-byte Folded Reload
    ldd r25, Y+20               ; 2-byte Folded Reload
    std Y+17, r24               ; 2-byte Folded Spill
    std Y+18, r25               ; 2-byte Folded Spill
LBB0_3:                                 ; %while_body
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+17               ; 2-byte Folded Reload
    ldd r25, Y+18               ; 2-byte Folded Reload
    mov r18, r24
    ldd r24, Y+23               ; 2-byte Folded Reload
    ldd r25, Y+24               ; 2-byte Folded Reload
    ldd r20, Y+19               ; 2-byte Folded Reload
    ldd r21, Y+20               ; 2-byte Folded Reload
    cp  r24, r20
    cpc r25, r21
    std Y+16, r18               ; 1-byte Folded Spill
    brne    LBB0_5
    rjmp    LBB0_4
LBB0_4:                                 ; %if_then
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldi r24, 0
    ldi r22, -1
    call    digitalWrite
    rjmp    LBB0_6
LBB0_5:                                 ; %if_else
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldi r24, 1
    ldi r22, -1
    call    digitalWrite
    rjmp    LBB0_6
LBB0_6:                                 ; %if_cont
                                        ;   in Loop: Header=BB0_1 Depth=1
    in  r24, 61
    in  r25, 62
    sbiw    r24, 2
    andi    r24, 254
    andi    r25, 255
    in  r0, 63
    cli
    out 62, r25
    out 63, r0
    out 61, r24
    ldi r18, 200
    ldi r19, 0
    movw    r30, r24
    st  Z, r18
    std Z+1, r19
    ldi r24, 0
    ldi r25, 0
    movw    r22, r18
    std Y+14, r24               ; 2-byte Folded Spill
    std Y+15, r25               ; 2-byte Folded Spill
    call    delay
    ldd r24, Y+25               ; 2-byte Folded Reload
    ldd r25, Y+26               ; 2-byte Folded Reload
    subi    r24, 56
    sbci    r25, 255
    ldi r20, 0
    std Y+12, r24               ; 2-byte Folded Spill
    std Y+13, r25               ; 2-byte Folded Spill
    mov r24, r20
    mov r22, r20
    std Y+11, r20               ; 1-byte Folded Spill
    call    digitalWrite
    ldi r24, 1
    ldd r22, Y+11               ; 1-byte Folded Reload
    call    digitalWrite
    ldd r18, Y+21               ; 2-byte Folded Reload
    ldd r19, Y+22               ; 2-byte Folded Reload
    movw    r30, r18
    ld  r26, Z
    ldd r27, Z+1
                                        ; implicit-def: R31R30
    ldd r24, Y+16               ; 1-byte Folded Reload
    mov r30, r24
    andi    r30, 1
    andi    r31, 0
    ldi r28, 1
    ldi r29, 0
    ldd r16, Y+14               ; 2-byte Folded Reload
    ldd r17, Y+15               ; 2-byte Folded Reload
    cp  r30, r16
    cpc r31, r17
    std Y+9, r26                ; 2-byte Folded Spill
    std Y+10, r27               ; 2-byte Folded Spill
    std Y+7, r28                ; 2-byte Folded Spill
    std Y+8, r29                ; 2-byte Folded Spill
    brne    LBB0_8
; BB#7:                                 ; %if_cont
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+14               ; 2-byte Folded Reload
    ldd r25, Y+15               ; 2-byte Folded Reload
    std Y+7, r24                ; 2-byte Folded Spill
    std Y+8, r25                ; 2-byte Folded Spill
LBB0_8:                                 ; %if_cont
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+7                ; 2-byte Folded Reload
    ldd r25, Y+8                ; 2-byte Folded Reload
    ldd r18, Y+9                ; 2-byte Folded Reload
    ldd r19, Y+10               ; 2-byte Folded Reload
    ldd r20, Y+12               ; 2-byte Folded Reload
    ldd r21, Y+13               ; 2-byte Folded Reload
    cp  r18, r20
    cpc r19, r21
    std Y+5, r24                ; 2-byte Folded Spill
    std Y+6, r25                ; 2-byte Folded Spill
    brlt    LBB0_10
; BB#9:                                 ; %if_cont
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+23               ; 2-byte Folded Reload
    ldd r25, Y+24               ; 2-byte Folded Reload
    std Y+5, r24                ; 2-byte Folded Spill
    std Y+6, r25                ; 2-byte Folded Spill
LBB0_10:                                ; %if_cont
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+5                ; 2-byte Folded Reload
    ldd r25, Y+6                ; 2-byte Folded Reload
    ldd r18, Y+9                ; 2-byte Folded Reload
    ldd r19, Y+10               ; 2-byte Folded Reload
    ldd r20, Y+12               ; 2-byte Folded Reload
    ldd r21, Y+13               ; 2-byte Folded Reload
    cp  r18, r20
    cpc r19, r21
    ldd r22, Y+14               ; 2-byte Folded Reload
    ldd r23, Y+15               ; 2-byte Folded Reload
    std Y+3, r24                ; 2-byte Folded Spill
    std Y+4, r25                ; 2-byte Folded Spill
    std Y+1, r22                ; 2-byte Folded Spill
    std Y+2, r23                ; 2-byte Folded Spill
    brlt    LBB0_12
; BB#11:                                ; %if_cont
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+12               ; 2-byte Folded Reload
    ldd r25, Y+13               ; 2-byte Folded Reload
    std Y+1, r24                ; 2-byte Folded Spill
    std Y+2, r25                ; 2-byte Folded Spill
LBB0_12:                                ; %if_cont
                                        ;   in Loop: Header=BB0_1 Depth=1
    ldd r24, Y+1                ; 2-byte Folded Reload
    ldd r25, Y+2                ; 2-byte Folded Reload
    ldd r18, Y+3                ; 2-byte Folded Reload
    ldd r19, Y+4                ; 2-byte Folded Reload
    std Y+29, r18               ; 2-byte Folded Spill
    std Y+30, r19               ; 2-byte Folded Spill
    std Y+27, r24               ; 2-byte Folded Spill
    std Y+28, r25               ; 2-byte Folded Spill
    rjmp    LBB0_1
.Lfunc_end0:
    .size   main, .Lfunc_end0-main

And verifying that the disassembled branch offsets are the same as what GCC generates. This PR doesn't mess up any fixups :)