| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package dumpscores |
| |
| var G int |
| |
| func inlinable(x int, f func(int) int) int { |
| if x != 0 { |
| return 1 |
| } |
| G += noninl(x) |
| return f(x) |
| } |
| |
| func inlinable2(x int) int { |
| return noninl(-x) |
| } |
| |
| //go:noinline |
| func noninl(x int) int { |
| return x + 1 |
| } |
| |
| func tooLargeToInline(x int) int { |
| if x > 101 { |
| // Drive up the cost of inlining this func over the |
| // regular threshold. |
| return big(big(big(big(big(G + x))))) |
| } |
| if x < 100 { |
| // make sure this callsite is scored properly |
| G += inlinable(101, inlinable2) |
| if G == 101 { |
| return 0 |
| } |
| panic(inlinable2(3)) |
| } |
| return G |
| } |
| |
| func big(q int) int { |
| return noninl(q) + noninl(-q) |
| } |