fmt.Fprintf(os.Stderr, "=-= starting analysis of func %v:\n%+v\n",
fn, fn)
}
- ra := makeResultsAnalyzer(fn, canInline, inlineMaxBudget)
- pa := makeParamsAnalyzer(fn)
- ffa := makeFuncFlagsAnalyzer(fn)
- analyzers := []propAnalyzer{ffa, ra, pa}
funcProps := new(FuncProps)
+ ffa := makeFuncFlagsAnalyzer(fn)
+ analyzers := []propAnalyzer{ffa}
+ analyzers = addResultsAnalyzer(fn, canInline, inlineMaxBudget, analyzers, funcProps)
+ analyzers = addParamsAnalyzer(fn, analyzers, funcProps)
runAnalyzersOnFunction(fn, analyzers)
for _, a := range analyzers {
a.setResults(funcProps)
return fn.Dcl[:numParams]
}
-func makeParamsAnalyzer(fn *ir.Func) *paramsAnalyzer {
+// addParamsAnalyzer creates a new paramsAnalyzer helper object for
+// the function fn, appends it to the analyzers list, and returns the
+// new list. If the function in question doesn't have any interesting
+// parameters then the analyzer list is returned unchanged, and the
+// params flags in "fp" are updated accordingly.
+func addParamsAnalyzer(fn *ir.Func, analyzers []propAnalyzer, fp *FuncProps) []propAnalyzer {
+ pa, props := makeParamsAnalyzer(fn)
+ if pa != nil {
+ analyzers = append(analyzers, pa)
+ } else {
+ fp.ParamFlags = props
+ }
+ return analyzers
+}
+
+// makeParamAnalyzer creates a new helper object to analyze parameters
+// of function fn. If the function doesn't have any interesting
+// params, a nil helper is returned along with a set of default param
+// flags for the func.
+func makeParamsAnalyzer(fn *ir.Func) (*paramsAnalyzer, []ParamPropBits) {
params := getParams(fn) // includes receiver if applicable
+ if len(params) == 0 {
+ return nil, nil
+ }
vals := make([]ParamPropBits, len(params))
top := make([]bool, len(params))
+ interestingToAnalyze := false
for i, pn := range params {
if pn == nil {
continue
continue
}
top[i] = true
+ interestingToAnalyze = true
}
if debugTrace&debugTraceParams != 0 {
}
}
- return ¶msAnalyzer{
+ if !interestingToAnalyze {
+ return nil, vals
+ }
+
+ pa := ¶msAnalyzer{
fname: fn.Sym().Name,
values: vals,
params: params,
top: top,
condLevelTracker: new(condLevelTracker),
}
+ return pa, nil
}
func (pa *paramsAnalyzer) setResults(funcProps *FuncProps) {
"os"
)
-// returnsAnalyzer stores state information for the process of
+// resultsAnalyzer stores state information for the process of
// computing flags/properties for the return values of a specific Go
// function, as part of inline heuristics synthesis.
-type returnsAnalyzer struct {
+type resultsAnalyzer struct {
fname string
props []ResultPropBits
values []resultVal
derived bool // see deriveReturnFlagsFromCallee below
}
-func makeResultsAnalyzer(fn *ir.Func, canInline func(*ir.Func), inlineMaxBudget int32) *returnsAnalyzer {
+// addResultsAnalyzer creates a new resultsAnalyzer helper object for
+// the function fn, appends it to the analyzers list, and returns the
+// new list. If the function in question doesn't have any returns (or
+// any interesting returns) then the analyzer list is left as is, and
+// the result flags in "fp" are updated accordingly.
+func addResultsAnalyzer(fn *ir.Func, canInline func(*ir.Func), inlineMaxBudget int32, analyzers []propAnalyzer, fp *FuncProps) []propAnalyzer {
+ ra, props := makeResultsAnalyzer(fn, canInline, inlineMaxBudget)
+ if ra != nil {
+ analyzers = append(analyzers, ra)
+ } else {
+ fp.ResultFlags = props
+ }
+ return analyzers
+}
+
+// makeResultsAnalyzer creates a new helper object to analyze results
+// in function fn. If the function doesn't have any interesting
+// results, a nil helper is returned along with a set of default
+// result flags for the func.
+func makeResultsAnalyzer(fn *ir.Func, canInline func(*ir.Func), inlineMaxBudget int32) (*resultsAnalyzer, []ResultPropBits) {
results := fn.Type().Results()
+ if len(results) == 0 {
+ return nil, nil
+ }
props := make([]ResultPropBits, len(results))
vals := make([]resultVal, len(results))
+ interestingToAnalyze := false
for i := range results {
rt := results[i].Type
if !rt.IsScalar() && !rt.HasNil() {
// existing properties not applicable here (for things
// like structs, arrays, slices, etc).
- props[i] = ResultNoInfo
continue
}
// set the "top" flag (as in "top element of data flow lattice")
// meaning "we have no info yet, but we might later on".
vals[i].top = true
+ interestingToAnalyze = true
+ }
+ if !interestingToAnalyze {
+ return nil, props
}
- return &returnsAnalyzer{
+
+ ra := &resultsAnalyzer{
props: props,
values: vals,
canInline: canInline,
inlineMaxBudget: inlineMaxBudget,
}
+ return ra, nil
}
// setResults transfers the calculated result properties for this
// function to 'funcProps'.
-func (ra *returnsAnalyzer) setResults(funcProps *FuncProps) {
+func (ra *resultsAnalyzer) setResults(funcProps *FuncProps) {
// Promote ResultAlwaysSameFunc to ResultAlwaysSameInlinableFunc
for i := range ra.values {
if ra.props[i] == ResultAlwaysSameFunc && !ra.values[i].derived {
f := ra.values[i].fn.Func
- // If the function being returns is a closure that hasn't
+ // If the function being returned is a closure that hasn't
// yet been checked by CanInline, invoke it now. NB: this
// is hacky, it would be better if things were structured
// so that all closures were visited ahead of time.
}
// HACK: in order to allow for call site score
// adjustments, we used a relaxed inline budget in
- // determining inlinability. Here what we want to know is
- // whether the func in question is likely to be inlined,
- // as opposed to whether it might possibly be inlined if
- // all the right score adjustments happened, so check the
- // cost here as well.
+ // determining inlinability. For the check below, however,
+ // we want to know is whether the func in question is
+ // likely to be inlined, as opposed to whether it might
+ // possibly be inlined if all the right score adjustments
+ // happened, so do a simple check based on the cost.
if f.Inl != nil && f.Inl.Cost <= ra.inlineMaxBudget {
ra.props[i] = ResultAlwaysSameInlinableFunc
}
funcProps.ResultFlags = ra.props
}
-func (ra *returnsAnalyzer) pessimize() {
+func (ra *resultsAnalyzer) pessimize() {
for i := range ra.props {
ra.props[i] = ResultNoInfo
}
}
-func (ra *returnsAnalyzer) nodeVisitPre(n ir.Node) {
+func (ra *resultsAnalyzer) nodeVisitPre(n ir.Node) {
}
-func (ra *returnsAnalyzer) nodeVisitPost(n ir.Node) {
+func (ra *resultsAnalyzer) nodeVisitPost(n ir.Node) {
if len(ra.values) == 0 {
return
}
// applies a dataflow "meet" operation to combine this result with any
// previous result (for the given return slot) that we've already
// processed.
-func (ra *returnsAnalyzer) analyzeResult(ii int, n ir.Node) {
+func (ra *resultsAnalyzer) analyzeResult(ii int, n ir.Node) {
isAllocMem := isAllocatedMem(n)
isConcConvItf := isConcreteConvIface(n)
lit, isConst := isLiteral(n)
// ParamFlags
// 0 ParamFeedsIndirectCall
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[8],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[8],"ResultFlags":null}
// callsite: acrosscall.go:20:12|0 flagstr "" flagval 0 score 60 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// ParamFlags
// 0 ParamMayFeedIndirectCall
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[16],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[16],"ResultFlags":null}
// callsite: acrosscall.go:33:13|0 flagstr "" flagval 0 score 60 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// ParamFlags
// 0 ParamMayFeedIndirectCall
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[16],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[16],"ResultFlags":null}
// callsite: acrosscall.go:46:23|0 flagstr "" flagval 0 score 64 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// callsite: acrosscall.go:58:9|0 flagstr "" flagval 0 score 8 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// ParamFlags
// 0 ParamMayFeedIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[64],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[64],"ResultFlags":null}
// callsite: acrosscall.go:71:10|0 flagstr "" flagval 0 score 8 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// ParamFlags
// 0 ParamMayFeedIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[64],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[64],"ResultFlags":null}
// callsite: acrosscall.go:84:20|0 flagstr "" flagval 0 score 12 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// 0 ParamFeedsIndirectCall|ParamMayFeedIndirectCall
// 1 ParamFeedsIndirectCall
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[24,8],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[24,8],"ResultFlags":null}
// callsite: acrosscall.go:100:23|1 flagstr "" flagval 0 score 64 mask 0 maskstr ""
// callsite: acrosscall.go:101:12|2 flagstr "" flagval 0 score 60 mask 0 maskstr ""
// callsite: acrosscall.go:99:12|0 flagstr "" flagval 0 score 60 mask 0 maskstr ""
// ResultFlags
// 0 ResultAlwaysSameConstant
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[8]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[8]}
// callsite: acrosscall.go:113:24|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// ResultFlags
// 0 ResultIsAllocatedMem
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[2]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[2]}
// callsite: acrosscall.go:125:19|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// ResultFlags
// 0 ResultIsConcreteTypeConvertedToInterface
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[4]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[4]}
// callsite: acrosscall.go:137:19|0 flagstr "" flagval 0 score 7 mask 0 maskstr ""
// <endcallsites>
// <endfuncpreamble>
// calls.go T_call_in_panic_arg 19 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// callsite: calls.go:21:15|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
// <endcallsites>
// <endfuncpreamble>
// calls.go T_calls_in_loops 32 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null}
// 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>
// calls.go T_calls_in_pseudo_loop 48 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null}
// 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>
// calls.go T_calls_on_panic_paths 67 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null}
// 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"
// 0 ParamFeedsIfOrSwitch|ParamMayFeedIfOrSwitch
// 1 ParamNoInfo
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[96,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[96,0],"ResultFlags":null}
// 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 ""
// calls.go init.0 129 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":null}
// callsite: calls.go:130:16|0 flagstr "CallSiteInInitFunc" flagval 4 score 22 mask 2 maskstr "initFuncAdj"
// <endcallsites>
// <endfuncpreamble>
// funcflags.go T_simple 20 0 1
// Flags FuncPropNeverReturns
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":null,"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_simple() {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_nested(x int) {
// funcflags.go T_block1 46 0 1
// Flags FuncPropNeverReturns
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_block1(x int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_block2(x int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_switches1(x int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_switches1a(x int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_switches2(x int) {
// funcflags.go T_switches3 123 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_switches3(x interface{}) {
// funcflags.go T_switches4 138 0 1
// Flags FuncPropNeverReturns
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_switches4(x int) {
// funcflags.go T_recov 157 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_recov(x int) {
// funcflags.go T_forloops1 169 0 1
// Flags FuncPropNeverReturns
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_forloops1(x int) {
// funcflags.go T_forloops2 180 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_forloops2(x int) {
// funcflags.go T_forloops3 195 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_forloops3(x int) {
// funcflags.go T_hasgotos 215 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_hasgotos(x int, y int) {
// 0 ParamMayFeedIfOrSwitch
// 1 ParamNoInfo
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[64,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[64,0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_break_with_label(x int, y int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_callsexit(x int) {
// funcflags.go T_exitinexpr 281 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// callsite: funcflags.go:286:18|0 flagstr "CallSiteOnPanicPath" flagval 2 score 102 mask 1 maskstr "panicPathAdj"
// <endcallsites>
// <endfuncpreamble>
// funcflags.go T_select_noreturn 297 0 1
// Flags FuncPropNeverReturns
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[0,0,0],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[0,0,0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_select_noreturn(chi chan int, chf chan float32, p *int) {
// funcflags.go T_calls_callsexit 334 0 1
// Flags FuncPropNeverReturns
// <endpropsdump>
-// {"Flags":1,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":1,"ParamFlags":[0],"ResultFlags":null}
// callsite: funcflags.go:335:15|0 flagstr "CallSiteOnPanicPath" flagval 2 score 102 mask 1 maskstr "panicPathAdj"
// <endcallsites>
// <endfuncpreamble>
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_simple(x int) {
// 0 ParamMayFeedIfOrSwitch
// 1 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[64,32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[64,32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_nested(x, y int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_pointer(xp *int) {
// 0 ParamFeedsIfOrSwitch
// 1 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32,32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32,32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func (r T) T_feeds_if_simple_method(x int) {
// 2 ParamNoInfo
// 3 ParamNoInfo
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,32,0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,32,0,0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_blanks(_ string, x int, _ bool, _ bool) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_with_copy(x int) {
// params.go T_feeds_if_with_copy_expr 115 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_with_copy_expr(x int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_switch(x int) {
// params.go T_feeds_if_toocomplex 146 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_toocomplex(x int, y int) {
// params.go T_feeds_if_redefined 161 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_redefined(x int) {
// params.go T_feeds_if_redefined2 175 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_redefined2(x int) {
// 0 ParamFeedsIfOrSwitch
// 1 ParamNoInfo
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32,0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_multi_if(x int, y int) {
// params.go T_feeds_if_redefined_indirectwrite 216 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_redefined_indirectwrite(x int) {
// params.go T_feeds_if_redefined_indirectwrite_copy 231 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_redefined_indirectwrite_copy(x int) {
// ParamFlags
// 0 ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[32],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_expr1(x int) {
// params.go T_feeds_if_expr2 262 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_expr2(x int) {
// params.go T_feeds_if_expr3 273 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_expr3(x int) {
// params.go T_feeds_if_maybe_divide_by_zero 299 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_if_maybe_divide_by_zero(x int) {
// ParamFlags
// 0 ParamMayFeedIndirectCall
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[16],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[16],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_indcall(x func()) {
// ParamFlags
// 0 ParamMayFeedIndirectCall|ParamFeedsIfOrSwitch
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[48],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[48],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_indcall_and_if(x func()) {
// ParamFlags
// 0 ParamFeedsIndirectCall
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[8],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[8],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_indcall_with_copy(x func()) {
// ParamFlags
// 0 ParamFeedsInterfaceMethodCall
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[2],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[2],"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_feeds_interface_method_call(i I) {
// ResultFlags
// 0 ResultIsAllocatedMem
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[2]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[2]}
// <endcallsites>
// <endfuncpreamble>
func T_simple_allocmem() *Bar {
// ResultFlags
// 0 ResultAlwaysSameConstant
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[8]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[8]}
// <endcallsites>
// <endfuncpreamble>
func T_return_nil() *Bar {
// ResultFlags
// 0 ResultAlwaysSameInlinableFunc
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[32]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[32]}
// <endcallsites>
// <endfuncpreamble>
func T_return_same_func() func(int) int {
// returns.go T_return_different_funcs 266 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[0]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[0]}
// <endcallsites>
// <endfuncpreamble>
func T_return_different_funcs() func(int) int {
// ResultFlags
// 0 ResultAlwaysSameInlinableFunc
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[32]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[32]}
// <endcallsites>
// <endfuncpreamble>
// returns.go T_return_same_closure.func1 287 0 1
// returns.go T_return_different_closures 312 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[0]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":[0]}
// <endcallsites>
// <endfuncpreamble>
// returns.go T_return_different_closures.func1 313 0 1
// <endfuncpreamble>
// returns.go T_return_noninlinable.func1.1 340 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":null}
// <endcallsites>
// <endfuncpreamble>
func T_return_noninlinable(x int) func(int) int {
// returns2.go T_return_feeds_iface_call 18 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":null}
// callsite: returns2.go:19:13|0 flagstr "" flagval 0 score 1 mask 16384 maskstr "returnFeedsConcreteToInterfaceCallAdj"
// <endcallsites>
// <endfuncpreamble>
// returns2.go T_multi_return_feeds_iface_call 29 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":null,"ResultFlags":null}
// callsite: returns2.go:30:20|0 flagstr "" flagval 0 score 3 mask 16384 maskstr "returnFeedsConcreteToInterfaceCallAdj"
// <endcallsites>
// <endfuncpreamble>
// returns2.go T_returned_inlinable_func_feeds_indirect_call 41 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// callsite: returns2.go:42:18|0 flagstr "" flagval 0 score -51 mask 8200 maskstr "passConstToIfAdj|returnFeedsInlinableFuncToIndCallAdj"
// callsite: returns2.go:44:20|1 flagstr "" flagval 0 score -23 mask 8192 maskstr "returnFeedsInlinableFuncToIndCallAdj"
// <endcallsites>
// returns2.go T_returned_noninlineable_func_feeds_indirect_call 54 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// callsite: returns2.go:55:30|0 flagstr "" flagval 0 score -23 mask 4096 maskstr "returnFeedsFuncToIndCallAdj"
// <endcallsites>
// <endfuncpreamble>
// returns2.go T_multi_return_feeds_indirect_call 65 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0],"ResultFlags":null}
// callsite: returns2.go:66:29|0 flagstr "" flagval 0 score -21 mask 8192 maskstr "returnFeedsInlinableFuncToIndCallAdj"
// <endcallsites>
// <endfuncpreamble>
// returns2.go T_chained_indirect_call 132 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null}
// callsite: returns2.go:135:18|0 flagstr "" flagval 0 score -31 mask 8192 maskstr "returnFeedsInlinableFuncToIndCallAdj"
// <endcallsites>
// <endfuncpreamble>
// returns2.go T_chained_conc_iface_call 144 0 1
// <endpropsdump>
-// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]}
+// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null}
// callsite: returns2.go:148:8|0 flagstr "" flagval 0 score 1 mask 16384 maskstr "returnFeedsConcreteToInterfaceCallAdj"
// <endcallsites>
// <endfuncpreamble>