def METHOD_NAME(self):
    self.assertReduce('(foo & 0xff) & 0xff', 'foo & 0xff')
    self.assertReduce('(0xff & foo) & 0xff', 'foo & 0xff')
    self.assertReduce('0xff & (foo & 0xff)', 'foo & 0xff')
    self.assertReduce('0xff & (0xff & foo)', 'foo & 0xff')
    self.assertReduce('foo & 0', '0')
    self.assertReduce('0 & foo', '0')
    # reduce & with 0 regardless of width
    self.assertReduce('foo[5] & 0', '0')
    # we only support slices on memory
    # self.assertReduce('foo[2:4] & 0', '0')
    self.assertReduce('mem[2:4] & 0', '0')
    self.assertReduce('0[1] & foo', '0')
    # reduce & umax of foo to just foo
    self.assertReduce('foo[1] & 0xff', 'foo')
    self.assertReduce('foo[2] & 0xffff', 'foo')
    self.assertReduce('foo[4] & 0xffffffff', 'foo')
    self.assertNotReduce('foo[4] & 0xff', 'foo')
    self.assertNotReduce('foo[4] & 0xffff', 'foo')