Home | History | Annotate | Download | only in gc
      1 package gc
      2 
      3 import "testing"
      4 
      5 // Tests to make sure logic simplification rules are correct.
      6 
      7 func TestLogic64(t *testing.T) {
      8 	// test values to determine function equality
      9 	values := [...]int64{-1 << 63, 1<<63 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
     10 
     11 	// golden functions we use repeatedly
     12 	zero := func(x int64) int64 { return 0 }
     13 	id := func(x int64) int64 { return x }
     14 	or := func(x, y int64) int64 { return x | y }
     15 	and := func(x, y int64) int64 { return x & y }
     16 	y := func(x, y int64) int64 { return y }
     17 
     18 	for _, test := range [...]struct {
     19 		name   string
     20 		f      func(int64) int64
     21 		golden func(int64) int64
     22 	}{
     23 		{"x|x", func(x int64) int64 { return x | x }, id},
     24 		{"x|0", func(x int64) int64 { return x | 0 }, id},
     25 		{"x|-1", func(x int64) int64 { return x | -1 }, func(x int64) int64 { return -1 }},
     26 		{"x&x", func(x int64) int64 { return x & x }, id},
     27 		{"x&0", func(x int64) int64 { return x & 0 }, zero},
     28 		{"x&-1", func(x int64) int64 { return x & -1 }, id},
     29 		{"x^x", func(x int64) int64 { return x ^ x }, zero},
     30 		{"x^0", func(x int64) int64 { return x ^ 0 }, id},
     31 		{"x^-1", func(x int64) int64 { return x ^ -1 }, func(x int64) int64 { return ^x }},
     32 		{"x+0", func(x int64) int64 { return x + 0 }, id},
     33 		{"x-x", func(x int64) int64 { return x - x }, zero},
     34 		{"x*0", func(x int64) int64 { return x * 0 }, zero},
     35 		{"^^x", func(x int64) int64 { return ^^x }, id},
     36 	} {
     37 		for _, v := range values {
     38 			got := test.f(v)
     39 			want := test.golden(v)
     40 			if want != got {
     41 				t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
     42 			}
     43 		}
     44 	}
     45 	for _, test := range [...]struct {
     46 		name   string
     47 		f      func(int64, int64) int64
     48 		golden func(int64, int64) int64
     49 	}{
     50 		{"x|(x|y)", func(x, y int64) int64 { return x | (x | y) }, or},
     51 		{"x|(y|x)", func(x, y int64) int64 { return x | (y | x) }, or},
     52 		{"(x|y)|x", func(x, y int64) int64 { return (x | y) | x }, or},
     53 		{"(y|x)|x", func(x, y int64) int64 { return (y | x) | x }, or},
     54 		{"x&(x&y)", func(x, y int64) int64 { return x & (x & y) }, and},
     55 		{"x&(y&x)", func(x, y int64) int64 { return x & (y & x) }, and},
     56 		{"(x&y)&x", func(x, y int64) int64 { return (x & y) & x }, and},
     57 		{"(y&x)&x", func(x, y int64) int64 { return (y & x) & x }, and},
     58 		{"x^(x^y)", func(x, y int64) int64 { return x ^ (x ^ y) }, y},
     59 		{"x^(y^x)", func(x, y int64) int64 { return x ^ (y ^ x) }, y},
     60 		{"(x^y)^x", func(x, y int64) int64 { return (x ^ y) ^ x }, y},
     61 		{"(y^x)^x", func(x, y int64) int64 { return (y ^ x) ^ x }, y},
     62 		{"-(y-x)", func(x, y int64) int64 { return -(y - x) }, func(x, y int64) int64 { return x - y }},
     63 		{"(x+y)-x", func(x, y int64) int64 { return (x + y) - x }, y},
     64 		{"(y+x)-x", func(x, y int64) int64 { return (y + x) - x }, y},
     65 	} {
     66 		for _, v := range values {
     67 			for _, w := range values {
     68 				got := test.f(v, w)
     69 				want := test.golden(v, w)
     70 				if want != got {
     71 					t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
     72 				}
     73 			}
     74 		}
     75 	}
     76 }
     77 
     78 func TestLogic32(t *testing.T) {
     79 	// test values to determine function equality
     80 	values := [...]int32{-1 << 31, 1<<31 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
     81 
     82 	// golden functions we use repeatedly
     83 	zero := func(x int32) int32 { return 0 }
     84 	id := func(x int32) int32 { return x }
     85 	or := func(x, y int32) int32 { return x | y }
     86 	and := func(x, y int32) int32 { return x & y }
     87 	y := func(x, y int32) int32 { return y }
     88 
     89 	for _, test := range [...]struct {
     90 		name   string
     91 		f      func(int32) int32
     92 		golden func(int32) int32
     93 	}{
     94 		{"x|x", func(x int32) int32 { return x | x }, id},
     95 		{"x|0", func(x int32) int32 { return x | 0 }, id},
     96 		{"x|-1", func(x int32) int32 { return x | -1 }, func(x int32) int32 { return -1 }},
     97 		{"x&x", func(x int32) int32 { return x & x }, id},
     98 		{"x&0", func(x int32) int32 { return x & 0 }, zero},
     99 		{"x&-1", func(x int32) int32 { return x & -1 }, id},
    100 		{"x^x", func(x int32) int32 { return x ^ x }, zero},
    101 		{"x^0", func(x int32) int32 { return x ^ 0 }, id},
    102 		{"x^-1", func(x int32) int32 { return x ^ -1 }, func(x int32) int32 { return ^x }},
    103 		{"x+0", func(x int32) int32 { return x + 0 }, id},
    104 		{"x-x", func(x int32) int32 { return x - x }, zero},
    105 		{"x*0", func(x int32) int32 { return x * 0 }, zero},
    106 		{"^^x", func(x int32) int32 { return ^^x }, id},
    107 	} {
    108 		for _, v := range values {
    109 			got := test.f(v)
    110 			want := test.golden(v)
    111 			if want != got {
    112 				t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
    113 			}
    114 		}
    115 	}
    116 	for _, test := range [...]struct {
    117 		name   string
    118 		f      func(int32, int32) int32
    119 		golden func(int32, int32) int32
    120 	}{
    121 		{"x|(x|y)", func(x, y int32) int32 { return x | (x | y) }, or},
    122 		{"x|(y|x)", func(x, y int32) int32 { return x | (y | x) }, or},
    123 		{"(x|y)|x", func(x, y int32) int32 { return (x | y) | x }, or},
    124 		{"(y|x)|x", func(x, y int32) int32 { return (y | x) | x }, or},
    125 		{"x&(x&y)", func(x, y int32) int32 { return x & (x & y) }, and},
    126 		{"x&(y&x)", func(x, y int32) int32 { return x & (y & x) }, and},
    127 		{"(x&y)&x", func(x, y int32) int32 { return (x & y) & x }, and},
    128 		{"(y&x)&x", func(x, y int32) int32 { return (y & x) & x }, and},
    129 		{"x^(x^y)", func(x, y int32) int32 { return x ^ (x ^ y) }, y},
    130 		{"x^(y^x)", func(x, y int32) int32 { return x ^ (y ^ x) }, y},
    131 		{"(x^y)^x", func(x, y int32) int32 { return (x ^ y) ^ x }, y},
    132 		{"(y^x)^x", func(x, y int32) int32 { return (y ^ x) ^ x }, y},
    133 		{"-(y-x)", func(x, y int32) int32 { return -(y - x) }, func(x, y int32) int32 { return x - y }},
    134 		{"(x+y)-x", func(x, y int32) int32 { return (x + y) - x }, y},
    135 		{"(y+x)-x", func(x, y int32) int32 { return (y + x) - x }, y},
    136 	} {
    137 		for _, v := range values {
    138 			for _, w := range values {
    139 				got := test.f(v, w)
    140 				want := test.golden(v, w)
    141 				if want != got {
    142 					t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
    143 				}
    144 			}
    145 		}
    146 	}
    147 }
    148 
    149 func TestLogic16(t *testing.T) {
    150 	// test values to determine function equality
    151 	values := [...]int16{-1 << 15, 1<<15 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
    152 
    153 	// golden functions we use repeatedly
    154 	zero := func(x int16) int16 { return 0 }
    155 	id := func(x int16) int16 { return x }
    156 	or := func(x, y int16) int16 { return x | y }
    157 	and := func(x, y int16) int16 { return x & y }
    158 	y := func(x, y int16) int16 { return y }
    159 
    160 	for _, test := range [...]struct {
    161 		name   string
    162 		f      func(int16) int16
    163 		golden func(int16) int16
    164 	}{
    165 		{"x|x", func(x int16) int16 { return x | x }, id},
    166 		{"x|0", func(x int16) int16 { return x | 0 }, id},
    167 		{"x|-1", func(x int16) int16 { return x | -1 }, func(x int16) int16 { return -1 }},
    168 		{"x&x", func(x int16) int16 { return x & x }, id},
    169 		{"x&0", func(x int16) int16 { return x & 0 }, zero},
    170 		{"x&-1", func(x int16) int16 { return x & -1 }, id},
    171 		{"x^x", func(x int16) int16 { return x ^ x }, zero},
    172 		{"x^0", func(x int16) int16 { return x ^ 0 }, id},
    173 		{"x^-1", func(x int16) int16 { return x ^ -1 }, func(x int16) int16 { return ^x }},
    174 		{"x+0", func(x int16) int16 { return x + 0 }, id},
    175 		{"x-x", func(x int16) int16 { return x - x }, zero},
    176 		{"x*0", func(x int16) int16 { return x * 0 }, zero},
    177 		{"^^x", func(x int16) int16 { return ^^x }, id},
    178 	} {
    179 		for _, v := range values {
    180 			got := test.f(v)
    181 			want := test.golden(v)
    182 			if want != got {
    183 				t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
    184 			}
    185 		}
    186 	}
    187 	for _, test := range [...]struct {
    188 		name   string
    189 		f      func(int16, int16) int16
    190 		golden func(int16, int16) int16
    191 	}{
    192 		{"x|(x|y)", func(x, y int16) int16 { return x | (x | y) }, or},
    193 		{"x|(y|x)", func(x, y int16) int16 { return x | (y | x) }, or},
    194 		{"(x|y)|x", func(x, y int16) int16 { return (x | y) | x }, or},
    195 		{"(y|x)|x", func(x, y int16) int16 { return (y | x) | x }, or},
    196 		{"x&(x&y)", func(x, y int16) int16 { return x & (x & y) }, and},
    197 		{"x&(y&x)", func(x, y int16) int16 { return x & (y & x) }, and},
    198 		{"(x&y)&x", func(x, y int16) int16 { return (x & y) & x }, and},
    199 		{"(y&x)&x", func(x, y int16) int16 { return (y & x) & x }, and},
    200 		{"x^(x^y)", func(x, y int16) int16 { return x ^ (x ^ y) }, y},
    201 		{"x^(y^x)", func(x, y int16) int16 { return x ^ (y ^ x) }, y},
    202 		{"(x^y)^x", func(x, y int16) int16 { return (x ^ y) ^ x }, y},
    203 		{"(y^x)^x", func(x, y int16) int16 { return (y ^ x) ^ x }, y},
    204 		{"-(y-x)", func(x, y int16) int16 { return -(y - x) }, func(x, y int16) int16 { return x - y }},
    205 		{"(x+y)-x", func(x, y int16) int16 { return (x + y) - x }, y},
    206 		{"(y+x)-x", func(x, y int16) int16 { return (y + x) - x }, y},
    207 	} {
    208 		for _, v := range values {
    209 			for _, w := range values {
    210 				got := test.f(v, w)
    211 				want := test.golden(v, w)
    212 				if want != got {
    213 					t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
    214 				}
    215 			}
    216 		}
    217 	}
    218 }
    219 
    220 func TestLogic8(t *testing.T) {
    221 	// test values to determine function equality
    222 	values := [...]int8{-1 << 7, 1<<7 - 1, -4, -3, -2, -1, 0, 1, 2, 3, 4}
    223 
    224 	// golden functions we use repeatedly
    225 	zero := func(x int8) int8 { return 0 }
    226 	id := func(x int8) int8 { return x }
    227 	or := func(x, y int8) int8 { return x | y }
    228 	and := func(x, y int8) int8 { return x & y }
    229 	y := func(x, y int8) int8 { return y }
    230 
    231 	for _, test := range [...]struct {
    232 		name   string
    233 		f      func(int8) int8
    234 		golden func(int8) int8
    235 	}{
    236 		{"x|x", func(x int8) int8 { return x | x }, id},
    237 		{"x|0", func(x int8) int8 { return x | 0 }, id},
    238 		{"x|-1", func(x int8) int8 { return x | -1 }, func(x int8) int8 { return -1 }},
    239 		{"x&x", func(x int8) int8 { return x & x }, id},
    240 		{"x&0", func(x int8) int8 { return x & 0 }, zero},
    241 		{"x&-1", func(x int8) int8 { return x & -1 }, id},
    242 		{"x^x", func(x int8) int8 { return x ^ x }, zero},
    243 		{"x^0", func(x int8) int8 { return x ^ 0 }, id},
    244 		{"x^-1", func(x int8) int8 { return x ^ -1 }, func(x int8) int8 { return ^x }},
    245 		{"x+0", func(x int8) int8 { return x + 0 }, id},
    246 		{"x-x", func(x int8) int8 { return x - x }, zero},
    247 		{"x*0", func(x int8) int8 { return x * 0 }, zero},
    248 		{"^^x", func(x int8) int8 { return ^^x }, id},
    249 	} {
    250 		for _, v := range values {
    251 			got := test.f(v)
    252 			want := test.golden(v)
    253 			if want != got {
    254 				t.Errorf("[%s](%d)=%d, want %d", test.name, v, got, want)
    255 			}
    256 		}
    257 	}
    258 	for _, test := range [...]struct {
    259 		name   string
    260 		f      func(int8, int8) int8
    261 		golden func(int8, int8) int8
    262 	}{
    263 		{"x|(x|y)", func(x, y int8) int8 { return x | (x | y) }, or},
    264 		{"x|(y|x)", func(x, y int8) int8 { return x | (y | x) }, or},
    265 		{"(x|y)|x", func(x, y int8) int8 { return (x | y) | x }, or},
    266 		{"(y|x)|x", func(x, y int8) int8 { return (y | x) | x }, or},
    267 		{"x&(x&y)", func(x, y int8) int8 { return x & (x & y) }, and},
    268 		{"x&(y&x)", func(x, y int8) int8 { return x & (y & x) }, and},
    269 		{"(x&y)&x", func(x, y int8) int8 { return (x & y) & x }, and},
    270 		{"(y&x)&x", func(x, y int8) int8 { return (y & x) & x }, and},
    271 		{"x^(x^y)", func(x, y int8) int8 { return x ^ (x ^ y) }, y},
    272 		{"x^(y^x)", func(x, y int8) int8 { return x ^ (y ^ x) }, y},
    273 		{"(x^y)^x", func(x, y int8) int8 { return (x ^ y) ^ x }, y},
    274 		{"(y^x)^x", func(x, y int8) int8 { return (y ^ x) ^ x }, y},
    275 		{"-(y-x)", func(x, y int8) int8 { return -(y - x) }, func(x, y int8) int8 { return x - y }},
    276 		{"(x+y)-x", func(x, y int8) int8 { return (x + y) - x }, y},
    277 		{"(y+x)-x", func(x, y int8) int8 { return (y + x) - x }, y},
    278 	} {
    279 		for _, v := range values {
    280 			for _, w := range values {
    281 				got := test.f(v, w)
    282 				want := test.golden(v, w)
    283 				if want != got {
    284 					t.Errorf("[%s](%d,%d)=%d, want %d", test.name, v, w, got, want)
    285 				}
    286 			}
    287 		}
    288 	}
    289 }
    290