From be0c608b0a4f8055daa6131ec3b6dab591df68a1 Mon Sep 17 00:00:00 2001 From: George Hotz Date: Fri, 25 Jul 2025 19:43:14 -0700 Subject: [PATCH] store is dtypes.void, no ptr pass through --- tinygrad/codegen/devectorizer.py | 4 ++-- tinygrad/renderer/cstyle.py | 6 ++---- tinygrad/renderer/llvmir.py | 3 --- tinygrad/uop/ops.py | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/tinygrad/codegen/devectorizer.py b/tinygrad/codegen/devectorizer.py index 0f6c4a6ec2..97e0ec7bc1 100644 --- a/tinygrad/codegen/devectorizer.py +++ b/tinygrad/codegen/devectorizer.py @@ -287,10 +287,10 @@ def reduce_to_acc(ctx:ReduceContext, red:UOp): input_ranges = tuple([x for x in inp.toposort(gate=lambda x: x.op is not Ops.STORE) if x.op is Ops.RANGE and x not in reduce_range]) identity = red.const_like(identity_element(red.arg, red.dtype.scalar())) acc = UOp(Ops.DEFINE_REG, red.dtype.ptr(size=1, addrspace=AddrSpace.REG), arg=(ctx.acc_num,)).index(UOp.const(dtypes.int, 0)) - lst = [acc.store(identity, UOp(Ops.NOOP, src=input_ranges)).load(*reduce_range)] + lst # put acc as the first element + lst = [acc.load(acc.store(identity, UOp(Ops.NOOP, src=input_ranges)), *reduce_range)] + lst # put acc as the first element ctx.acc_num += 1 ret = functools.reduce(lambda x,y: x.alu(red.arg, y), lst) - return acc.store(ret, *reduce_range).load() if len(reduce_range) != 0 else ret + return acc.load(acc.store(ret, *reduce_range)) if len(reduce_range) != 0 else ret def no_vectorized_reduce(inp:UOp, red:UOp): if inp.dtype != red.dtype: diff --git a/tinygrad/renderer/cstyle.py b/tinygrad/renderer/cstyle.py index 73efb25936..f7e45e1bd9 100644 --- a/tinygrad/renderer/cstyle.py +++ b/tinygrad/renderer/cstyle.py @@ -167,10 +167,8 @@ class CStyleLanguage(Renderer): (u.op in {Ops.VECTORIZE, *(GroupOp.ALU-{Ops.WHERE}), Ops.CAST, Ops.BITCAST} and child_count[u] == 1 and not getenv("EXPAND_SSA"))): r[u] = l else: - if u.op in {Ops.RANGE, Ops.DEFINE_LOCAL, Ops.STORE, Ops.DEFINE_REG} or u.dtype == dtypes.void: - if u.op is Ops.STORE: r[u] = r[u.src[0]] - else: - l = f"{self.render_dtype(u.dtype)} {r[u]} = {l}" + (";" if u.op is not Ops.SPECIAL else "") + if u.op in {Ops.RANGE, Ops.DEFINE_LOCAL, Ops.STORE, Ops.DEFINE_REG} or u.dtype == dtypes.void: pass + else: l = f"{self.render_dtype(u.dtype)} {r[u]} = {l}" + (";" if u.op is not Ops.SPECIAL else "") kernel.append(" "*depth + l) if prefix: c[prefix] += 1 # if it was used, increment if u.op in {Ops.IF, Ops.RANGE}: depth += 1 diff --git a/tinygrad/renderer/llvmir.py b/tinygrad/renderer/llvmir.py index 13c79ad573..bf75673722 100644 --- a/tinygrad/renderer/llvmir.py +++ b/tinygrad/renderer/llvmir.py @@ -188,9 +188,6 @@ class LLVMRenderer(Renderer): if (l:=self.string_rewrite.rewrite(u, ctx=r)) is None: raise RuntimeError(f"failed to render {u.op} with {u.dtype} srcs {[x.dtype for x in u.src]}") kernel.append(cast(str, l)) - - # stores pass the first arg through - if u.op is Ops.STORE: r[u] = r[u.src[0]] return tuple(local_args), self._render_fn(name, args, kernel, prefix) barrier = 'fence syncscope("workgroup") release\ntail call void @llvm.amdgcn.s.barrier()\nfence syncscope("workgroup") acquire\n' diff --git a/tinygrad/uop/ops.py b/tinygrad/uop/ops.py index 2f046fc0d7..b94cfbf2fd 100644 --- a/tinygrad/uop/ops.py +++ b/tinygrad/uop/ops.py @@ -648,7 +648,7 @@ class UPat(MathTrait): def bitcast(self, dtype=None): return UPat(Ops.BITCAST, dtype, (self,)) def gep(self, i:int|None=None, **kwargs): return UPat(Ops.GEP, None, (self,), (i,) if i is not None else None, **kwargs) def load(self, *src:UPat, **kwargs): return UPat(Ops.LOAD, src=(self,)+src, **kwargs) - def store(self, *src:UPat, **kwargs): return UPat(Ops.STORE, self.dtype, (self,)+src, **kwargs) + def store(self, *src:UPat, **kwargs): return UPat(Ops.STORE, dtypes.void, (self,)+src, **kwargs) def assign(self, x:UPat, **kwargs): return UPat(Ops.ASSIGN, self.dtype, (self,x), **kwargs) def reduce(self, *src:UPat, **kwargs): return UPat(Ops.REDUCE, self.dtype, src=(self,)+src, **kwargs) def fuse(self): return self.alu(Ops.FUSE)