return0

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

 
 
21
22
23
 
benchmark_test.go
func return0() int {
return 0
}

AST

buildssa-enter
. AS l(21)
. . NAME-benchmark.~r0 a(true) g(1) l(21) x(0) class(PPARAMOUT) esc(no) int
buildssa-body
. RETURN l(22) tc(1)
. RETURN-list
. . AS l(22) tc(1)
. . . NAME-benchmark.~r0 a(true) g(1) l(21) x(0) class(PPARAMOUT) esc(no) int
. . . LITERAL-0 l(22) tc(1) int
buildssa-exit
 

start

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v3 (?) = SB <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

number lines [3775 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v3 (?) = SB <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

early phielim [513 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v3 (?) = SB <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

early copyelim [348 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v3 (?) = SB <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

early deadcode [3406 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

short circuit [694 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

decompose args [1616 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

decompose user [312 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

opt [1732 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

zero arg cse [2945 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

opt deadcode [2047 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

generic cse [5798 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

phiopt [252 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

nilcheckelim [2573 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

prove [4387 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
    • v3 (?) = Const64 <int64> [0]
  • Ret v7 (+22)

fuse plain [461 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
    • v3 (?) = Const64 <int64> [0]
  • Ret v7 (+22)

decompose builtin [1462 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
    • v3 (?) = Const64 <int64> [0]
  • Ret v7 (+22)

softfloat [192 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
    • v3 (?) = Const64 <int64> [0]
  • Ret v7 (+22)

late opt [969 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
    • v3 (?) = Const64 <int64> [0]
  • Ret v7 (+22)

dead auto elim [1114 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
    • v3 (?) = Const64 <int64> [0]
  • Ret v7 (+22)

generic deadcode [2066 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

check bce [179 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

branchelim [724 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

fuse [309 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

dse [2464 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

writebarrier [1033 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LocalAddr <*int> {~r0} v2 v1
    • v5 (?) = Const64 <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = Store <mem> {int} v4 v5 v6
  • Ret v7 (+22)

lower [4577 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LEAQ <*int> {~r0} v2
    • v5 (?) = MOVQconst <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

lowered cse [2036 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LEAQ <*int> {~r0} v2
    • v5 (?) = MOVQconst <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

elim unread autos [425 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v4 (?) = LEAQ <*int> {~r0} v2
    • v5 (?) = MOVQconst <int> [0]
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

lowered deadcode [1668 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

checkLower [353 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

late phielim [273 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

late copyelim [248 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

tighten [3203 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

late deadcode [1112 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

critical [381 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

phi tighten [182 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

likelyadjust [486 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

layout [925 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v2 (?) = SP <uintptr>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

schedule [2875 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v2 (?) = SP <uintptr>
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

late nilcheck [1181 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v2 (?) = SP <uintptr>
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

flagalloc [1307 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v2 (?) = SP <uintptr>
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

regalloc [11186 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v2 (?) = SP <uintptr> : SP
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

loop rotate [288 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v2 (?) = SP <uintptr> : SP
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

stackframe [1228 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v2 (?) = SP <uintptr> : SP
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

trim [359 ns]

  • b1:
    • v1 (?) = InitMem <mem>
    • v6 (22) = VarDef <mem> {~r0} v1
    • v2 (?) = SP <uintptr> : SP
    • v7 (+22) = MOVQstoreconst <mem> {~r0} [val=0,off=0] v2 v6
  • Ret v7 (+22)

genssa

# benchmark_test.go
00000 (21) TEXT "".return0(SB), ABIInternal
00001 (21) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
00002 (21) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
00003 (21) FUNCDATA $2, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
v7
00004 (+22) PCDATA $0, $0
v7
00005 (+22) PCDATA $1, $0
v7
00006 (+22) MOVQ $0, "".~r0(SP)
b1
00007 (22) RET
00008 (?) END