diff --git a/test/unit/test_uop_symbolic.py b/test/unit/test_uop_symbolic.py index 15e4f7af0b..53b1d5f18b 100644 --- a/test/unit/test_uop_symbolic.py +++ b/test/unit/test_uop_symbolic.py @@ -857,5 +857,16 @@ class TestBounds(unittest.TestCase): assert ((alu0+2559)//-4).vmin == -639 and ((alu0+2559)//-4).vmax == 0 assert (((alu0+2559)//-4)*(-1)).vmin == 0 and (((alu0+2559)//-4)*(-1)).vmax == 639 +class TestFuzzFailure(unittest.TestCase): + def test_fuzz_failure1(self): + v1=Variable('v1', 0, 8) + v2=Variable('v2', 0, 2) + v3=Variable('v3', 0, 1) + expr = (((((((((((((((((((((((0//4)%2)//8)+-2)+-4)+-3)+v1)+-4)+v2)+-2)+v3)+v2)//3)%7)*1)//2)+v2)*-1)+2)+1)+0)+-3)+v3) + v1_val, v2_val, v3_val = v1.const_like(8), v2.const_like(0), v3.const_like(0) + num = expr.simplify().substitute({v1:v1_val, v2:v2_val, v3:v3_val}).ssimplify() + rn = expr.substitute({v1:v1_val, v2:v2_val, v3:v3_val}).ssimplify() + assert num==rn, f"{num} != {rn}" + if __name__ == '__main__': unittest.main() diff --git a/tinygrad/codegen/symbolic.py b/tinygrad/codegen/symbolic.py index dfab1d6a6e..f293e66bf4 100644 --- a/tinygrad/codegen/symbolic.py +++ b/tinygrad/codegen/symbolic.py @@ -282,7 +282,7 @@ symbolic = symbolic_simple+commutative+PatternMatcher([ # ** div ** # div folding ((UPat.var("x")//UPat.cvar("c") + UPat.cvar("a"))//UPat.cvar("d"), lambda x,c,a,d: (x+a*c)//(c*d) - if x.vmin>=0 or x.vmax<=0 else None), # (x//c+a)//d -> (x+a*c)//(c*d) + if (x.vmin>=0 and a.vmin>=0) or (x.vmax<=0 and a.vmax<=0) else None), # (x//c+a)//d -> (x+a*c)//(c*d) (UPat.var("x", dtypes.sints) // UPat.var("y"), lambda x,y: div_and_mod_folding(x,y,Ops.IDIV)), (UPat.var("x") // UPat.var("d"), lambda x,d: -(x//(-d)) if d.vmax <=0 else None), (UPat.var("x") // UPat.var("d"), lambda x,d: -((-x)//d) if x.vmax <=0 else None),