From af4140f3beb401eb5adea96b2e2d4d0f18e41267 Mon Sep 17 00:00:00 2001 From: chenyu Date: Wed, 6 May 2026 14:22:42 -0400 Subject: [PATCH] fix divmod recombine for floordiv (#16062) --- test/null/test_uop_symbolic.py | 5 +++++ tinygrad/uop/symbolic.py | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/test/null/test_uop_symbolic.py b/test/null/test_uop_symbolic.py index b0f2910f34..19a6ea70bc 100644 --- a/test/null/test_uop_symbolic.py +++ b/test/null/test_uop_symbolic.py @@ -745,6 +745,11 @@ class TestSymbolic(unittest.TestCase): a = Variable("a", 0, 10) self.helper_test_variable((25*a+3)%10 + ((25*a+3)//10)*10, 3, 253, "((a*25)+3)") + def test_div_mod_recombine_negative_div_unsound(self): + # ((b//d)%div)*mul + (b//(d*div))*(div*mul) only equals (b//d)*mul when div>0 + b = Variable("b", -100, 100) + self.helper_test_variable(((b//(-3))%(-2)) + (b//6)*(-2), -33, 34, "(b//6*-2+b//-3%-2)") + def test_mod_nest_by_factor(self): # (a*f+b) % (f*k) = (a%k)*f + b when 0<=b UOp|None: q, exact = v.src[0], False # (base%div)*mul + (base//div)*(div*mul) -> base*mul if q.op is Ops.FLOORDIV and q.src[1].op is Ops.CONST and q.src[1].arg == div: exact = q.src[0] is base - # ((base//d)%div)*mul + (base//(d*div))*(div*mul) -> (base//d)*mul - if not exact and base.op is Ops.FLOORDIV and base.src[1].op is Ops.CONST: + # ((base//d)%div)*mul + (base//(d*div))*(div*mul) -> (base//d)*mul if div>0 + if not exact and div > 0 and base.op is Ops.FLOORDIV and base.src[1].op is Ops.CONST: exact = q.op is Ops.FLOORDIV and q.src[1].op is Ops.CONST and q.src[0] is base.src[0] and q.src[1].arg == base.src[1].arg*div if exact: return (base*mul).usum(*[t for k,t in enumerate(terms) if k not in (i,j)]) # ((base//div)%d)*div + base%div -> base%(div*d)