lin
2025-04-23 399353eb5dc7e9c1db94cc97c380dc7f66c51a4c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// +build amd64
// errorcheck -0 -d=ssa/likelyadjust/debug=1,ssa/insert_resched_checks/off
// rescheduling check insertion is turend off because the inserted conditional branches perturb the errorcheck
 
// Copyright 2016 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.
 
// Test that branches have some prediction properties.
package foo
 
func f(x, y, z int) int {
   a := 0
   for i := 0; i < x; i++ { // ERROR "Branch prediction rule stay in loop"
       for j := 0; j < y; j++ { // ERROR "Branch prediction rule stay in loop"
           a += j
       }
       for k := 0; k < z; k++ { // ERROR "Branch prediction rule stay in loop"
           a -= x + y + z
       }
   }
   return a
}
 
func g(x, y, z int) int {
   a := 0
   if y == 0 { // ERROR "Branch prediction rule default < call"
       y = g(y, z, x)
   } else {
       y++
   }
   if y == x { // ERROR "Branch prediction rule default < call"
       y = g(y, z, x)
   } else {
   }
   if y == 2 { // ERROR "Branch prediction rule default < call"
       z++
   } else {
       y = g(z, x, y)
   }
   if y+z == 3 { // ERROR "Branch prediction rule call < exit"
       println("ha ha")
   } else {
       panic("help help help")
   }
   if x != 0 { // ERROR "Branch prediction rule default < ret"
       for i := 0; i < x; i++ { // ERROR "Branch prediction rule stay in loop"
           if x == 4 { // ERROR "Branch prediction rule stay in loop"
               return a
           }
           for j := 0; j < y; j++ { // ERROR "Branch prediction rule stay in loop"
               for k := 0; k < z; k++ { // ERROR "Branch prediction rule stay in loop"
                   a -= j * i
               }
               a += j
           }
       }
   }
   return a
}
 
func h(x, y, z int) int {
   a := 0
   for i := 0; i < x; i++ { // ERROR "Branch prediction rule stay in loop"
       for j := 0; j < y; j++ { // ERROR "Branch prediction rule stay in loop"
           a += j
           if i == j { // ERROR "Branch prediction rule stay in loop"
               break
           }
           a *= j
       }
       for k := 0; k < z; k++ { // ERROR "Branch prediction rule stay in loop"
           a -= k
           if i == k {
               continue
           }
           a *= k
       }
   }
   if a > 0 { // ERROR "Branch prediction rule default < call"
       a = g(x, y, z)
   } else {
       a = -a
   }
   return a
}