modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/opt_branchlikely.go (about)

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