]> Cypherpunks.ru repositories - gostls13.git/blob - src/cmd/compile/internal/test/testdata/pgo/devirtualize/mult.pkg/mult.go
cmd/compile: initial function value devirtualization
[gostls13.git] / src / cmd / compile / internal / test / testdata / pgo / devirtualize / mult.pkg / mult.go
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 // WARNING: Please avoid updating this file.
6 // See the warning in ../devirt.go for more details.
7
8 package mult
9
10 var sink int
11
12 type Multiplier interface {
13         Multiply(a, b int) int
14 }
15
16 type Mult struct{}
17
18 func (Mult) Multiply(a, b int) int {
19         for i := 0; i < 1000; i++ {
20                 sink++
21         }
22         return a * b
23 }
24
25 type NegMult struct{}
26
27 func (NegMult) Multiply(a, b int) int {
28         for i := 0; i < 1000; i++ {
29                 sink++
30         }
31         return -1 * a * b
32 }
33
34 // N.B. Different types than AddFunc to test intra-line disambiguation.
35 type MultFunc func(int64, int64) int64
36
37 func MultFn(a, b int64) int64 {
38         return a * b
39 }
40
41 func NegMultFn(a, b int64) int64 {
42         return -1 * a * b
43 }
44
45 //go:noinline
46 func MultClosure() MultFunc {
47         // Explicit closure to differentiate from AddClosure.
48         c := 1
49         return func(a, b int64) int64 {
50                 return a * b * int64(c)
51         }
52 }
53
54 //go:noinline
55 func NegMultClosure() MultFunc {
56         c := 1
57         return func(a, b int64) int64 {
58                 return -1 * a * b * int64(c)
59         }
60 }