main

help

Click on a value or block to toggle highlighting of that value/block and its uses. (Values and blocks are highlighted by ID, and IDs of dead items may be reused, so not all highlights necessarily correspond to the clicked item.)

Faded out values and blocks are dead code that has not been eliminated.

Values printed in italics have a dependency cycle.

CFG: Dashed edge is for unlikely branches. Blue color is for backward edges. Edge with a dot means that this edge follows the order in which blocks were laidout.

sources

 
 
9
10
11
12
13
14
15
16
17
18
19
 
/Users/kcjia/Developer/GoPath/src/test/main.go
func main() {
client := NewA()
var k *int
if true {
*k = 1
} else {
*k = 2
}
client.GetA(k)
fmt.Println(client)
}

AST

buildssa-enter
buildssa-body
. DCL # main.go:10
. . NAME-main.client esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*A # main.go:10
. INLMARK # +main.go:10
. DCL # main.go:10
. . NAME-main.~R0 esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*A # main.go:10
. BLOCK # main.go:26
. BLOCK-List
. . AS tc(1) # main.go:26
. . . NAME-main..autotmp_15 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*A # main.go:26
. . . NEW esc(h) tc(1) NonNil PTR-*A # main.go:26 PTR-*A
. . . . TYPE main.A tc(1) Class:PEXTERN Offset:0 type main.A # main.go:21
. . BLOCK # main.go:26
. . BLOCK-List
. . . AS tc(1) # main.go:26
. . . . DOT tc(1) int # main.go:26 main.a int
. . . . . DEREF tc(1) main.A # main.go:26 main.A
. . . . . . NAME-main..autotmp_15 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*A # main.go:26
. . . . LITERAL-1 tc(1) int # main.go:26
. . AS tc(1) # main.go:10
. . . NAME-main.~R0 esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*A # main.go:10
. . . NAME-main..autotmp_15 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*A # main.go:26
. GOTO tc(1) # main.go:10 main..i0
. LABEL # main.go:10 main..i0
. AS tc(1) Def # main.go:10
. . NAME-main.client esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*A # main.go:10
. . NAME-main.~R0 esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*A # main.go:10
. DCL tc(1) # main.go:11
. . NAME-main.k esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*int # main.go:11
. AS tc(1) # main.go:11
. . NAME-main.k esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*int # main.go:11
. IF tc(1) # main.go:12
. IF-Cond
. . LITERAL-true tc(1) bool
. IF-Body
. . AS tc(1) # main.go:13
. . . DEREF tc(1) int # main.go:13 int
. . . . NAME-main.k esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*int # main.go:11
. . . LITERAL-1 tc(1) int # main.go:13
. DCL # main.go:17
. . NAME-main.a esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used PTR-*A # main.go:29
. DCL # main.go:17
. . NAME-main.c esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used PTR-*int # main.go:29
. BLOCK # main.go:17
. BLOCK-List
. . AS tc(1) # main.go:17
. . . NAME-main.a esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used PTR-*A # main.go:29
. . . NAME-main.client esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*A # main.go:10
. . AS tc(1) # main.go:17
. . . NAME-main.c esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used PTR-*int # main.go:29
. . . NAME-main.k esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*int # main.go:11
. INLMARK Index:1 # +main.go:17
. DCL # main.go:17
. . NAME-main.~R0 esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*int # main.go:17
. BLOCK # main.go:17
. BLOCK-List
. . AS tc(1) # main.go:17
. . . NAME-main.~R0 esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*int # main.go:17
. . . NAME-main.c esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used PTR-*int # main.go:29
. GOTO tc(1) # main.go:17 main..i1
. LABEL # main.go:17 main..i1
. AS tc(1) # main.go:18
. . NAME-main..autotmp_12 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*A # main.go:18
. . NAME-main.client esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used PTR-*A # main.go:10
. BLOCK # main.go:18
. BLOCK-List
. . AS tc(1) # main.go:18
. . . NAME-main.~arg0 esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used INTER-interface {} # main.go:18
. . . EFACE tc(1) INTER-interface {} # main.go:18 INTER-interface {}
. . . . ADDR tc(1) PTR-*uint8 # main.go:18 PTR-*uint8
. . . . . LINKSYMOFFSET tc(1) Offset:0 uint8 uint8
. . . . NAME-main..autotmp_12 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*A # main.go:18
. VARKILL tc(1) # main.go:18
. . NAME-main..autotmp_12 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*A # main.go:18
. DCL # main.go:18
. . NAME-fmt.a esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used SLICE-[]interface {} # print.go:273
. BLOCK-init
. . AS tc(1) # main.go:18
. . . NAME-main..autotmp_17 esc(N) tc(1) Class:PAUTO Offset:0 Addrtaken AutoTemp OnStack Used ARRAY-[1]interface {} # main.go:18
. . AS tc(1) # main.go:18
. . . NAME-main..autotmp_16 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*[1]interface {} # main.go:18
. . . ADDR tc(1) PTR-*[1]interface {} # main.go:18 PTR-*[1]interface {}
. . . . NAME-main..autotmp_17 esc(N) tc(1) Class:PAUTO Offset:0 Addrtaken AutoTemp OnStack Used ARRAY-[1]interface {} # main.go:18
. . BLOCK # main.go:18
. . BLOCK-List
. . . AS tc(1) # main.go:18
. . . . INDEX tc(1) Bounded INTER-interface {} # main.go:18 INTER-interface {}
. . . . . DEREF tc(1) Implicit ARRAY-[1]interface {} # main.go:18 ARRAY-[1]interface {}
. . . . . . NAME-main..autotmp_16 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*[1]interface {} # main.go:18
. . . . . LITERAL-0 tc(1) int # main.go:18
. . . . NAME-main.~arg0 esc(no) tc(1) Class:PAUTO Offset:0 OnStack Used INTER-interface {} # main.go:18
. . BLOCK # main.go:18
. . BLOCK-List
. . . AS tc(1) # main.go:18
. . . . NAME-fmt.a esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used SLICE-[]interface {} # print.go:273
. . . . SLICEARR tc(1) SLICE-[]interface {} # main.go:18 SLICE-[]interface {}
. . . . . NAME-main..autotmp_16 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used PTR-*[1]interface {} # main.go:18
. BLOCK # main.go:18
. DCL # main.go:18
. . NAME-fmt.n esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used int # print.go:273
. AS tc(1) # main.go:18
. . NAME-fmt.n esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used int # print.go:273
. DCL # main.go:18
. . NAME-fmt.err esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used error # print.go:273
. AS tc(1) # main.go:18
. . NAME-fmt.err esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used error # print.go:273
. INLMARK Index:2 # +main.go:18
. DCL tc(1) # print.go:274
. . NAME-fmt..autotmp_3 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used int # print.go:274
. AS tc(1) # print.go:274
. . NAME-fmt..autotmp_3 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used int # print.go:274
. DCL tc(1) # print.go:274
. . NAME-fmt..autotmp_4 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used error # print.go:274
. AS tc(1) # print.go:274
. . NAME-fmt..autotmp_4 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used error # print.go:274
. AS tc(1) # print.go:274
. . NAME-main..autotmp_14 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used error # print.go:274
. BLOCK-init
. . CALLFUNC tc(1) IsDDD Use:2 Walked STRUCT-(int, error) # print.go:274 STRUCT-(int, error)
. . . NAME-fmt.Fprintln tc(1) Class:PFUNC Offset:0 FUNC-func(io.Writer, ...interface {}) (int, error) # print.go:262
. . CALLFUNC-Args
. . . EFACE tc(1) io.Writer # print.go:274 io.Writer
. . . . ADDR tc(1) PTR-*uint8 # print.go:274 PTR-*uint8
. . . . . LINKSYMOFFSET tc(1) Offset:0 uint8 uint8
. . . . NAME-os.Stdout tc(1) Class:PEXTERN Offset:0 PTR-*os.File # file.go:67
. . . NAME-fmt.a esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used SLICE-[]interface {} # print.go:273
. BLOCK # print.go:274
. BLOCK-List
. . AS # print.go:274
. . . NAME-main..autotmp_13 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used int # print.go:274
. . . RESULT tc(1) int # print.go:274 int
. . AS # print.go:274
. . . NAME-main..autotmp_14 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used error # print.go:274
. . . RESULT tc(1) Index:1 error # print.go:274 error
. BLOCK # print.go:274
. BLOCK-List
. . AS tc(1) # print.go:274
. . . NAME-fmt..autotmp_3 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used int # print.go:274
. . . NAME-main..autotmp_13 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used int # print.go:274
. . AS tc(1) # print.go:274
. . . NAME-fmt..autotmp_4 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used error # print.go:274
. . . NAME-main..autotmp_14 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used error # print.go:274
. VARKILL tc(1) # print.go:274
. . NAME-main..autotmp_14 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used error # print.go:274
. VARKILL tc(1) # print.go:274
. . NAME-main..autotmp_13 esc(N) tc(1) Class:PAUTO Offset:0 AutoTemp OnStack Used int # print.go:274
. BLOCK # main.go:18
. BLOCK-List
. . AS tc(1) # main.go:18
. . . NAME-fmt.n esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used int # print.go:273
. . . NAME-fmt..autotmp_3 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used int # print.go:274
. . AS tc(1) # main.go:18
. . . NAME-fmt.err esc(no) tc(1) Class:PAUTO Offset:0 InlFormal OnStack Used error # print.go:273
. . . NAME-fmt..autotmp_4 esc(no) tc(1) Class:PAUTO Offset:0 InlLocal OnStack Used error # print.go:274
. GOTO tc(1) # main.go:18 main..i2
. LABEL # main.go:18 main..i2
buildssa-exit
 

