diff --git a/tinygrad/codegen/simplify.py b/tinygrad/codegen/simplify.py index 3ceaf0887a..13b67606d1 100644 --- a/tinygrad/codegen/simplify.py +++ b/tinygrad/codegen/simplify.py @@ -55,7 +55,7 @@ def do_substitute(ctx, x: UOp): return ret def dont_sub_ranges_for_image(ctx, x:UOp): - if isinstance(x.src[0].dtype, ImageDType): + if isinstance(x.src[0].src[0].dtype, ImageDType): for s in x.src[0].ranges: ctx[s] = None pm_split_ranges = PatternMatcher([ diff --git a/tinygrad/uop/symbolic.py b/tinygrad/uop/symbolic.py index d5154b3464..a89536f10b 100644 --- a/tinygrad/uop/symbolic.py +++ b/tinygrad/uop/symbolic.py @@ -479,21 +479,20 @@ def drop_and_clauses(cond:UOp, x:UOp, i:UOp) -> UOp|None: return UOp.const(dtypes.bool, True).prod(*[c for c in cond.split_uop(Ops.AND) if c not in dropped_clauses]).where(x, i) pm_drop_and_clauses = PatternMatcher([(UPat.var("cond").where(UPat.var("x", dtype=dtypes.index), invalid_pat), drop_and_clauses)]) -def where_on_load(l, c1, buf, x): +def where_on_load(c1, buf, x): c2 = x.get_valid() duplicate_clauses = [c for c in c1.split_uop(Ops.AND) if c in c2.split_uop(Ops.AND)] # we move the condition from the where to the load _as long as_ the condtition doesn't have some range that would place it inside of a new range # also no data dependent loads! moved_clauses = [c for c in c1.split_uop(Ops.AND) if c not in duplicate_clauses and all(r in x.ranges for r in c.ranges) - and all(u in x.backward_slice_with_self for u in c.backward_slice_with_self if u.op is Ops.LOAD)] + and all(u in x.backward_slice_with_self for u in c.backward_slice_with_self if u.op is Ops.INDEX)] if not (removed:=moved_clauses+duplicate_clauses): return None # aditionally we can drop the clause on the where if it already exists in the load remaining_clause = UOp.const(dtypes.bool, True).prod(*[c for c in c1.split_uop(Ops.AND) if c not in removed]) - return remaining_clause.where(UOp.load(buf.index(x.get_idx().valid(functools.reduce(operator.and_, moved_clauses, c2)), *l.src[1:])), 0) + return remaining_clause.where(buf.index(x.get_idx().valid(functools.reduce(operator.and_, moved_clauses, c2))), 0) pm_move_where_on_load = PatternMatcher([ - (UPat.var("c1").where(UPat(Ops.LOAD, src=(UPat.var("buf").index(UPat.var("x")),), name="l"), 0), where_on_load), - (UPat.var("c1").where(0, UPat(Ops.LOAD, src=(UPat.var("buf").index(UPat.var("x")),), name="l")), - lambda l,c1,buf,x: where_on_load(l,c1.logical_not(),buf,x)), + (UPat.var("c1").where(UPat.var("buf").index(UPat.var("x")), 0), where_on_load), + (UPat.var("c1").where(0, UPat.var("buf").index(UPat.var("x"))), lambda c1,buf,x: where_on_load(c1.logical_not(),buf,x)), ]) pm_simplify_valid = PatternMatcher([