• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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