]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/cmd/compile/internal/inline/inlheur/testdata/props/calls.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / src / cmd / compile / internal / inline / inlheur / testdata / props / calls.go
index 3e1a91dc26763d6ea18a22dd920bda361b7df275..b1499dbf248854f26f91811dba3c7e49a3e615bf 100644 (file)
@@ -13,7 +13,7 @@ import "os"
 // calls.go T_call_in_panic_arg 19 0 1
 // <endpropsdump>
 // {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
-// callsite: calls.go:21:15|0 flagstr "CallSiteOnPanicPath" flagval 2
+// callsite: calls.go:21:15|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
 // <endcallsites>
 // <endfuncpreamble>
 func T_call_in_panic_arg(x int) {
@@ -25,8 +25,8 @@ func T_call_in_panic_arg(x int) {
 // calls.go T_calls_in_loops 32 0 1
 // <endpropsdump>
 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
-// callsite: calls.go:34:9|0 flagstr "CallSiteInLoop" flagval 1
-// callsite: calls.go:37:9|1 flagstr "CallSiteInLoop" flagval 1
+// callsite: calls.go:34:9|0 flagstr "CallSiteInLoop" flagval 1 score -3 mask 4 maskstr "inLoopAdj"
+// callsite: calls.go:37:9|1 flagstr "CallSiteInLoop" flagval 1 score -3 mask 4 maskstr "inLoopAdj"
 // <endcallsites>
 // <endfuncpreamble>
 func T_calls_in_loops(x int, q []string) {
@@ -41,8 +41,8 @@ func T_calls_in_loops(x int, q []string) {
 // calls.go T_calls_in_pseudo_loop 48 0 1
 // <endpropsdump>
 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
-// callsite: calls.go:50:9|0 flagstr "" flagval 0
-// callsite: calls.go:54:9|1 flagstr "" flagval 0
+// callsite: calls.go:50:9|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
+// callsite: calls.go:54:9|1 flagstr "" flagval 0 score 2 mask 0 maskstr ""
 // <endcallsites>
 // <endfuncpreamble>
 func T_calls_in_pseudo_loop(x int, q []string) {
@@ -59,9 +59,9 @@ func T_calls_in_pseudo_loop(x int, q []string) {
 // calls.go T_calls_on_panic_paths 67 0 1
 // <endpropsdump>
 // {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
-// callsite: calls.go:69:9|0 flagstr "" flagval 0
-// callsite: calls.go:73:9|1 flagstr "" flagval 0
-// callsite: calls.go:77:12|2 flagstr "CallSiteOnPanicPath" flagval 2
+// callsite: calls.go:69:9|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
+// callsite: calls.go:73:9|1 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
+// callsite: calls.go:77:12|2 flagstr "CallSiteOnPanicPath" flagval 2 score 102 mask 1 maskstr "panicPathAdj"
 // <endcallsites>
 // <endfuncpreamble>
 func T_calls_on_panic_paths(x int, q []string) {
@@ -84,10 +84,10 @@ func T_calls_on_panic_paths(x int, q []string) {
 //   1 ParamNoInfo
 // <endpropsdump>
 // {"Flags":0,"ParamFlags":[96,0],"ResultFlags":[]}
-// callsite: calls.go:103:9|0 flagstr "" flagval 0
-// callsite: calls.go:112:9|1 flagstr "" flagval 0
-// callsite: calls.go:115:9|2 flagstr "" flagval 0
-// callsite: calls.go:119:12|3 flagstr "" flagval 0
+// callsite: calls.go:103:9|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
+// callsite: calls.go:112:9|1 flagstr "" flagval 0 score 2 mask 0 maskstr ""
+// callsite: calls.go:115:9|2 flagstr "" flagval 0 score 2 mask 0 maskstr ""
+// callsite: calls.go:119:12|3 flagstr "CallSiteOnPanicPath" flagval 2 score 102 mask 1 maskstr "panicPathAdj"
 // <endcallsites>
 // <endfuncpreamble>
 func T_calls_not_on_panic_paths(x int, q []string) {
@@ -123,20 +123,118 @@ func T_calls_not_on_panic_paths(x int, q []string) {
 // calls.go init.0 129 0 1
 // <endpropsdump>
 // {"Flags":0,"ParamFlags":[],"ResultFlags":[]}
-// callsite: calls.go:130:16|0 flagstr "CallSiteInInitFunc" flagval 4
+// callsite: calls.go:130:16|0 flagstr "CallSiteInInitFunc" flagval 4 score 22 mask 2 maskstr "initFuncAdj"
 // <endcallsites>
 // <endfuncpreamble>
 func init() {
        println(callee(5))
 }
 
+// calls.go T_pass_inlinable_func_to_param_feeding_indirect_call 140 0 1
+// <endpropsdump>
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]}
+// callsite: calls.go:141:19|0 flagstr "" flagval 0 score 16 mask 512 maskstr "passInlinableFuncToIndCallAdj"
+// callsite: calls.go:141:19|calls.go:232:10|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
+// <endcallsites>
+// <endfuncpreamble>
+func T_pass_inlinable_func_to_param_feeding_indirect_call(x int) int {
+       return callsParam(x, callee)
+}
+
+// calls.go T_pass_noninlinable_func_to_param_feeding_indirect_call 150 0 1
+// <endpropsdump>
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]}
+// callsite: calls.go:153:19|0 flagstr "" flagval 0 score 36 mask 128 maskstr "passFuncToIndCallAdj"
+// <endcallsites>
+// <endfuncpreamble>
+func T_pass_noninlinable_func_to_param_feeding_indirect_call(x int) int {
+       // if we inline callsParam we can convert the indirect call
+       // to a direct call, but we can't inline it.
+       return callsParam(x, calleeNoInline)
+}
+
+// calls.go T_pass_inlinable_func_to_param_feeding_nested_indirect_call 165 0 1
+// ParamFlags
+//   0 ParamFeedsIfOrSwitch
+// <endpropsdump>
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]}
+// callsite: calls.go:166:25|0 flagstr "" flagval 0 score 27 mask 1024 maskstr "passInlinableFuncToNestedIndCallAdj"
+// callsite: calls.go:166:25|calls.go:237:11|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
+// <endcallsites>
+// <endfuncpreamble>
+func T_pass_inlinable_func_to_param_feeding_nested_indirect_call(x int) int {
+       return callsParamNested(x, callee)
+}
+
+// calls.go T_pass_noninlinable_func_to_param_feeding_nested_indirect_call 177 0 1
+// ParamFlags
+//   0 ParamFeedsIfOrSwitch
+// <endpropsdump>
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]}
+// callsite: calls.go:178:25|0 flagstr "" flagval 0 score 47 mask 256 maskstr "passFuncToNestedIndCallAdj"
+// <endcallsites>
+// <endfuncpreamble>
+func T_pass_noninlinable_func_to_param_feeding_nested_indirect_call(x int) int {
+       return callsParamNested(x, calleeNoInline)
+}
+
+// calls.go T_call_scoring_in_noninlinable_func 195 0 1
+// <endpropsdump>
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[0]}
+// callsite: calls.go:209:14|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
+// callsite: calls.go:210:15|1 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
+// callsite: calls.go:212:19|2 flagstr "" flagval 0 score 16 mask 512 maskstr "passInlinableFuncToIndCallAdj"
+// callsite: calls.go:212:19|calls.go:232:10|0 flagstr "" flagval 0 score 4 mask 0 maskstr ""
+// <endcallsites>
+// <endfuncpreamble>
+// calls.go T_call_scoring_in_noninlinable_func.func1 212 0 1
+// <endpropsdump>
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]}
+// <endcallsites>
+// <endfuncpreamble>
+func T_call_scoring_in_noninlinable_func(x int, sl []int) int {
+       if x == 101 {
+               // Drive up the cost of inlining this funcfunc over the
+               // regular threshold.
+               for i := 0; i < 10; i++ {
+                       for j := 0; j < i; j++ {
+                               sl = append(sl, append(sl, append(sl, append(sl, x)...)...)...)
+                               sl = append(sl, sl[0], sl[1], sl[2])
+                               x += calleeNoInline(x)
+                       }
+               }
+       }
+       if x < 100 {
+               // make sure this callsite is scored properly
+               G += callee(101)
+               panic(callee(x))
+       }
+       return callsParam(x, func(y int) int { return y + x })
+}
+
 var G int
 
 func callee(x int) int {
        return x
 }
 
+func calleeNoInline(x int) int {
+       defer func() { G++ }()
+       return x
+}
+
 func callsexit(x int) {
        println(x)
        os.Exit(x)
 }
+
+func callsParam(x int, f func(int) int) int {
+       return f(x)
+}
+
+func callsParamNested(x int, f func(int) int) int {
+       if x < 0 {
+               return f(x)
+       }
+       return 0
+}