diff --git a/src/cmd/compile/internal/inline/inlheur/analyze.go b/src/cmd/compile/internal/inline/inlheur/analyze.go index d3d6383ba8..727851b6a4 100644 --- a/src/cmd/compile/internal/inline/inlheur/analyze.go +++ b/src/cmd/compile/internal/inline/inlheur/analyze.go @@ -113,11 +113,11 @@ func computeFuncProps(fn *ir.Func, canInline func(*ir.Func), inlineMaxBudget int 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) diff --git a/src/cmd/compile/internal/inline/inlheur/analyze_func_params.go b/src/cmd/compile/internal/inline/inlheur/analyze_func_params.go index f65d8909e0..0faa798eeb 100644 --- a/src/cmd/compile/internal/inline/inlheur/analyze_func_params.go +++ b/src/cmd/compile/internal/inline/inlheur/analyze_func_params.go @@ -29,10 +29,33 @@ func getParams(fn *ir.Func) []*ir.Name { 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 @@ -48,6 +71,7 @@ func makeParamsAnalyzer(fn *ir.Func) *paramsAnalyzer { continue } top[i] = true + interestingToAnalyze = true } if debugTrace&debugTraceParams != 0 { @@ -63,13 +87,18 @@ func makeParamsAnalyzer(fn *ir.Func) *paramsAnalyzer { } } - 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) { diff --git a/src/cmd/compile/internal/inline/inlheur/analyze_func_returns.go b/src/cmd/compile/internal/inline/inlheur/analyze_func_returns.go index 3ee249fa9d..5eac02a37e 100644 --- a/src/cmd/compile/internal/inline/inlheur/analyze_func_returns.go +++ b/src/cmd/compile/internal/inline/inlheur/analyze_func_returns.go @@ -12,10 +12,10 @@ import ( "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 @@ -36,38 +36,66 @@ type resultVal struct { 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 } - return &returnsAnalyzer{ + if !interestingToAnalyze { + return nil, props + } + + 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. @@ -78,11 +106,11 @@ func (ra *returnsAnalyzer) setResults(funcProps *FuncProps) { } // 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 } @@ -91,16 +119,16 @@ func (ra *returnsAnalyzer) setResults(funcProps *FuncProps) { 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 } @@ -153,7 +181,7 @@ func isFuncName(n ir.Node) (*ir.Name, bool, bool) { // 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) diff --git a/src/cmd/compile/internal/inline/inlheur/testdata/props/acrosscall.go b/src/cmd/compile/internal/inline/inlheur/testdata/props/acrosscall.go index 464e47c5e8..9cd4abfaea 100644 --- a/src/cmd/compile/internal/inline/inlheur/testdata/props/acrosscall.go +++ b/src/cmd/compile/internal/inline/inlheur/testdata/props/acrosscall.go @@ -12,7 +12,7 @@ package params // ParamFlags // 0 ParamFeedsIndirectCall // -// {"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 "" // // @@ -24,7 +24,7 @@ func T_feeds_indirect_call_via_call_toplevel(f func(int)) { // ParamFlags // 0 ParamMayFeedIndirectCall // -// {"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 "" // // @@ -38,7 +38,7 @@ func T_feeds_indirect_call_via_call_conditional(f func(int)) { // ParamFlags // 0 ParamMayFeedIndirectCall // -// {"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 "" // // @@ -50,7 +50,7 @@ func T_feeds_conditional_indirect_call_via_call_toplevel(f func(int)) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"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 "" // // @@ -62,7 +62,7 @@ func T_feeds_if_via_call(x int) { // ParamFlags // 0 ParamMayFeedIfOrSwitch // -// {"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 "" // // @@ -76,7 +76,7 @@ func T_feeds_if_via_call_conditional(x int) { // ParamFlags // 0 ParamMayFeedIfOrSwitch // -// {"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 "" // // @@ -89,7 +89,7 @@ func T_feeds_conditional_if_via_call(x int) { // 0 ParamFeedsIndirectCall|ParamMayFeedIndirectCall // 1 ParamFeedsIndirectCall // -// {"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 "" @@ -105,7 +105,7 @@ func T_multifeeds(f1, f2 func(int)) { // ResultFlags // 0 ResultAlwaysSameConstant // -// {"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 "" // // @@ -117,7 +117,7 @@ func T_acrosscall_returnsconstant() int { // ResultFlags // 0 ResultIsAllocatedMem // -// {"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 "" // // @@ -129,7 +129,7 @@ func T_acrosscall_returnsmem() *int { // ResultFlags // 0 ResultIsConcreteTypeConvertedToInterface // -// {"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 "" // // diff --git a/src/cmd/compile/internal/inline/inlheur/testdata/props/calls.go b/src/cmd/compile/internal/inline/inlheur/testdata/props/calls.go index 4efc3c4003..c87e290947 100644 --- a/src/cmd/compile/internal/inline/inlheur/testdata/props/calls.go +++ b/src/cmd/compile/internal/inline/inlheur/testdata/props/calls.go @@ -12,7 +12,7 @@ import "os" // calls.go T_call_in_panic_arg 19 0 1 // -// {"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" // // @@ -24,7 +24,7 @@ func T_call_in_panic_arg(x int) { // calls.go T_calls_in_loops 32 0 1 // -// {"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" // @@ -40,7 +40,7 @@ func T_calls_in_loops(x int, q []string) { // calls.go T_calls_in_pseudo_loop 48 0 1 // -// {"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 "" // @@ -58,7 +58,7 @@ func T_calls_in_pseudo_loop(x int, q []string) { // calls.go T_calls_on_panic_paths 67 0 1 // -// {"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" @@ -83,7 +83,7 @@ func T_calls_on_panic_paths(x int, q []string) { // 0 ParamFeedsIfOrSwitch|ParamMayFeedIfOrSwitch // 1 ParamNoInfo // -// {"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 "" @@ -122,7 +122,7 @@ func T_calls_not_on_panic_paths(x int, q []string) { // calls.go init.0 129 0 1 // -// {"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" // // diff --git a/src/cmd/compile/internal/inline/inlheur/testdata/props/funcflags.go b/src/cmd/compile/internal/inline/inlheur/testdata/props/funcflags.go index 4b9dbc2bb4..f3d74241b4 100644 --- a/src/cmd/compile/internal/inline/inlheur/testdata/props/funcflags.go +++ b/src/cmd/compile/internal/inline/inlheur/testdata/props/funcflags.go @@ -14,7 +14,7 @@ import "os" // funcflags.go T_simple 20 0 1 // Flags FuncPropNeverReturns // -// {"Flags":1,"ParamFlags":[],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":null,"ResultFlags":null} // // func T_simple() { @@ -26,7 +26,7 @@ func T_simple() { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":1,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":[32],"ResultFlags":null} // // func T_nested(x int) { @@ -40,7 +40,7 @@ func T_nested(x int) { // funcflags.go T_block1 46 0 1 // Flags FuncPropNeverReturns // -// {"Flags":1,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":[0],"ResultFlags":null} // // func T_block1(x int) { @@ -54,7 +54,7 @@ func T_block1(x int) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_block2(x int) { @@ -69,7 +69,7 @@ func T_block2(x int) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":1,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":[32],"ResultFlags":null} // // func T_switches1(x int) { @@ -86,7 +86,7 @@ func T_switches1(x int) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_switches1a(x int) { @@ -100,7 +100,7 @@ func T_switches1a(x int) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_switches2(x int) { @@ -117,7 +117,7 @@ func T_switches2(x int) { // funcflags.go T_switches3 123 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_switches3(x interface{}) { @@ -132,7 +132,7 @@ func T_switches3(x interface{}) { // funcflags.go T_switches4 138 0 1 // Flags FuncPropNeverReturns // -// {"Flags":1,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":[0],"ResultFlags":null} // // func T_switches4(x int) { @@ -151,7 +151,7 @@ func T_switches4(x int) { // funcflags.go T_recov 157 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_recov(x int) { @@ -163,7 +163,7 @@ func T_recov(x int) { // funcflags.go T_forloops1 169 0 1 // Flags FuncPropNeverReturns // -// {"Flags":1,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":[0],"ResultFlags":null} // // func T_forloops1(x int) { @@ -174,7 +174,7 @@ func T_forloops1(x int) { // funcflags.go T_forloops2 180 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_forloops2(x int) { @@ -189,7 +189,7 @@ func T_forloops2(x int) { // funcflags.go T_forloops3 195 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_forloops3(x int) { @@ -209,7 +209,7 @@ func T_forloops3(x int) { // funcflags.go T_hasgotos 215 0 1 // -// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null} // // func T_hasgotos(x int, y int) { @@ -240,7 +240,7 @@ func T_hasgotos(x int, y int) { // 0 ParamMayFeedIfOrSwitch // 1 ParamNoInfo // -// {"Flags":0,"ParamFlags":[64,0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[64,0],"ResultFlags":null} // // func T_break_with_label(x int, y int) { @@ -262,7 +262,7 @@ lab1: // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":1,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":[32],"ResultFlags":null} // // func T_callsexit(x int) { @@ -274,7 +274,7 @@ func T_callsexit(x int) { // funcflags.go T_exitinexpr 281 0 1 // -// {"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" // // @@ -291,7 +291,7 @@ func T_exitinexpr(x int) { // funcflags.go T_select_noreturn 297 0 1 // Flags FuncPropNeverReturns // -// {"Flags":1,"ParamFlags":[0,0,0],"ResultFlags":[]} +// {"Flags":1,"ParamFlags":[0,0,0],"ResultFlags":null} // // func T_select_noreturn(chi chan int, chf chan float32, p *int) { @@ -327,7 +327,7 @@ func T_select_mayreturn(chi chan int, chf chan float32, p *int) int { // funcflags.go T_calls_callsexit 334 0 1 // Flags FuncPropNeverReturns // -// {"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" // // diff --git a/src/cmd/compile/internal/inline/inlheur/testdata/props/params.go b/src/cmd/compile/internal/inline/inlheur/testdata/props/params.go index 1d58b930e4..1a3073c25c 100644 --- a/src/cmd/compile/internal/inline/inlheur/testdata/props/params.go +++ b/src/cmd/compile/internal/inline/inlheur/testdata/props/params.go @@ -14,7 +14,7 @@ import "os" // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_feeds_if_simple(x int) { @@ -29,7 +29,7 @@ func T_feeds_if_simple(x int) { // 0 ParamMayFeedIfOrSwitch // 1 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[64,32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[64,32],"ResultFlags":null} // // func T_feeds_if_nested(x, y int) { @@ -45,7 +45,7 @@ func T_feeds_if_nested(x, y int) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_feeds_if_pointer(xp *int) { @@ -60,7 +60,7 @@ func T_feeds_if_pointer(xp *int) { // 0 ParamFeedsIfOrSwitch // 1 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32,32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32,32],"ResultFlags":null} // // func (r T) T_feeds_if_simple_method(x int) { @@ -80,7 +80,7 @@ func (r T) T_feeds_if_simple_method(x int) { // 2 ParamNoInfo // 3 ParamNoInfo // -// {"Flags":0,"ParamFlags":[0,32,0,0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0,32,0,0],"ResultFlags":null} // // func T_feeds_if_blanks(_ string, x int, _ bool, _ bool) { @@ -95,7 +95,7 @@ func T_feeds_if_blanks(_ string, x int, _ bool, _ bool) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_feeds_if_with_copy(x int) { @@ -109,7 +109,7 @@ func T_feeds_if_with_copy(x int) { // params.go T_feeds_if_with_copy_expr 115 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_with_copy_expr(x int) { @@ -125,7 +125,7 @@ func T_feeds_if_with_copy_expr(x int) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_feeds_switch(x int) { @@ -140,7 +140,7 @@ func T_feeds_switch(x int) { // params.go T_feeds_if_toocomplex 146 0 1 // -// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":null} // // func T_feeds_if_toocomplex(x int, y int) { @@ -155,7 +155,7 @@ func T_feeds_if_toocomplex(x int, y int) { // params.go T_feeds_if_redefined 161 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_redefined(x int) { @@ -169,7 +169,7 @@ func T_feeds_if_redefined(x int) { // params.go T_feeds_if_redefined2 175 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_redefined2(x int) { @@ -190,7 +190,7 @@ func T_feeds_if_redefined2(x int) { // 0 ParamFeedsIfOrSwitch // 1 ParamNoInfo // -// {"Flags":0,"ParamFlags":[32,0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32,0],"ResultFlags":null} // // func T_feeds_multi_if(x int, y int) { @@ -210,7 +210,7 @@ func T_feeds_multi_if(x int, y int) { // params.go T_feeds_if_redefined_indirectwrite 216 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_redefined_indirectwrite(x int) { @@ -225,7 +225,7 @@ func T_feeds_if_redefined_indirectwrite(x int) { // params.go T_feeds_if_redefined_indirectwrite_copy 231 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_redefined_indirectwrite_copy(x int) { @@ -245,7 +245,7 @@ func T_feeds_if_redefined_indirectwrite_copy(x int) { // ParamFlags // 0 ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[32],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[32],"ResultFlags":null} // // func T_feeds_if_expr1(x int) { @@ -256,7 +256,7 @@ func T_feeds_if_expr1(x int) { // params.go T_feeds_if_expr2 262 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_expr2(x int) { @@ -267,7 +267,7 @@ func T_feeds_if_expr2(x int) { // params.go T_feeds_if_expr3 273 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_expr3(x int) { @@ -293,7 +293,7 @@ func T_feeds_if_shift_may_panic(x int) *int { // params.go T_feeds_if_maybe_divide_by_zero 299 0 1 // -// {"Flags":0,"ParamFlags":[0],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[0],"ResultFlags":null} // // func T_feeds_if_maybe_divide_by_zero(x int) { @@ -307,7 +307,7 @@ func T_feeds_if_maybe_divide_by_zero(x int) { // ParamFlags // 0 ParamMayFeedIndirectCall // -// {"Flags":0,"ParamFlags":[16],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[16],"ResultFlags":null} // // func T_feeds_indcall(x func()) { @@ -320,7 +320,7 @@ func T_feeds_indcall(x func()) { // ParamFlags // 0 ParamMayFeedIndirectCall|ParamFeedsIfOrSwitch // -// {"Flags":0,"ParamFlags":[48],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[48],"ResultFlags":null} // // func T_feeds_indcall_and_if(x func()) { @@ -333,7 +333,7 @@ func T_feeds_indcall_and_if(x func()) { // ParamFlags // 0 ParamFeedsIndirectCall // -// {"Flags":0,"ParamFlags":[8],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[8],"ResultFlags":null} // // func T_feeds_indcall_with_copy(x func()) { @@ -348,7 +348,7 @@ func T_feeds_indcall_with_copy(x func()) { // ParamFlags // 0 ParamFeedsInterfaceMethodCall // -// {"Flags":0,"ParamFlags":[2],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":[2],"ResultFlags":null} // // func T_feeds_interface_method_call(i I) { diff --git a/src/cmd/compile/internal/inline/inlheur/testdata/props/returns.go b/src/cmd/compile/internal/inline/inlheur/testdata/props/returns.go index ef04516c09..9c68e78cb5 100644 --- a/src/cmd/compile/internal/inline/inlheur/testdata/props/returns.go +++ b/src/cmd/compile/internal/inline/inlheur/testdata/props/returns.go @@ -15,7 +15,7 @@ import "unsafe" // ResultFlags // 0 ResultIsAllocatedMem // -// {"Flags":0,"ParamFlags":[],"ResultFlags":[2]} +// {"Flags":0,"ParamFlags":null,"ResultFlags":[2]} // // func T_simple_allocmem() *Bar { @@ -66,7 +66,7 @@ func T_allocmem_three_returns(x int) []*Bar { // ResultFlags // 0 ResultAlwaysSameConstant // -// {"Flags":0,"ParamFlags":[],"ResultFlags":[8]} +// {"Flags":0,"ParamFlags":null,"ResultFlags":[8]} // // func T_return_nil() *Bar { @@ -247,7 +247,7 @@ func T_return_concrete_type_to_itf_mixed(x, y int) Itf { // ResultFlags // 0 ResultAlwaysSameInlinableFunc // -// {"Flags":0,"ParamFlags":[],"ResultFlags":[32]} +// {"Flags":0,"ParamFlags":null,"ResultFlags":[32]} // // func T_return_same_func() func(int) int { @@ -260,7 +260,7 @@ func T_return_same_func() func(int) int { // returns.go T_return_different_funcs 266 0 1 // -// {"Flags":0,"ParamFlags":[],"ResultFlags":[0]} +// {"Flags":0,"ParamFlags":null,"ResultFlags":[0]} // // func T_return_different_funcs() func(int) int { @@ -275,7 +275,7 @@ func T_return_different_funcs() func(int) int { // ResultFlags // 0 ResultAlwaysSameInlinableFunc // -// {"Flags":0,"ParamFlags":[],"ResultFlags":[32]} +// {"Flags":0,"ParamFlags":null,"ResultFlags":[32]} // // // returns.go T_return_same_closure.func1 287 0 1 @@ -294,7 +294,7 @@ func T_return_same_closure() func(int) int { // returns.go T_return_different_closures 312 0 1 // -// {"Flags":0,"ParamFlags":[],"ResultFlags":[0]} +// {"Flags":0,"ParamFlags":null,"ResultFlags":[0]} // // // returns.go T_return_different_closures.func1 313 0 1 @@ -332,7 +332,7 @@ func T_return_different_closures() func(int) int { // // returns.go T_return_noninlinable.func1.1 340 0 1 // -// {"Flags":0,"ParamFlags":[],"ResultFlags":[]} +// {"Flags":0,"ParamFlags":null,"ResultFlags":null} // // func T_return_noninlinable(x int) func(int) int { diff --git a/src/cmd/compile/internal/inline/inlheur/testdata/props/returns2.go b/src/cmd/compile/internal/inline/inlheur/testdata/props/returns2.go index 1bd23e74fa..7200926fb8 100644 --- a/src/cmd/compile/internal/inline/inlheur/testdata/props/returns2.go +++ b/src/cmd/compile/internal/inline/inlheur/testdata/props/returns2.go @@ -11,7 +11,7 @@ package returns2 // returns2.go T_return_feeds_iface_call 18 0 1 // -// {"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" // // @@ -22,7 +22,7 @@ func T_return_feeds_iface_call() { // returns2.go T_multi_return_feeds_iface_call 29 0 1 // -// {"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" // // @@ -33,7 +33,7 @@ func T_multi_return_feeds_iface_call() { // returns2.go T_returned_inlinable_func_feeds_indirect_call 41 0 1 // -// {"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" // @@ -47,7 +47,7 @@ func T_returned_inlinable_func_feeds_indirect_call(q int) { // returns2.go T_returned_noninlineable_func_feeds_indirect_call 54 0 1 // -// {"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" // // @@ -58,7 +58,7 @@ func T_returned_noninlineable_func_feeds_indirect_call(q int) { // returns2.go T_multi_return_feeds_indirect_call 65 0 1 // -// {"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" // // @@ -125,7 +125,7 @@ func T_two_calls_feed_ifswitch(q int) int { // returns2.go T_chained_indirect_call 132 0 1 // -// {"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" // // @@ -137,7 +137,7 @@ func T_chained_indirect_call(x, y int) { // returns2.go T_chained_conc_iface_call 144 0 1 // -// {"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" // //