]> Cypherpunks.ru repositories - gostls13.git/blob - src/cmd/compile/internal/inline/inlheur/dumpscores_test.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / src / cmd / compile / internal / inline / inlheur / dumpscores_test.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 package inlheur
6
7 import (
8         "internal/testenv"
9         "os"
10         "path/filepath"
11         "strings"
12         "testing"
13 )
14
15 func TestDumpCallSiteScoreDump(t *testing.T) {
16         td := t.TempDir()
17         testenv.MustHaveGoBuild(t)
18
19         scenarios := []struct {
20                 name               string
21                 promoted           int
22                 indirectlyPromoted int
23                 demoted            int
24                 unchanged          int
25         }{
26                 {
27                         name:               "dumpscores",
28                         promoted:           1,
29                         indirectlyPromoted: 1,
30                         demoted:            1,
31                         unchanged:          5,
32                 },
33         }
34
35         for _, scen := range scenarios {
36                 dumpfile, err := gatherInlCallSitesScoresForFile(t, scen.name, td)
37                 if err != nil {
38                         t.Fatalf("dumping callsite scores for %q: error %v", scen.name, err)
39                 }
40                 var lines []string
41                 if content, err := os.ReadFile(dumpfile); err != nil {
42                         t.Fatalf("reading dump %q: error %v", dumpfile, err)
43                 } else {
44                         lines = strings.Split(string(content), "\n")
45                 }
46                 prom, indprom, dem, unch := 0, 0, 0, 0
47                 for _, line := range lines {
48                         switch {
49                         case strings.TrimSpace(line) == "":
50                         case !strings.Contains(line, "|"):
51                         case strings.HasPrefix(line, "#"):
52                         case strings.Contains(line, "PROMOTED"):
53                                 prom++
54                         case strings.Contains(line, "INDPROM"):
55                                 indprom++
56                         case strings.Contains(line, "DEMOTED"):
57                                 dem++
58                         default:
59                                 unch++
60                         }
61                 }
62                 showout := false
63                 if prom != scen.promoted {
64                         t.Errorf("testcase %q, got %d promoted want %d promoted",
65                                 scen.name, prom, scen.promoted)
66                         showout = true
67                 }
68                 if indprom != scen.indirectlyPromoted {
69                         t.Errorf("testcase %q, got %d indirectly promoted want %d",
70                                 scen.name, indprom, scen.indirectlyPromoted)
71                         showout = true
72                 }
73                 if dem != scen.demoted {
74                         t.Errorf("testcase %q, got %d demoted want %d demoted",
75                                 scen.name, dem, scen.demoted)
76                         showout = true
77                 }
78                 if unch != scen.unchanged {
79                         t.Errorf("testcase %q, got %d unchanged want %d unchanged",
80                                 scen.name, unch, scen.unchanged)
81                         showout = true
82                 }
83                 if showout {
84                         t.Logf(">> dump output: %s", strings.Join(lines, "\n"))
85                 }
86         }
87 }
88
89 // gatherInlCallSitesScoresForFile builds the specified testcase 'testcase'
90 // from testdata/props passing the "-d=dumpinlcallsitescores=1"
91 // compiler option, to produce a dump, then returns the path of the
92 // newly created file.
93 func gatherInlCallSitesScoresForFile(t *testing.T, testcase string, td string) (string, error) {
94         t.Helper()
95         gopath := "testdata/" + testcase + ".go"
96         outpath := filepath.Join(td, testcase+".a")
97         dumpfile := filepath.Join(td, testcase+".callsites.txt")
98         run := []string{testenv.GoToolPath(t), "build",
99                 "-gcflags=-d=dumpinlcallsitescores=1", "-o", outpath, gopath}
100         out, err := testenv.Command(t, run[0], run[1:]...).CombinedOutput()
101         t.Logf("run: %+v\n", run)
102         if err != nil {
103                 return "", err
104         }
105         if err := os.WriteFile(dumpfile, out, 0666); err != nil {
106                 return "", err
107         }
108         return dumpfile, err
109 }