before insert phis

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v3 (?) = SB <uintptr>
    • v4 (?) = GetClosurePtr <*uint8>
    • v5 (+10) = InlMark <void> [0] v1
    • v6 (?) = Addr <*uint8> {type."".A} v3
    • v7 (26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
    • v8 (26) = SelectN <mem> [1] v7
    • v9 (26) = SelectN <*A> [0] v7 (~R0[*A])
    • v10 (?) = Const64 <int> [1]
    • v11 (26) = NilCheck <void> v9 v8
    • v12 (26) = OffPtr <*int> [0] v9
    • v13 (26) = Store <mem> {int} v12 v10 v8
    • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
    • v21 (?) = Addr <*uint8> {type.*"".A} v3
    • v23 (?) = ConstInterface <interface {}>
    • v24 (?) = ArrayMake1 <[1]interface {}> v23
    • v31 (?) = Const64 <int> [0] (fmt.n[int], fmt..autotmp_3[int])
    • v41 (?) = ConstInterface <error> (fmt.err[error], fmt..autotmp_4[error])
    • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
    • v45 (?) = Addr <**os.File> {os.Stdout} v3
  • Plainb2 (+10)
  • b2: ← b1
    • v14 (10) = FwdRef <*A> {{[] ~R0}} (~R0[*A], client[*A], a[*A])
    • v16 (13) = FwdRef <mem> {{[] %!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference)}}
    • v17 (13) = NilCheck <void> v15 v16
    • v18 (13) = Store <mem> {int} v15 v10 v16
    • v19 (+17) = InlMark <void> [1] v18
  • Plainb3 (+17)
  • b3: ← b2
    • v20 (18) = FwdRef <*A> {{[] client}} (client[*A])
    • v22 (18) = IMake <interface {}> v21 v20 (~arg0[interface {}])
    • v25 (18) = FwdRef <mem> {{[] %!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference)}}
    • v26 (18) = VarDef <mem> {.autotmp_17} v25
    • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
    • v28 (18) = Store <mem> {[1]interface {}} v27 v24 v26
    • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
    • v30 (18) = NilCheck <void> v29 v28
    • v32 (18) = PtrIndex <*interface {}> v29 v31
    • v33 (18) = Store <mem> {interface {}} v32 v22 v28
    • v34 (18) = NilCheck <void> v29 v33
    • v35 (18) = Copy <*interface {}> v29
    • v36 (18) = IsSliceInBounds <bool> v31 v10
  • If v36b4 b5 (likely) (18)
  • b4: ← b3
    • v39 (18) = Sub64 <int> v10 v31
    • v40 (18) = SliceMake <[]interface {}> v35 v39 v39 (fmt.a[[]interface {}])
    • v42 (18) = FwdRef <mem> {{[] %!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference)}}
    • v43 (+18) = InlMark <void> [2] v42
    • v46 (274) = Load <*os.File> v45 v42
    • v47 (274) = IMake <io.Writer> v44 v46
    • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v42
    • v49 (274) = SelectN <mem> [2] v48
    • v50 (274) = SelectN <int> [0] v48
    • v51 (274) = SelectN <int> [0] v48 (fmt.n[int], fmt..autotmp_3[int])
    • v52 (274) = SelectN <error> [1] v48 (fmt.err[error], fmt..autotmp_4[error])
  • Plainb6 (+18)
  • b5: ← b3
    • v37 (18) = FwdRef <mem> {{[] %!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference)}}
    • v38 (18) = PanicBounds <mem> [6] v31 v10 v37
  • Exit v38 (18)
  • b6: ← b4
    • v54 (19) = FwdRef <mem> {{[] %!v(PANIC=Format method: runtime error: invalid memory address or nil pointer dereference)}}
    • v53 (19) = MakeResult <mem> v54
  • Ret v53 (19)
  • name ~R0[*A]: v9 v14
  • name client[*A]: v14 v20
  • name k[*int]: v15
  • name a[*A]: v14
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31 v51
  • name fmt.err[error]: v41 v52
  • name fmt..autotmp_3[int]: v31 v51
  • name fmt..autotmp_4[error]: v41 v52
  • start

    • b1:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v4 (?) = GetClosurePtr <*uint8>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (~R0[*A])
      • v10 (?) = Const64 <int> [1]
      • v11 (26) = NilCheck <void> v9 v8
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v23 (?) = ConstInterface <interface {}>
      • v24 (?) = ArrayMake1 <[1]interface {}> v23
      • v31 (?) = Const64 <int> [0] (fmt.n[int], fmt..autotmp_3[int])
      • v41 (?) = ConstInterface <error> (fmt..autotmp_4[error], fmt.err[error])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
    • Plainb2 (+10)
    • b2: ← b1
      • v14 (10) = Copy <*A> v9 (~R0[*A], client[*A], a[*A])
      • v16 (13) = Copy <mem> v13
      • v17 (13) = NilCheck <void> v15 v16
      • v18 (13) = Store <mem> {int} v15 v10 v16
      • v19 (+17) = InlMark <void> [1] v18
    • Plainb3 (+17)
    • b3: ← b2
      • v20 (18) = Copy <*A> v14 (client[*A])
      • v22 (18) = IMake <interface {}> v21 v20 (~arg0[interface {}])
      • v25 (18) = Copy <mem> v18
      • v26 (18) = VarDef <mem> {.autotmp_17} v25
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v28 (18) = Store <mem> {[1]interface {}} v27 v24 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (18) = NilCheck <void> v29 v28
      • v32 (18) = PtrIndex <*interface {}> v29 v31
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
      • v35 (18) = Copy <*interface {}> v29
      • v36 (18) = IsSliceInBounds <bool> v31 v10
    • If v36b4 b5 (likely) (18)
    • b4: ← b3
      • v39 (18) = Sub64 <int> v10 v31
      • v40 (18) = SliceMake <[]interface {}> v35 v39 v39 (fmt.a[[]interface {}])
      • v42 (18) = Copy <mem> v33
      • v43 (+18) = InlMark <void> [2] v42
      • v46 (274) = Load <*os.File> v45 v42
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v42
      • v49 (274) = SelectN <mem> [2] v48
      • v50 (274) = SelectN <int> [0] v48
      • v51 (274) = SelectN <int> [0] v48 (fmt.n[int], fmt..autotmp_3[int])
      • v52 (274) = SelectN <error> [1] v48 (fmt.err[error], fmt..autotmp_4[error])
    • Plainb6 (+18)
    • b5: ← b3
      • v37 (18) = Copy <mem> v33
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v37
    • Exit v38 (18)
    • b6: ← b4
      • v54 (19) = Copy <mem> v49
      • v53 (19) = MakeResult <mem> v54
    • Ret v53 (19)
  • name ~R0[*A]: v9 v14
  • name client[*A]: v14 v20
  • name k[*int]: v15
  • name a[*A]: v14
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31 v51
  • name fmt.err[error]: v41 v52
  • name fmt..autotmp_3[int]: v31 v51
  • name fmt..autotmp_4[error]: v41 v52
  • number lines [6041 ns]

    early phielim [1417 ns]

    • b1:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v4 (?) = GetClosurePtr <*uint8>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (~R0[*A])
      • v10 (?) = Const64 <int> [1]
      • v11 (26) = NilCheck <void> v9 v8
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v23 (?) = ConstInterface <interface {}>
      • v24 (?) = ArrayMake1 <[1]interface {}> v23
      • v31 (?) = Const64 <int> [0] (fmt.n[int], fmt..autotmp_3[int])
      • v41 (?) = ConstInterface <error> (fmt.err[error], fmt..autotmp_4[error])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
    • Plainb2 (+10)
    • b2: ← b1
      • v14 (10) = Copy <*A> v9 (a[*A], ~R0[*A], client[*A])
      • v16 (13) = Copy <mem> v13
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v19 (+17) = InlMark <void> [1] v18
    • Plainb3 (+17)
    • b3: ← b2
      • v20 (18) = Copy <*A> v9 (client[*A])
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v25 (18) = Copy <mem> v18
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v28 (18) = Store <mem> {[1]interface {}} v27 v24 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = PtrIndex <*interface {}> v29 v31
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
      • v35 (18) = Copy <*interface {}> v29
      • v36 (18) = IsSliceInBounds <bool> v31 v10
    • If v36b4 b5 (likely) (18)
    • b4: ← b3
      • v39 (18) = Sub64 <int> v10 v31
      • v40 (18) = SliceMake <[]interface {}> v29 v39 v39 (fmt.a[[]interface {}])
      • v42 (18) = Copy <mem> v33
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v50 (274) = SelectN <int> [0] v48
      • v51 (274) = SelectN <int> [0] v48 (fmt.n[int], fmt..autotmp_3[int])
      • v52 (274) = SelectN <error> [1] v48 (fmt..autotmp_4[error], fmt.err[error])
    • Plainb6 (+18)
    • b5: ← b3
      • v37 (18) = Copy <mem> v33
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v33
    • Exit v38 (18)
    • b6: ← b4
      • v53 (+19) = MakeResult <mem> v49
      • v54 (19) = Copy <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9 v14
  • name client[*A]: v14 v20
  • name k[*int]: v15
  • name a[*A]: v14
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31 v51
  • name fmt.err[error]: v41 v52
  • name fmt..autotmp_3[int]: v31 v51
  • name fmt..autotmp_4[error]: v41 v52
  • early copyelim [1708 ns]

    • b1:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v4 (?) = GetClosurePtr <*uint8>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (a[*A], ~R0[*A], client[*A])
      • v10 (?) = Const64 <int> [1]
      • v11 (26) = NilCheck <void> v9 v8
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (k[*int], ~R0[*int], c[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v23 (?) = ConstInterface <interface {}>
      • v24 (?) = ArrayMake1 <[1]interface {}> v23
      • v31 (?) = Const64 <int> [0] (fmt.n[int], fmt..autotmp_3[int])
      • v41 (?) = ConstInterface <error> (fmt.err[error], fmt..autotmp_4[error])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
    • Plainb2 (+10)
    • b2: ← b1
      • v14 (10) = Copy <*A> v9
      • v16 (13) = Copy <mem> v13
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v19 (+17) = InlMark <void> [1] v18
    • Plainb3 (+17)
    • b3: ← b2
      • v20 (18) = Copy <*A> v9
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v25 (18) = Copy <mem> v18
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v28 (18) = Store <mem> {[1]interface {}} v27 v24 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = PtrIndex <*interface {}> v29 v31
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
      • v35 (18) = Copy <*interface {}> v29
      • v36 (18) = IsSliceInBounds <bool> v31 v10
    • If v36b4 b5 (likely) (18)
    • b4: ← b3
      • v39 (18) = Sub64 <int> v10 v31
      • v40 (18) = SliceMake <[]interface {}> v29 v39 v39 (fmt.a[[]interface {}])
      • v42 (18) = Copy <mem> v33
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v50 (274) = SelectN <int> [0] v48
      • v51 (274) = SelectN <int> [0] v48 (fmt.n[int], fmt..autotmp_3[int])
      • v52 (274) = SelectN <error> [1] v48 (fmt.err[error], fmt..autotmp_4[error])
    • Plainb6 (+18)
    • b5: ← b3
      • v37 (18) = Copy <mem> v33
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v33
    • Exit v38 (18)
    • b6: ← b4
      • v53 (+19) = MakeResult <mem> v49
      • v54 (19) = Copy <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9 v9
  • name client[*A]: v9 v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31 v51
  • name fmt.err[error]: v41 v52
  • name fmt..autotmp_3[int]: v31 v51
  • name fmt..autotmp_4[error]: v41 v52
  • early deadcode [9708 ns]

    • b1:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (a[*A], ~R0[*A], client[*A])
      • v10 (?) = Const64 <int> [1]
      • v11 (26) = NilCheck <void> v9 v8
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (c[*int], ~R0[*int], k[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v23 (?) = ConstInterface <interface {}>
      • v24 (?) = ArrayMake1 <[1]interface {}> v23
      • v31 (?) = Const64 <int> [0] (fmt..autotmp_3[int], fmt.n[int])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
    • Plainb2 (+10)
    • b2: ← b1
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
    • Plainb3 (+17)
    • b3: ← b2
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v28 (18) = Store <mem> {[1]interface {}} v27 v24 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = PtrIndex <*interface {}> v29 v31
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
      • v36 (18) = IsSliceInBounds <bool> v31 v10
    • If v36b4 b5 (likely) (18)
    • b4: ← b3
      • v39 (18) = Sub64 <int> v10 v31
      • v40 (18) = SliceMake <[]interface {}> v29 v39 v39 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
    • Plainb6 (+18)
    • b5: ← b3
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v33
    • Exit v38 (18)
    • b6: ← b4
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31
  • name fmt..autotmp_3[int]: v31
  • short circuit [3458 ns]

    • b1:
    • BlockInvalid (+10)
    • b2:
    • BlockInvalid (+17)
    • b3:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (a[*A], ~R0[*A], client[*A])
      • v10 (?) = Const64 <int> [1]
      • v11 (26) = NilCheck <void> v9 v8
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (c[*int], ~R0[*int], k[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v23 (?) = ConstInterface <interface {}>
      • v24 (?) = ArrayMake1 <[1]interface {}> v23
      • v31 (?) = Const64 <int> [0] (fmt..autotmp_3[int], fmt.n[int])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v28 (18) = Store <mem> {[1]interface {}} v27 v24 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = PtrIndex <*interface {}> v29 v31
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
      • v36 (18) = IsSliceInBounds <bool> v31 v10
    • If v36b6 b5 (likely) (18)
    • b4:
    • BlockInvalid (+18)
    • b5: ← b3
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v33
    • Exit v38 (18)
    • b6: ← b3
      • v39 (18) = Sub64 <int> v10 v31
      • v40 (18) = SliceMake <[]interface {}> v29 v39 v39 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31
  • name fmt..autotmp_3[int]: v31
  • decompose user [1333 ns]

    pre-opt deadcode [4000 ns]

    • b3:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (a[*A], ~R0[*A], client[*A])
      • v10 (?) = Const64 <int> [1]
      • v11 (26) = NilCheck <void> v9 v8
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (k[*int], ~R0[*int], c[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v23 (?) = ConstInterface <interface {}>
      • v24 (?) = ArrayMake1 <[1]interface {}> v23
      • v31 (?) = Const64 <int> [0] (fmt.n[int], fmt..autotmp_3[int])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v28 (18) = Store <mem> {[1]interface {}} v27 v24 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = PtrIndex <*interface {}> v29 v31
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
      • v36 (18) = IsSliceInBounds <bool> v31 v10
    • If v36b6 b5 (likely) (18)
    • b5: ← b3
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v33
    • Exit v38 (18)
    • b6: ← b3
      • v39 (18) = Sub64 <int> v10 v31
      • v40 (18) = SliceMake <[]interface {}> v29 v39 v39 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31
  • name fmt..autotmp_3[int]: v31
  • opt [28083 ns]

    • b3:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (~R0[*A], client[*A], a[*A])
      • v10 (?) = Const64 <int> [1]
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v31 (?) = Const64 <int> [0] (fmt.n[int], fmt..autotmp_3[int])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v23 (?) = IMake <interface {}> v54 v37
      • v28 (18) = Store <mem> {interface {}} v27 v23 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
    • Firstb6 b5 (likely) (18)
    • b5: ← b3
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v33
    • Exit v38 (18)
    • b6: ← b3
      • v39 (18) = Const64 <int> [1]
      • v40 (18) = SliceMake <[]interface {}> v29 v39 v39 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31
  • name fmt..autotmp_3[int]: v31
  • zero arg cse [4334 ns]

    • b3:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (a[*A], ~R0[*A], client[*A])
      • v10 (?) = Const64 <int> [1]
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (k[*int], ~R0[*int], c[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v31 (?) = Const64 <int> [0] (fmt..autotmp_3[int], fmt.n[int])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v23 (?) = IMake <interface {}> v54 v37
      • v28 (18) = Store <mem> {interface {}} v27 v23 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
    • Firstb6 b5 (likely) (18)
    • b5: ← b3
      • v38 (18) = PanicBounds <mem> [6] v31 v10 v33
    • Exit v38 (18)
    • b6: ← b3
      • v39 (18) = Const64 <int> [1]
      • v40 (18) = SliceMake <[]interface {}> v29 v10 v10 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • name fmt.n[int]: v31
  • name fmt..autotmp_3[int]: v31
  • opt deadcode [4000 ns]

    • b3:
      • v1 (?) = InitMem <mem>
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v8 (26) = SelectN <mem> [1] v7
      • v9 (26) = SelectN <*A> [0] v7 (a[*A], ~R0[*A], client[*A])
      • v10 (?) = Const64 <int> [1]
      • v12 (26) = OffPtr <*int> [0] v9
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v23 (?) = IMake <interface {}> v54 v37
      • v28 (18) = Store <mem> {interface {}} v27 v23 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v30 (+18) = NilCheck <void> v29 v28
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v33 (18) = Store <mem> {interface {}} v32 v22 v28
      • v34 (18) = NilCheck <void> v29 v33
    • Plainb6 (18)
    • b6: ← b3
      • v40 (18) = SliceMake <[]interface {}> v29 v10 v10 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • generic cse [12750 ns]

    phiopt [250 ns]

    gcse deadcode [2417 ns]

    nilcheckelim [6041 ns]

    • b3:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1]
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v9 (26) = SelectN <*A> [0] v7 (~R0[*A], client[*A], a[*A])
      • v12 (26) = OffPtr <*int> [0] v9
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v8 (26) = SelectN <mem> [1] v7
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v23 (?) = IMake <interface {}> v54 v37
      • v28 (18) = Store <mem> {interface {}} v27 v23 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v33 (+18) = Store <mem> {interface {}} v32 v22 v28
    • Plainb6 (18)
    • b6: ← b3
      • v40 (18) = SliceMake <[]interface {}> v29 v10 v10 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • prove [8250 ns]

    • b3:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1]
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v9 (26) = SelectN <*A> [0] v7 (~R0[*A], client[*A], a[*A])
      • v12 (26) = OffPtr <*int> [0] v9
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v8 (26) = SelectN <mem> [1] v7
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v34 (?) = Const64 <int64> [0]
      • v23 (?) = IMake <interface {}> v54 v37
      • v28 (18) = Store <mem> {interface {}} v27 v23 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v33 (+18) = Store <mem> {interface {}} v32 v22 v28
    • Plainb6 (18)
    • b6: ← b3
      • v40 (18) = SliceMake <[]interface {}> v29 v10 v10 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • early fuse [959 ns]

    • b3:
    • BlockInvalid (18)
    • b6:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1]
      • v15 (?) = ConstNil <*int> (c[*int], ~R0[*int], k[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v9 (26) = SelectN <*A> [0] v7 (a[*A], ~R0[*A], client[*A])
      • v12 (26) = OffPtr <*int> [0] v9
      • v22 (18) = IMake <interface {}> v21 v9 (~arg0[interface {}])
      • v8 (26) = SelectN <mem> [1] v7
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v34 (?) = Const64 <int64> [0]
      • v23 (?) = IMake <interface {}> v54 v37
      • v28 (18) = Store <mem> {interface {}} v27 v23 v26
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v33 (+18) = Store <mem> {interface {}} v32 v22 v28
      • v40 (18) = SliceMake <[]interface {}> v29 v10 v10 (fmt.a[[]interface {}])
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0[interface {}]: v22
  • name fmt.a[[]interface {}]: v40
  • decompose builtin [13833 ns]

    • b3:
    • BlockInvalid (18)
    • b6:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1] (a.cap[int], a.len[int])
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v7 (+26) = StaticLECall <*A,mem> {AuxCall{runtime.newobject}} [24] v6 v1
      • v9 (26) = SelectN <*A> [0] v7 (~R0[*A], client[*A], a[*A], ~arg0.data[*uint8])
      • v12 (26) = OffPtr <*int> [0] v9
      • v22 (18) = IMake <interface {}> v21 v9
      • v8 (26) = SelectN <mem> [1] v7
      • v13 (26) = Store <mem> {int} v12 v10 v8
      • v17 (+13) = NilCheck <void> v15 v13
      • v18 (13) = Store <mem> {int} v15 v10 v13
      • v26 (18) = VarDef <mem> {.autotmp_17} v18
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v34 (?) = Const64 <int64> [0]
      • v30 (18) = OffPtr <**uint8> [8] v27
      • v39 (18) = Store <mem> {uintptr} v27 v54 v26
      • v23 (?) = IMake <interface {}> v54 v37
      • v28 (18) = Store <mem> {*uint8} v30 v37 v39
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v28 (a.ptr[*interface {}])
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v40 (18) = SliceMake <[]interface {}> v29 v10 v10
      • v38 (+18) = OffPtr <**uint8> [8] v32
      • v31 (+18) = Store <mem> {uintptr} v32 v21 v28
      • v33 (+18) = Store <mem> {*uint8} v38 v9 v31
      • v43 (18) = InlMark <void> [2] v33
      • v46 (+274) = Load <*os.File> v45 v33
      • v47 (274) = IMake <io.Writer> v44 v46
      • v48 (274) = StaticLECall <int,error,mem> {AuxCall{fmt.Fprintln}} [64] v47 v40 v33
      • v49 (274) = SelectN <mem> [2] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • expand calls [21250 ns]

    • b3:
    • BlockInvalid (18)
    • b6:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1] (a.cap[int], a.len[int])
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v13 (26) = OpInvalid <mem>
      • v18 (13) = OpInvalid <mem>
      • v28 (18) = OpInvalid <mem>
      • v33 (+18) = OpInvalid <mem>
      • v34 (?) = Const64 <int64> [0]
      • v40 (18) = OpInvalid <[]interface {}>
      • v47 (274) = OpInvalid <io.Writer>
      • v39 (18) = OpInvalid <mem>
      • v31 (+18) = OpInvalid <mem>
      • v51 (?) = OffPtr <**uint8> [8] v2
      • v52 (26) = OpInvalid <mem>
      • v36 (?) = OffPtr <*uintptr> [8] v2
      • v24 (274) = OpInvalid <mem>
      • v11 (?) = OffPtr <**uint8> [16] v2
      • v50 (274) = OpInvalid <mem>
      • v42 (?) = OffPtr <**uint8> [24] v2
      • v35 (274) = OpInvalid <mem>
      • v25 (?) = OffPtr <*int> [32] v2
      • v20 (274) = OpInvalid <mem>
      • v19 (?) = OffPtr <*int> [40] v2
      • v16 (274) = OpInvalid <mem>
      • v58 (26) = Store <mem> {*uint8} v51 v6 v1
      • v64 (?) = OffPtr <**A> [16] v2
      • v23 (?) = IMake <interface {}> v54 v37
      • v7 (+26) = StaticCall <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v9 (26) = Load <*A> v64 v8 (a[*A], ~arg0.data[*uint8], client[*A], ~R0[*A])
      • v12 (26) = OffPtr <*int> [0] v9
      • v22 (18) = IMake <interface {}> v21 v9
      • v14 (26) = Store <mem> {int} v12 v10 v8
      • v41 (13) = Store <mem> {int} v15 v10 v14
      • v17 (+13) = NilCheck <void> v15 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v30 (18) = OffPtr <**uint8> [8] v27
      • v56 (18) = Store <mem> {uintptr} v27 v54 v26
      • v4 (18) = Store <mem> {*uint8} v30 v37 v56
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v4 (a.ptr[*interface {}])
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v38 (+18) = OffPtr <**uint8> [8] v32
      • v57 (+18) = Store <mem> {uintptr} v32 v21 v4
      • v55 (+18) = Store <mem> {*uint8} v38 v9 v57
      • v59 (274) = Store <mem> {uintptr} v36 v44 v55
      • v43 (18) = InlMark <void> [2] v55
      • v46 (+274) = Load <*os.File> v45 v55
      • v60 (274) = Store <mem> {*uint8} v11 v46 v59
      • v61 (274) = Store <mem> {*uint8} v42 v29 v60
      • v62 (274) = Store <mem> {int} v25 v10 v61
      • v63 (274) = Store <mem> {int} v19 v10 v62
      • v48 (274) = StaticCall <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • softfloat [208 ns]

    late opt [7792 ns]

    • b3:
    • BlockInvalid (18)
    • b6:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1] (a.len[int], a.cap[int])
      • v15 (?) = ConstNil <*int> (~R0[*int], k[*int], c[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v51 (?) = OffPtr <**uint8> [8] v2
      • v36 (?) = OffPtr <*uintptr> [8] v2
      • v11 (?) = OffPtr <**uint8> [16] v2
      • v42 (?) = OffPtr <**uint8> [24] v2
      • v25 (?) = OffPtr <*int> [32] v2
      • v19 (?) = OffPtr <*int> [40] v2
      • v58 (26) = Store <mem> {*uint8} v51 v6 v1
      • v64 (?) = OffPtr <**A> [16] v2
      • v7 (+26) = StaticCall <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v9 (26) = Load <*A> v64 v8 (~arg0.data[*uint8], a[*A], ~R0[*A], client[*A])
      • v12 (26) = OffPtr <*int> [0] v9
      • v14 (26) = Store <mem> {int} v12 v10 v8
      • v41 (13) = Store <mem> {int} v15 v10 v14
      • v17 (+13) = NilCheck <void> v15 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v30 (18) = OffPtr <**uint8> [8] v27
      • v56 (18) = Store <mem> {uintptr} v27 v54 v26
      • v4 (18) = Store <mem> {*uint8} v30 v37 v56
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v4 (a.ptr[*interface {}])
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v38 (18) = OffPtr <**uint8> [8] v29
      • v57 (+18) = Store <mem> {uintptr} v32 v21 v4
      • v55 (+18) = Store <mem> {*uint8} v38 v9 v57
      • v59 (274) = Store <mem> {uintptr} v36 v44 v55
      • v43 (+18) = InlMark <void> [2] v55
      • v46 (+274) = Load <*os.File> v45 v55
      • v60 (274) = Store <mem> {*uint8} v11 v46 v59
      • v61 (274) = Store <mem> {*uint8} v42 v29 v60
      • v62 (274) = Store <mem> {int} v25 v10 v61
      • v63 (274) = Store <mem> {int} v19 v10 v62
      • v48 (274) = StaticCall <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • dead auto elim [5708 ns]

    generic deadcode [3875 ns]

    • b6:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1] (a.len[int], a.cap[int])
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v51 (?) = OffPtr <**uint8> [8] v2
      • v36 (?) = OffPtr <*uintptr> [8] v2
      • v11 (?) = OffPtr <**uint8> [16] v2
      • v42 (?) = OffPtr <**uint8> [24] v2
      • v25 (?) = OffPtr <*int> [32] v2
      • v19 (?) = OffPtr <*int> [40] v2
      • v58 (26) = Store <mem> {*uint8} v51 v6 v1
      • v64 (?) = OffPtr <**A> [16] v2
      • v7 (+26) = StaticCall <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v9 (26) = Load <*A> v64 v8 (~arg0.data[*uint8], a[*A], ~R0[*A], client[*A])
      • v12 (26) = OffPtr <*int> [0] v9
      • v14 (26) = Store <mem> {int} v12 v10 v8
      • v41 (13) = Store <mem> {int} v15 v10 v14
      • v17 (+13) = NilCheck <void> v15 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v30 (18) = OffPtr <**uint8> [8] v27
      • v56 (18) = Store <mem> {uintptr} v27 v54 v26
      • v4 (18) = Store <mem> {*uint8} v30 v37 v56
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v4 (a.ptr[*interface {}])
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v38 (18) = OffPtr <**uint8> [8] v29
      • v57 (+18) = Store <mem> {uintptr} v32 v21 v4
      • v55 (+18) = Store <mem> {*uint8} v38 v9 v57
      • v59 (274) = Store <mem> {uintptr} v36 v44 v55
      • v43 (+18) = InlMark <void> [2] v55
      • v46 (+274) = Load <*os.File> v45 v55
      • v60 (274) = Store <mem> {*uint8} v11 v46 v59
      • v61 (274) = Store <mem> {*uint8} v42 v29 v60
      • v62 (274) = Store <mem> {int} v25 v10 v61
      • v63 (274) = Store <mem> {int} v19 v10 v62
      • v48 (274) = StaticCall <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • check bce [208 ns]

    branchelim [1917 ns]

    late fuse [3250 ns]

    • b6:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = Addr <*uint8> {type."".A} v3
      • v10 (?) = Const64 <int> [1] (a.cap[int], a.len[int])
      • v15 (?) = ConstNil <*int> (c[*int], k[*int], ~R0[*int])
      • v21 (?) = Addr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v44 (?) = Addr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = Addr <**os.File> {os.Stdout} v3
      • v54 (?) = ConstNil <uintptr>
      • v37 (?) = ConstNil <*uint8>
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v51 (?) = OffPtr <**uint8> [8] v2
      • v36 (?) = OffPtr <*uintptr> [8] v2
      • v11 (?) = OffPtr <**uint8> [16] v2
      • v42 (?) = OffPtr <**uint8> [24] v2
      • v25 (?) = OffPtr <*int> [32] v2
      • v19 (?) = OffPtr <*int> [40] v2
      • v58 (26) = Store <mem> {*uint8} v51 v6 v1
      • v64 (?) = OffPtr <**A> [16] v2
      • v16 (?) = Const64 <int64> [0]
      • v7 (+26) = StaticCall <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v9 (26) = Load <*A> v64 v8 (~R0[*A], client[*A], a[*A], ~arg0.data[*uint8])
      • v12 (26) = OffPtr <*int> [0] v9
      • v14 (26) = Store <mem> {int} v12 v10 v8
      • v41 (13) = Store <mem> {int} v15 v10 v14
      • v17 (+13) = NilCheck <void> v15 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v27 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v26
      • v30 (18) = OffPtr <**uint8> [8] v27
      • v56 (18) = Store <mem> {uintptr} v27 v54 v26
      • v4 (18) = Store <mem> {*uint8} v30 v37 v56
      • v29 (18) = LocalAddr <*[1]interface {}> {.autotmp_17} v2 v4 (a.ptr[*interface {}])
      • v32 (18) = OffPtr <*interface {}> [0] v29
      • v38 (18) = OffPtr <**uint8> [8] v29
      • v57 (+18) = Store <mem> {uintptr} v32 v21 v4
      • v55 (+18) = Store <mem> {*uint8} v38 v9 v57
      • v59 (274) = Store <mem> {uintptr} v36 v44 v55
      • v43 (+18) = InlMark <void> [2] v55
      • v46 (+274) = Load <*os.File> v45 v55
      • v60 (274) = Store <mem> {*uint8} v11 v46 v59
      • v61 (274) = Store <mem> {*uint8} v42 v29 v60
      • v62 (274) = Store <mem> {int} v25 v10 v61
      • v63 (274) = Store <mem> {int} v19 v10 v62
      • v48 (274) = StaticCall <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • dse [3709 ns]

    writebarrier [3000 ns]

    lower [29875 ns]

    • b6:
      • v2 (?) = SP <uintptr>
      • v3 (?) = SB <uintptr>
      • v6 (?) = MOVDaddr <*uint8> {type."".A} v3
      • v10 (?) = MOVDconst <int> [1] (a.cap[int], a.len[int])
      • v15 (?) = MOVDconst <*int> [0] (k[*int], ~R0[*int], c[*int])
      • v21 (?) = MOVDaddr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v44 (?) = MOVDaddr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = MOVDaddr <**os.File> {os.Stdout} v3
      • v1 (?) = InitMem <mem>
      • v5 (+10) = InlMark <void> [0] v1
      • v29 (18) = MOVDaddr <*[1]interface {}> {.autotmp_17} v2 (a.ptr[*interface {}])
      • v58 (26) = MOVDstore <mem> [8] v2 v6 v1
      • v7 (+26) = CALLstatic <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v9 (26) = MOVDload <*A> [16] v2 v8 (~R0[*A], client[*A], ~arg0.data[*uint8], a[*A])
      • v14 (26) = MOVDstore <mem> v9 v10 v8
      • v41 (13) = MOVDstore <mem> v15 v10 v14
      • v17 (+13) = LoweredNilCheck <void> v15 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v4 (18) = MOVQstorezero <mem> {.autotmp_17} v2 v26
      • v57 (+18) = MOVDstore <mem> {.autotmp_17} v2 v21 v4
      • v55 (+18) = MOVDstore <mem> {.autotmp_17} [8] v2 v9 v57
      • v59 (274) = MOVDstore <mem> [8] v2 v44 v55
      • v43 (+18) = InlMark <void> [2] v55
      • v46 (+274) = MOVDload <*os.File> v45 v55
      • v60 (274) = MOVDstore <mem> [16] v2 v46 v59
      • v61 (274) = MOVDstore <mem> [24] v2 v29 v60
      • v62 (274) = MOVDstore <mem> [32] v2 v10 v61
      • v63 (274) = MOVDstore <mem> [40] v2 v10 v62
      • v48 (274) = CALLstatic <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • addressing modes [250 ns]

    lowered deadcode for cse [3708 ns]

    lowered cse [4291 ns]

    elim unread autos [750 ns]

    tighten tuple selectors [2125 ns]

    lowered deadcode [2709 ns]

    checkLower [375 ns]

    late phielim [458 ns]

    late copyelim [500 ns]

    tighten [5542 ns]

    late deadcode [2250 ns]

    critical [250 ns]

    phi tighten [125 ns]

    likelyadjust [417 ns]

    layout [709 ns]

    schedule [8875 ns]

    • b6:
      • v1 (?) = InitMem <mem>
      • v3 (?) = SB <uintptr>
      • v6 (?) = MOVDaddr <*uint8> {type."".A} v3
      • v2 (?) = SP <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v58 (26) = MOVDstore <mem> [8] v2 v6 v1
      • v7 (+26) = CALLstatic <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v10 (?) = MOVDconst <int> [1] (a.len[int], a.cap[int])
      • v9 (26) = MOVDload <*A> [16] v2 v8 (a[*A], ~arg0.data[*uint8], ~R0[*A], client[*A])
      • v14 (26) = MOVDstore <mem> v9 v10 v8
      • v15 (?) = MOVDconst <*int> [0] (c[*int], k[*int], ~R0[*int])
      • v17 (+13) = LoweredNilCheck <void> v15 v14
      • v41 (13) = MOVDstore <mem> v15 v10 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v4 (18) = MOVQstorezero <mem> {.autotmp_17} v2 v26
      • v21 (?) = MOVDaddr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v57 (+18) = MOVDstore <mem> {.autotmp_17} v2 v21 v4
      • v55 (+18) = MOVDstore <mem> {.autotmp_17} [8] v2 v9 v57
      • v44 (?) = MOVDaddr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = MOVDaddr <**os.File> {os.Stdout} v3
      • v43 (+18) = InlMark <void> [2] v55
      • v46 (+274) = MOVDload <*os.File> v45 v55
      • v59 (274) = MOVDstore <mem> [8] v2 v44 v55
      • v60 (274) = MOVDstore <mem> [16] v2 v46 v59
      • v29 (18) = MOVDaddr <*[1]interface {}> {.autotmp_17} v2 (a.ptr[*interface {}])
      • v61 (274) = MOVDstore <mem> [24] v2 v29 v60
      • v62 (274) = MOVDstore <mem> [32] v2 v10 v61
      • v63 (274) = MOVDstore <mem> [40] v2 v10 v62
      • v48 (274) = CALLstatic <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • late nilcheck [2542 ns]

    • b6:
      • v1 (?) = InitMem <mem>
      • v3 (?) = SB <uintptr>
      • v6 (?) = MOVDaddr <*uint8> {type."".A} v3
      • v2 (?) = SP <uintptr>
      • v5 (+10) = InlMark <void> [0] v1
      • v58 (26) = MOVDstore <mem> [8] v2 v6 v1
      • v7 (+26) = CALLstatic <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v10 (?) = MOVDconst <int> [1] (a.len[int], a.cap[int])
      • v9 (26) = MOVDload <*A> [16] v2 v8 (~R0[*A], client[*A], ~arg0.data[*uint8], a[*A])
      • v14 (26) = MOVDstore <mem> v9 v10 v8
      • v15 (?) = MOVDconst <*int> [0] (c[*int], k[*int], ~R0[*int])
      • v41 (+13) = MOVDstore <mem> v15 v10 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v4 (18) = MOVQstorezero <mem> {.autotmp_17} v2 v26
      • v21 (?) = MOVDaddr <*uint8> {type.*"".A} v3 (~arg0.type[uintptr])
      • v57 (+18) = MOVDstore <mem> {.autotmp_17} v2 v21 v4
      • v55 (+18) = MOVDstore <mem> {.autotmp_17} [8] v2 v9 v57
      • v44 (?) = MOVDaddr <*uint8> {go.itab.*os.File,io.Writer} v3
      • v45 (?) = MOVDaddr <**os.File> {os.Stdout} v3
      • v43 (+18) = InlMark <void> [2] v55
      • v46 (+274) = MOVDload <*os.File> v45 v55
      • v59 (274) = MOVDstore <mem> [8] v2 v44 v55
      • v60 (274) = MOVDstore <mem> [16] v2 v46 v59
      • v29 (18) = MOVDaddr <*[1]interface {}> {.autotmp_17} v2 (a.ptr[*interface {}])
      • v61 (274) = MOVDstore <mem> [24] v2 v29 v60
      • v62 (274) = MOVDstore <mem> [32] v2 v10 v61
      • v63 (274) = MOVDstore <mem> [40] v2 v10 v62
      • v48 (274) = CALLstatic <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • flagalloc [3291 ns]

    regalloc [28916 ns]

    • b6:
      • v1 (?) = InitMem <mem>
      • v3 (?) = SB <uintptr> : SB
      • v2 (?) = SP <uintptr> : SP
      • v5 (+10) = InlMark <void> [0] v1
      • v16 (26) = MOVDaddr <*uint8> {type."".A} v3 : R0
      • v58 (26) = MOVDstore <mem> [8] v2 v16 v1
      • v7 (+26) = CALLstatic <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v9 (26) = MOVDload <*A> [16] v2 v8 : R0 (~R0[*A], client[*A], ~arg0.data[*uint8], a[*A])
      • v64 (26) = MOVDconst <int> [1] : R1
      • v14 (26) = MOVDstore <mem> v9 v64 v8
      • v56 (13) = MOVDconst <*int> [0] : R2
      • v41 (+13) = MOVDstore <mem> v56 v64 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v4 (18) = MOVQstorezero <mem> {.autotmp_17} v2 v26
      • v19 (18) = MOVDaddr <*uint8> {type.*"".A} v3 : R2
      • v57 (+18) = MOVDstore <mem> {.autotmp_17} v2 v19 v4
      • v55 (+18) = MOVDstore <mem> {.autotmp_17} [8] v2 v9 v57
      • v43 (+18) = InlMark <void> [2] v55
      • v25 (274) = MOVDaddr <**os.File> {os.Stdout} v3 : R0
      • v46 (+274) = MOVDload <*os.File> v25 v55 : R0
      • v42 (274) = MOVDaddr <*uint8> {go.itab.*os.File,io.Writer} v3 : R2
      • v59 (274) = MOVDstore <mem> [8] v2 v42 v55
      • v60 (274) = MOVDstore <mem> [16] v2 v46 v59
      • v11 (274) = MOVDaddr <*[1]interface {}> {.autotmp_17} v2 : R0
      • v61 (274) = MOVDstore <mem> [24] v2 v11 v60
      • v62 (274) = MOVDstore <mem> [32] v2 v64 v61
      • v63 (274) = MOVDstore <mem> [40] v2 v64 v62
      • v48 (274) = CALLstatic <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • loop rotate [1125 ns]

    stackframe [6459 ns]

    trim [334 ns]

    • b6:
      • v1 (?) = InitMem <mem>
      • v3 (?) = SB <uintptr> : SB
      • v2 (?) = SP <uintptr> : SP
      • v5 (+10) = InlMark <void> [0] v1
      • v16 (26) = MOVDaddr <*uint8> {type."".A} v3 : R0
      • v58 (26) = MOVDstore <mem> [8] v2 v16 v1
      • v7 (+26) = CALLstatic <mem> {AuxCall{runtime.newobject}} [24] v58
      • v8 (26) = SelectN <mem> [0] v7
      • v9 (26) = MOVDload <*A> [16] v2 v8 : R0 (~R0[*A], client[*A], a[*A], ~arg0.data[*uint8])
      • v64 (26) = MOVDconst <int> [1] : R1
      • v14 (26) = MOVDstore <mem> v9 v64 v8
      • v56 (13) = MOVDconst <*int> [0] : R2
      • v41 (+13) = MOVDstore <mem> v56 v64 v14
      • v26 (18) = VarDef <mem> {.autotmp_17} v41
      • v4 (18) = MOVQstorezero <mem> {.autotmp_17} v2 v26
      • v19 (18) = MOVDaddr <*uint8> {type.*"".A} v3 : R2
      • v57 (+18) = MOVDstore <mem> {.autotmp_17} v2 v19 v4
      • v55 (+18) = MOVDstore <mem> {.autotmp_17} [8] v2 v9 v57
      • v43 (+18) = InlMark <void> [2] v55
      • v25 (274) = MOVDaddr <**os.File> {os.Stdout} v3 : R0
      • v46 (+274) = MOVDload <*os.File> v25 v55 : R0
      • v42 (274) = MOVDaddr <*uint8> {go.itab.*os.File,io.Writer} v3 : R2
      • v59 (274) = MOVDstore <mem> [8] v2 v42 v55
      • v60 (274) = MOVDstore <mem> [16] v2 v46 v59
      • v11 (274) = MOVDaddr <*[1]interface {}> {.autotmp_17} v2 : R0
      • v61 (274) = MOVDstore <mem> [24] v2 v11 v60
      • v62 (274) = MOVDstore <mem> [32] v2 v64 v61
      • v63 (274) = MOVDstore <mem> [40] v2 v64 v62
      • v48 (274) = CALLstatic <mem> {AuxCall{fmt.Fprintln}} [64] v63
      • v49 (274) = SelectN <mem> [0] v48
      • v53 (+19) = MakeResult <mem> v49
    • Ret v53 (19)
  • name ~R0[*A]: v9
  • name client[*A]: v9
  • name k[*int]: v15
  • name a[*A]: v9
  • name c[*int]: v15
  • name ~R0[*int]: v15
  • name ~arg0.type[uintptr]: v21
  • name ~arg0.data[*uint8]: v9
  • name a.ptr[*interface {}]: v29
  • name a.len[int]: v10
  • name a.cap[int]: v10
  • genssa

    # /Users/kcjia/Developer/GoPath/src/test/main.go
    00000 (9) TEXT "".main(SB), ABIInternal
    00001 (9) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
    00002 (9) FUNCDATA $1, gclocals·f207267fbf96a0178e8758c6e3e0ce28(SB)
    00003 (9) FUNCDATA $2, "".main.stkobj(SB)
    v5
    00004 (?) NOP
    v16
    00005 (+10) MOVD $type."".A(SB), R0
    v58
    00006 (+26) MOVD R0, 8(RSP)
    v7
    00007 (+26) PCDATA $1, $0
    v7
    00008 (+26) CALL runtime.newobject(SB)
    v9
    00009 (26) MOVD 16(RSP), R0
    v64
    00010 (26) MOVD $1, R1
    v14
    00011 (26) MOVD R1, (R0)
    v56
    00012 (+13) MOVD $0, R2
    v41
    00013 (13) MOVD R1, (R2)
    v4
    00014 (+18) STP (ZR, ZR), ""..autotmp_17-16(RSP)
    v19
    00015 (18) MOVD $type.*"".A(SB), R2
    v57
    00016 (18) MOVD R2, ""..autotmp_17-16(RSP)
    v55
    00017 (18) MOVD R0, ""..autotmp_17-8(RSP)
    v43
    00018 (?) NOP
    # $GOROOT/src/fmt/print.go
    v25
    00019 (+274) MOVD $os.Stdout(SB), R0
    v46
    00020 (274) MOVD (R0), R0
    v42
    00021 (274) MOVD $go.itab.*os.File,io.Writer(SB), R2
    v59
    00022 (274) MOVD R2, 8(RSP)
    v60
    00023 (274) MOVD R0, 16(RSP)
    v11
    00024 (274) MOVD $""..autotmp_17-16(RSP), R0
    v61
    00025 (274) MOVD R0, 24(RSP)
    v62
    00026 (274) MOVD R1, 32(RSP)
    v63
    00027 (274) MOVD R1, 40(RSP)
    v48
    00028 (274) CALL fmt.Fprintln(SB)
    # /Users/kcjia/Developer/GoPath/src/test/main.go
    b6
    00029 (19) RET
    00030 (?) END