sources
sources
/root/main.go
func min(x, y int) int {
if x < y {
return x
}
return y
}
AST
AST buildssa-enter
. AS l(22)
. . NAME-main.~r2 a(true) g(1) l(22) x(16) class(PPARAMOUT) esc(no) int
buildssa-body
. IF l(23) tc(1)
. . LT l(23) tc(1) bool
. . . NAME-main.x a(true) g(2) l(22) x(0) class(PPARAM) esc(no) tc(1) used int
. . . NAME-main.y a(true) g(3) l(22) x(8) class(PPARAM) esc(no) tc(1) used int
. IF-body
. . RETURN l(24) tc(1)
. . RETURN-list
. . . AS l(24) tc(1)
. . . . NAME-main.~r2 a(true) g(1) l(22) x(16) class(PPARAMOUT) esc(no) int
. . . . NAME-main.x a(true) g(2) l(22) x(0) class(PPARAM) esc(no) tc(1) used int
. RETURN l(26) tc(1)
. RETURN-list
. . AS l(26) tc(1)
. . . NAME-main.~r2 a(true) g(1) l(22) x(16) class(PPARAMOUT) esc(no) int
. . . NAME-main.y a(true) g(3) l(22) x(8) class(PPARAM) esc(no) tc(1) used int
buildssa-exit
start
start b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v3 (?) = SB <uintptr>v4 (?) = LocalAddr <*int> {x} v2 v1 v5 (?) = LocalAddr <*int> {y} v2 v1 v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (?) = Const64 <int> [0]v10 (23) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v15 (26 ) = Copy <int> v8 (y[int])v16 (26 ) = Copy <mem> v1 v17 (26 ) = VarDef <mem> {~r2} v16 v18 (26) = Store <mem> {int} v6 v15 v17 Ret v18 (+26 ) b3 : ← b1 - v11 (24 ) = Copy <int> v7 (x[int])v12 (24 ) = Copy <mem> v1 v13 (24 ) = VarDef <mem> {~r2} v12 v14 (24) = Store <mem> {int} v6 v11 v13 Ret v14 (+24 ) name x[int]: v7 v11 name y[int]: v8 v15
number lines
number lines [28800 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v3 (?) = SB <uintptr>v4 (?) = LocalAddr <*int> {x} v2 v1 v5 (?) = LocalAddr <*int> {y} v2 v1 v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (?) = Const64 <int> [0]v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v15 (26 ) = Copy <int> v8 (y[int])v16 (26 ) = Copy <mem> v1 v17 (26 ) = VarDef <mem> {~r2} v16 v18 (+26 ) = Store <mem> {int} v6 v15 v17 Ret v18 (+26 ) b3 : ← b1 - v11 (24 ) = Copy <int> v7 (x[int])v12 (24 ) = Copy <mem> v1 v13 (24 ) = VarDef <mem> {~r2} v12 v14 (+24 ) = Store <mem> {int} v6 v11 v13 Ret v14 (+24 ) name x[int]: v7 v11 name y[int]: v8 v15
early phielim
early phielim [23900 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v3 (?) = SB <uintptr>v4 (?) = LocalAddr <*int> {x} v2 v1 v5 (?) = LocalAddr <*int> {y} v2 v1 v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (?) = Const64 <int> [0]v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v15 (26 ) = Copy <int> v8 (y[int])v16 (26 ) = Copy <mem> v1 v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v11 (24 ) = Copy <int> v7 (x[int])v12 (24 ) = Copy <mem> v1 v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 v11 name y[int]: v8 v15
early copyelim
early copyelim [23800 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v3 (?) = SB <uintptr>v4 (?) = LocalAddr <*int> {x} v2 v1 v5 (?) = LocalAddr <*int> {y} v2 v1 v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (?) = Const64 <int> [0]v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v15 (26 ) = Copy <int> v8 v16 (26 ) = Copy <mem> v1 v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v11 (24 ) = Copy <int> v7 v12 (24 ) = Copy <mem> v1 v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 v7 name y[int]: v8 v8
early deadcode
early deadcode [27500 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
short circuit
short circuit [20800 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
decompose args
decompose args [25000 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
decompose user
decompose user [22100 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
opt
opt [33400 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
zero arg cse
zero arg cse [32700 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
opt deadcode
opt deadcode [39600 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
generic cse
generic cse [45400 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
phiopt
phiopt [24900 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
nilcheckelim
nilcheckelim [28900 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
prove
prove [66400 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 v12 (?) = Const64 <int64> [0]If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
fuse plain
fuse plain [27200 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 v12 (?) = Const64 <int64> [0]If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
decompose builtin
decompose builtin [37600 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 v12 (?) = Const64 <int64> [0]If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
softfloat
softfloat [20800 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 v12 (?) = Const64 <int64> [0]If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
late opt
late opt [33500 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 v12 (?) = Const64 <int64> [0]If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
dead auto elim
dead auto elim [22700 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 v12 (?) = Const64 <int64> [0]If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
generic deadcode
generic deadcode [154800 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
check bce
check bce [25100 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
branchelim
branchelim [21100 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
fuse
fuse [24700 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
dse
dse [26000 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
writebarrier
writebarrier [24300 ns] - +
b1
b1
If
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = LocalAddr <*int> {~r2} v2 v1 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v10 (+23 ) = Less64 <bool> v7 v8 If v10 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = Store <mem> {int} v6 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = Store <mem> {int} v6 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
lower
lower [47000 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = MOVDaddr <*int> {~r2} v2 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v16 (+23 ) = MOVDconst <uint64> [0]v15 (+23 ) = MOVDconst <uint64> [1]v9 (+23 ) = CMP <flags> v7 v8 v10 (+23 ) = MOVDLT <bool> v16 v15 v9 v12 (+23 ) = CMPWconst <flags> [0] v10 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
lowered cse
lowered cse [30500 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = MOVDaddr <*int> {~r2} v2 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v16 (+23 ) = MOVDconst <uint64> [0]v15 (+23 ) = MOVDconst <uint64> [1]v9 (+23 ) = CMP <flags> v7 v8 v10 (+23 ) = MOVDLT <bool> v16 v15 v9 v12 (+23 ) = CMPWconst <flags> [0] v10 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
elim unread autos
elim unread autos [30300 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v6 (?) = MOVDaddr <*int> {~r2} v2 v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v16 (+23 ) = MOVDconst <uint64> [0]v15 (+23 ) = MOVDconst <uint64> [1]v9 (+23 ) = CMP <flags> v7 v8 v10 (+23 ) = MOVDLT <bool> v16 v15 v9 v12 (+23 ) = CMPWconst <flags> [0] v10 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
lowered deadcode
lowered deadcode [43300 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
checkLower
checkLower [21100 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
late phielim
late phielim [25400 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
late copyelim
late copyelim [20400 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
tighten
tighten [39400 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
late deadcode
late deadcode [47500 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
critical
critical [21700 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
phi tighten
phi tighten [20700 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
likelyadjust
likelyadjust [21900 ns] - +
b1
b1
LT
b2
b2
Ret
b1->b2
1
b3
b3
Ret
b1->b3
0
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) name x[int]: v7 name y[int]: v8
layout
layout [24400 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
schedule
schedule [40600 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
late nilcheck
late nilcheck [21200 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
flagalloc
flagalloc [28800 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v7 (22 ) = Arg <int> {x} (x[int])v8 (22 ) = Arg <int> {y} (y[int])v1 (?) = InitMem <mem>v2 (?) = SP <uintptr>v9 (+23 ) = CMP <flags> v7 v8 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v7 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v8 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
regalloc
regalloc [71500 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v7 (22 ) = Arg <int> {x} : x[int] (x[int])v8 (22 ) = Arg <int> {y} : y[int] (y[int])v1 (?) = InitMem <mem>v2 (?) = SP <uintptr> : SPv15 (23 ) = LoadReg <int> v7 : R0v16 (23 ) = LoadReg <int> v8 : R1v9 (+23 ) = CMP <flags> v15 v16 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v15 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v16 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
loop rotate
loop rotate [25200 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v7 (22 ) = Arg <int> {x} : x[int] (x[int])v8 (22 ) = Arg <int> {y} : y[int] (y[int])v1 (?) = InitMem <mem>v2 (?) = SP <uintptr> : SPv15 (23 ) = LoadReg <int> v7 : R0v16 (23 ) = LoadReg <int> v8 : R1v9 (+23 ) = CMP <flags> v15 v16 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v15 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v16 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
stackframe
stackframe [29600 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v7 (22 ) = Arg <int> {x} : x[int] (x[int])v8 (22 ) = Arg <int> {y} : y[int] (y[int])v1 (?) = InitMem <mem>v2 (?) = SP <uintptr> : SPv15 (23 ) = LoadReg <int> v7 : R0v16 (23 ) = LoadReg <int> v8 : R1v9 (+23 ) = CMP <flags> v15 v16 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v15 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v16 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
trim
trim [24700 ns] - +
b1
b1 #0
LT
b3
b3 #1
Ret
b1->b3
0
b2
b2 #2
Ret
b1->b2
1
b3->b2
b1 :- v7 (22 ) = Arg <int> {x} : x[int] (x[int])v8 (22 ) = Arg <int> {y} : y[int] (y[int])v1 (?) = InitMem <mem>v2 (?) = SP <uintptr> : SPv15 (23 ) = LoadReg <int> v7 : R0v16 (23 ) = LoadReg <int> v8 : R1v9 (+23 ) = CMP <flags> v15 v16 LT v9 → b3 b2 (23) b3 : ← b1 - v13 (24 ) = VarDef <mem> {~r2} v1 v14 (+24 ) = MOVDstore <mem> {~r2} v2 v15 v13 Ret v14 (+24 ) b2 : ← b1 - v17 (26 ) = VarDef <mem> {~r2} v1 v18 (+26 ) = MOVDstore <mem> {~r2} v2 v16 v17 Ret v18 (+26 ) name x[int]: v7 name y[int]: v8
genssa
genssa # /root/main.go 00000 (22) TEXT "".min(SB), ABIInternal 00001 (22) FUNCDATA $0, gclocals·2002e13acf59079a1a5782c918894579(SB) 00002 (22) FUNCDATA $1, gclocals·2002e13acf59079a1a5782c918894579(SB) 00003 (22) FUNCDATA $2, gclocals·2002e13acf59079a1a5782c918894579(SB) v15 00004 (+23 ) PCDATA $0, $0 v15 00005 (+23 ) PCDATA $1, $0 v15 00006 (+23 ) MOVD "".x(R15), R0 v16 00007 (23 ) MOVD "".y+8(R15), R1 v9 00008 (23 ) CMP R0, R1 b1 00009 (23 ) BGE 12 v14 00010 (+24 ) MOVD R0, "".~r2+16(R15) b3 00011 (24 ) RET v18 00012 (+26 ) MOVD R1, "".~r2+16(R15) b2 00013 (26 ) RET 00014 (?) END