github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/inline/inlheur/testdata/props/calls.go (about)

     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 github.com/go-asm/go/cmd/compile/inline/inlheur/testdata/props/README.txt
     7  // for more information on the format of this file.
     8  // <endfilepreamble>
     9  package calls
    10  
    11  import "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>
    19  func 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>
    32  func 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>
    48  func 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>
    67  func 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>
    93  func 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>
   129  func 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>
   140  func 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>
   150  func 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>
   165  func 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>
   177  func 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>
   195  func 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  
   215  var G int
   216  
   217  func callee(x int) int {
   218  	return x
   219  }
   220  
   221  func calleeNoInline(x int) int {
   222  	defer func() { G++ }()
   223  	return x
   224  }
   225  
   226  func callsexit(x int) {
   227  	println(x)
   228  	os.Exit(x)
   229  }
   230  
   231  func callsParam(x int, f func(int) int) int {
   232  	return f(x)
   233  }
   234  
   235  func callsParamNested(x int, f func(int) int) int {
   236  	if x < 0 {
   237  		return f(x)
   238  	}
   239  	return 0
   240  }