1// Copyright 2023 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5// DO NOT EDIT (use 'go test -v -update-expected' instead.) 6// See cmd/compile/internal/inline/inlheur/testdata/props/README.txt 7// for more information on the format of this file. 8// <endfilepreamble> 9package calls 10 11import "os" 12 13// calls.go T_call_in_panic_arg 19 0 1 14// <endpropsdump> 15// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} 16// callsite: calls.go:21:15|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj" 17// <endcallsites> 18// <endfuncpreamble> 19func T_call_in_panic_arg(x int) { 20 if x < G { 21 panic(callee(x)) 22 } 23} 24 25// calls.go T_calls_in_loops 32 0 1 26// <endpropsdump> 27// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null} 28// callsite: calls.go:34:9|0 flagstr "CallSiteInLoop" flagval 1 score -3 mask 4 maskstr "inLoopAdj" 29// callsite: calls.go:37:9|1 flagstr "CallSiteInLoop" flagval 1 score -3 mask 4 maskstr "inLoopAdj" 30// <endcallsites> 31// <endfuncpreamble> 32func T_calls_in_loops(x int, q []string) { 33 for i := 0; i < x; i++ { 34 callee(i) 35 } 36 for _, s := range q { 37 callee(len(s)) 38 } 39} 40 41// calls.go T_calls_in_pseudo_loop 48 0 1 42// <endpropsdump> 43// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null} 44// callsite: calls.go:50:9|0 flagstr "" flagval 0 score 2 mask 0 maskstr "" 45// callsite: calls.go:54:9|1 flagstr "" flagval 0 score 2 mask 0 maskstr "" 46// <endcallsites> 47// <endfuncpreamble> 48func T_calls_in_pseudo_loop(x int, q []string) { 49 for i := 0; i < x; i++ { 50 callee(i) 51 return 52 } 53 for _, s := range q { 54 callee(len(s)) 55 break 56 } 57} 58 59// calls.go T_calls_on_panic_paths 67 0 1 60// <endpropsdump> 61// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null} 62// callsite: calls.go:69:9|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj" 63// callsite: calls.go:73:9|1 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj" 64// callsite: calls.go:77:12|2 flagstr "CallSiteOnPanicPath" flagval 2 score 102 mask 1 maskstr "panicPathAdj" 65// <endcallsites> 66// <endfuncpreamble> 67func T_calls_on_panic_paths(x int, q []string) { 68 if x+G == 101 { 69 callee(x) 70 panic("ouch") 71 } 72 if x < G-101 { 73 callee(x) 74 if len(q) == 0 { 75 G++ 76 } 77 callsexit(x) 78 } 79} 80 81// calls.go T_calls_not_on_panic_paths 93 0 1 82// ParamFlags 83// 0 ParamFeedsIfOrSwitch|ParamMayFeedIfOrSwitch 84// 1 ParamNoInfo 85// <endpropsdump> 86// {"Flags":0,"ParamFlags":[96,0],"ResultFlags":null} 87// callsite: calls.go:103:9|0 flagstr "" flagval 0 score 2 mask 0 maskstr "" 88// callsite: calls.go:112:9|1 flagstr "" flagval 0 score 2 mask 0 maskstr "" 89// callsite: calls.go:115:9|2 flagstr "" flagval 0 score 2 mask 0 maskstr "" 90// callsite: calls.go:119:12|3 flagstr "CallSiteOnPanicPath" flagval 2 score 102 mask 1 maskstr "panicPathAdj" 91// <endcallsites> 92// <endfuncpreamble> 93func T_calls_not_on_panic_paths(x int, q []string) { 94 if x != G { 95 panic("ouch") 96 /* Notes: */ 97 /* - we only look for post-dominating panic/exit, so */ 98 /* this site will on fact not have a panicpath flag */ 99 /* - vet will complain about this site as unreachable */ 100 callee(x) 101 } 102 if x != G { 103 callee(x) 104 if x < 100 { 105 panic("ouch") 106 } 107 } 108 if x+G == 101 { 109 if x < 100 { 110 panic("ouch") 111 } 112 callee(x) 113 } 114 if x < -101 { 115 callee(x) 116 if len(q) == 0 { 117 return 118 } 119 callsexit(x) 120 } 121} 122 123// calls.go init.0 129 0 1 124// <endpropsdump> 125// {"Flags":0,"ParamFlags":null,"ResultFlags":null} 126// callsite: calls.go:130:16|0 flagstr "CallSiteInInitFunc" flagval 4 score 22 mask 2 maskstr "initFuncAdj" 127// <endcallsites> 128// <endfuncpreamble> 129func init() { 130 println(callee(5)) 131} 132 133// calls.go T_pass_inlinable_func_to_param_feeding_indirect_call 140 0 1 134// <endpropsdump> 135// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} 136// callsite: calls.go:141:19|0 flagstr "" flagval 0 score 16 mask 512 maskstr "passInlinableFuncToIndCallAdj" 137// callsite: calls.go:141:19|calls.go:232:10|0 flagstr "" flagval 0 score 2 mask 0 maskstr "" 138// <endcallsites> 139// <endfuncpreamble> 140func T_pass_inlinable_func_to_param_feeding_indirect_call(x int) int { 141 return callsParam(x, callee) 142} 143 144// calls.go T_pass_noninlinable_func_to_param_feeding_indirect_call 150 0 1 145// <endpropsdump> 146// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} 147// callsite: calls.go:153:19|0 flagstr "" flagval 0 score 36 mask 128 maskstr "passFuncToIndCallAdj" 148// <endcallsites> 149// <endfuncpreamble> 150func T_pass_noninlinable_func_to_param_feeding_indirect_call(x int) int { 151 // if we inline callsParam we can convert the indirect call 152 // to a direct call, but we can't inline it. 153 return callsParam(x, calleeNoInline) 154} 155 156// calls.go T_pass_inlinable_func_to_param_feeding_nested_indirect_call 165 0 1 157// ParamFlags 158// 0 ParamFeedsIfOrSwitch 159// <endpropsdump> 160// {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]} 161// callsite: calls.go:166:25|0 flagstr "" flagval 0 score 27 mask 1024 maskstr "passInlinableFuncToNestedIndCallAdj" 162// callsite: calls.go:166:25|calls.go:237:11|0 flagstr "" flagval 0 score 2 mask 0 maskstr "" 163// <endcallsites> 164// <endfuncpreamble> 165func T_pass_inlinable_func_to_param_feeding_nested_indirect_call(x int) int { 166 return callsParamNested(x, callee) 167} 168 169// calls.go T_pass_noninlinable_func_to_param_feeding_nested_indirect_call 177 0 1 170// ParamFlags 171// 0 ParamFeedsIfOrSwitch 172// <endpropsdump> 173// {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]} 174// callsite: calls.go:178:25|0 flagstr "" flagval 0 score 47 mask 256 maskstr "passFuncToNestedIndCallAdj" 175// <endcallsites> 176// <endfuncpreamble> 177func T_pass_noninlinable_func_to_param_feeding_nested_indirect_call(x int) int { 178 return callsParamNested(x, calleeNoInline) 179} 180 181// calls.go T_call_scoring_in_noninlinable_func 195 0 1 182// <endpropsdump> 183// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[0]} 184// callsite: calls.go:209:14|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj" 185// callsite: calls.go:210:15|1 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj" 186// callsite: calls.go:212:19|2 flagstr "" flagval 0 score 16 mask 512 maskstr "passInlinableFuncToIndCallAdj" 187// callsite: calls.go:212:19|calls.go:232:10|0 flagstr "" flagval 0 score 4 mask 0 maskstr "" 188// <endcallsites> 189// <endfuncpreamble> 190// calls.go T_call_scoring_in_noninlinable_func.func1 212 0 1 191// <endpropsdump> 192// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]} 193// <endcallsites> 194// <endfuncpreamble> 195func T_call_scoring_in_noninlinable_func(x int, sl []int) int { 196 if x == 101 { 197 // Drive up the cost of inlining this funcfunc over the 198 // regular threshold. 199 for i := 0; i < 10; i++ { 200 for j := 0; j < i; j++ { 201 sl = append(sl, append(sl, append(sl, append(sl, x)...)...)...) 202 sl = append(sl, sl[0], sl[1], sl[2]) 203 x += calleeNoInline(x) 204 } 205 } 206 } 207 if x < 100 { 208 // make sure this callsite is scored properly 209 G += callee(101) 210 panic(callee(x)) 211 } 212 return callsParam(x, func(y int) int { return y + x }) 213} 214 215var G int 216 217func callee(x int) int { 218 return x 219} 220 221func calleeNoInline(x int) int { 222 defer func() { G++ }() 223 return x 224} 225 226func callsexit(x int) { 227 println(x) 228 os.Exit(x) 229} 230 231func callsParam(x int, f func(int) int) int { 232 return f(x) 233} 234 235func callsParamNested(x int, f func(int) int) int { 236 if x < 0 { 237 return f(x) 238 } 239 return 0 240} 241