sources
sources
/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
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
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 Plain → b2 (+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 Plain → b3 (+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 v36 → b4 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])Plain → b6 (+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
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 Plain → b2 (+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 Plain → b3 (+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 v36 → b4 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])Plain → b6 (+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 + early phielim
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 Plain → b2 (+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 Plain → b3 (+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 v36 → b4 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])Plain → b6 (+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
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 Plain → b2 (+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 Plain → b3 (+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 v36 → b4 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])Plain → b6 (+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
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 Plain → b2 (+10 ) b2 : ← b1 - v17 (+13 ) = NilCheck <void> v15 v13 v18 (13) = Store <mem> {int} v15 v10 v13 Plain → b3 (+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 v36 → b4 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 Plain → b6 (+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
short circuit [3458 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> (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 v36 → b6 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
decompose user + pre-opt deadcode
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 v36 → b6 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
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 First → b6 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
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 First → b6 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
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 Plain → b6 (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 + phiopt + gcse deadcode + nilcheckelim
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 Plain → b6 (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
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 Plain → b6 (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
early fuse [959 ns] 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
decompose builtin [13833 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 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
expand calls [21250 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 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 + late opt
softfloat [208 ns] late opt [7792 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> (~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 + generic deadcode
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 + branchelim + late fuse
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 + writebarrier + lower
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 + lowered deadcode for cse + lowered cse + elim unread autos + tighten tuple selectors + lowered deadcode + checkLower + late phielim + late copyelim + tighten + late deadcode + critical + phi tighten + likelyadjust + layout + schedule
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
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 + regalloc
flagalloc [3291 ns] regalloc [28916 ns] b6 :- v1 (?) = InitMem <mem>v3 (?) = SB <uintptr> : SBv2 (?) = SP <uintptr> : SPv5 (+10 ) = InlMark <void> [0] v1 v16 (26 ) = MOVDaddr <*uint8> {type."".A} v3 : R0v58 (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] : R1v14 (26) = MOVDstore <mem> v9 v64 v8 v56 (13 ) = MOVDconst <*int> [0] : R2v41 (+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 : R2v57 (+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 : R0v46 (+274 ) = MOVDload <*os.File> v25 v55 : R0v42 (274 ) = MOVDaddr <*uint8> {go.itab.*os.File,io.Writer} v3 : R2v59 (274 ) = MOVDstore <mem> [8] v2 v42 v55 v60 (274 ) = MOVDstore <mem> [16] v2 v46 v59 v11 (274 ) = MOVDaddr <*[1]interface {}> {.autotmp_17} v2 : R0v61 (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 + stackframe + trim
loop rotate [1125 ns] stackframe [6459 ns] trim [334 ns] b6 :- v1 (?) = InitMem <mem>v3 (?) = SB <uintptr> : SBv2 (?) = SP <uintptr> : SPv5 (+10 ) = InlMark <void> [0] v1 v16 (26 ) = MOVDaddr <*uint8> {type."".A} v3 : R0v58 (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] : R1v14 (26) = MOVDstore <mem> v9 v64 v8 v56 (13 ) = MOVDconst <*int> [0] : R2v41 (+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 : R2v57 (+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 : R0v46 (+274 ) = MOVDload <*os.File> v25 v55 : R0v42 (274 ) = MOVDaddr <*uint8> {go.itab.*os.File,io.Writer} v3 : R2v59 (274 ) = MOVDstore <mem> [8] v2 v42 v55 v60 (274 ) = MOVDstore <mem> [16] v2 v46 v59 v11 (274 ) = MOVDaddr <*[1]interface {}> {.autotmp_17} v2 : R0v61 (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
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