Skip to content

cmd/gc: code generation bug involving multi-result return f() and compacted stack frame #4518

@rsc

Description

@rsc
package main

type T struct {
    x interface{}
}

func bogus1(d interface{}) (*int, *int) {
    switch d := d.(type) {
    case nil:
        return nil, nil
    case *T:
        return bogus1(d.x)
    }
    panic("x")
}

6g -S x.go

--- prog list "bogus1" ---
0000 (x.go:7) TEXT    bogus1+0(SB),$56-32
0001 (x.go:8) MOVQ    d+0(FP),CX
0002 (x.go:8) MOVQ    d+8(FP),AX
0003 (x.go:9) MOVQ    CX,autotmp_0000+-16(SP)
0004 (x.go:9) MOVQ    CX,(SP)
0005 (x.go:9) MOVQ    AX,autotmp_0000+-8(SP)
0006 (x.go:9) MOVQ    AX,8(SP)
0007 (x.go:9) CALL    ,runtime.efacethash+0(SB)
0008 (x.go:9) MOVQ    autotmp_0000+-8(SP),BP
0009 (x.go:9) MOVQ    autotmp_0000+-16(SP),DX
0010 (x.go:9) MOVL    16(SP),BX
0011 (x.go:9) CMPQ    DX,$0
0012 (x.go:9) JNE     ,14
0013 (x.go:9) JMP     ,25
0014 (x.go:9) CMPL    BX,$432690315
0015 (x.go:9) JNE     ,40
0016 (x.go:9) MOVQ    $type.*"".T+0(SB),(SP)
0017 (x.go:9) MOVQ    DX,8(SP)
0018 (x.go:9) MOVQ    BP,16(SP)
0019 (x.go:9) CALL    ,runtime.assertE2T2+0(SB)
0020 (x.go:9) MOVQ    24(SP),CX
0021 (x.go:9) MOVBQZX 32(SP),BX
0022 (x.go:9) CMPB    BX,$0
0023 (x.go:9) JEQ     ,40
0024 (x.go:11) JMP     ,28
0025 (x.go:10) MOVQ    $0,.noname+16(FP)  <<< correct location
0026 (x.go:10) MOVQ    $0,.noname+24(FP)  <<< correct location
0027 (x.go:10) RET     ,
0028 (x.go:12) LEAQ    (CX),BP
0029 (x.go:12) LEAQ    (SP),BX
0030 (x.go:12) MOVQ    BX,DI
0031 (x.go:12) MOVQ    BP,SI
0032 (x.go:12) MOVSQ   ,
0033 (x.go:12) MOVSQ   ,
0034 (x.go:12) CALL    ,bogus1+0(SB)
0035 (x.go:12) MOVQ    32(SP),BX
0036 (x.go:12) MOVQ    BX,.args+32(FP)  <<< incorrect location
0037 (x.go:12) MOVQ    40(SP),BX
0038 (x.go:12) MOVQ    BX,.args+40(FP)  <<< incorrect location
0039 (x.go:12) RET     ,
0040 (x.go:14) MOVQ    $type.string+0(SB),(SP)
0041 (x.go:14) LEAQ    go.string."x"+0(SB),BX
0042 (x.go:14) LEAQ    8(SP),BP
0043 (x.go:14) MOVQ    BP,DI
0044 (x.go:14) MOVQ    BX,SI
0045 (x.go:14) MOVSQ   ,
0046 (x.go:14) MOVSQ   ,
0047 (x.go:14) CALL    ,runtime.convT2E+0(SB)
0048 (x.go:14) LEAQ    24(SP),BX
0049 (x.go:14) LEAQ    (SP),BP
0050 (x.go:14) MOVQ    BP,DI
0051 (x.go:14) MOVQ    BX,SI
0052 (x.go:14) MOVSQ   ,
0053 (x.go:14) MOVSQ   ,
0054 (x.go:14) CALL    ,runtime.panic+0(SB)
0055 (x.go:14) UNDEF   ,
0056 (x.go:15) RET     ,

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions