diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 02f59df8d6..2ac9188704 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -6951,8 +6951,10 @@ fn airUnionInit(f: *Function, inst: Air.Inst.Index) !CValue { } fn airPrefetch(f: *Function, inst: Air.Inst.Index) !CValue { + const mod = f.object.dg.module; const prefetch = f.air.instructions.items(.data)[inst].prefetch; + const ptr_ty = f.typeOf(prefetch.ptr); const ptr = try f.resolveInst(prefetch.ptr); try reap(f, inst, &.{prefetch.ptr}); @@ -6960,7 +6962,10 @@ fn airPrefetch(f: *Function, inst: Air.Inst.Index) !CValue { switch (prefetch.cache) { .data => { try writer.writeAll("zig_prefetch("); - try f.writeCValue(writer, ptr, .FunctionArgument); + if (ptr_ty.isSlice(mod)) + try f.writeCValueMember(writer, ptr, .{ .identifier = "ptr" }) + else + try f.writeCValue(writer, ptr, .FunctionArgument); try writer.print(", {d}, {d});\n", .{ @intFromEnum(prefetch.rw), prefetch.locality }); }, // The available prefetch intrinsics do not accept a cache argument; only diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index bc1161475f..a2ded0cc8d 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -9837,7 +9837,7 @@ pub const FuncGen = struct { } _ = try self.wip.callIntrinsic(.normal, .none, .prefetch, &.{.ptr}, &.{ - try self.resolveInst(prefetch.ptr), + try self.sliceOrArrayPtr(try self.resolveInst(prefetch.ptr), self.typeOf(prefetch.ptr)), try o.builder.intValue(.i32, prefetch.rw), try o.builder.intValue(.i32, prefetch.locality), try o.builder.intValue(.i32, prefetch.cache), diff --git a/test/behavior/prefetch.zig b/test/behavior/prefetch.zig index cd4d8c5aba..d4baa649d0 100644 --- a/test/behavior/prefetch.zig +++ b/test/behavior/prefetch.zig @@ -4,27 +4,28 @@ const std = @import("std"); test "@prefetch()" { if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; - var a: u32 = 42; + var a: [2]u32 = .{ 42, 42 }; + var a_len = a.len; @prefetch(&a, .{}); - @prefetch(&a, .{ .rw = .read, .locality = 3, .cache = .data }); + @prefetch(&a[0], .{ .rw = .read, .locality = 3, .cache = .data }); @prefetch(&a, .{ .rw = .read, .locality = 2, .cache = .data }); - @prefetch(&a, .{ .rw = .read, .locality = 1, .cache = .data }); - @prefetch(&a, .{ .rw = .read, .locality = 0, .cache = .data }); + @prefetch(a[0..].ptr, .{ .rw = .read, .locality = 1, .cache = .data }); + @prefetch(a[0..a_len], .{ .rw = .read, .locality = 0, .cache = .data }); - @prefetch(&a, .{ .rw = .write, .locality = 3, .cache = .data }); + @prefetch(&a[0], .{ .rw = .write, .locality = 3, .cache = .data }); @prefetch(&a, .{ .rw = .write, .locality = 2, .cache = .data }); - @prefetch(&a, .{ .rw = .write, .locality = 1, .cache = .data }); - @prefetch(&a, .{ .rw = .write, .locality = 0, .cache = .data }); + @prefetch(a[0..].ptr, .{ .rw = .write, .locality = 1, .cache = .data }); + @prefetch(a[0..a_len], .{ .rw = .write, .locality = 0, .cache = .data }); - @prefetch(&a, .{ .rw = .read, .locality = 3, .cache = .instruction }); + @prefetch(&a[0], .{ .rw = .read, .locality = 3, .cache = .instruction }); @prefetch(&a, .{ .rw = .read, .locality = 2, .cache = .instruction }); - @prefetch(&a, .{ .rw = .read, .locality = 1, .cache = .instruction }); - @prefetch(&a, .{ .rw = .read, .locality = 0, .cache = .instruction }); + @prefetch(a[0..].ptr, .{ .rw = .read, .locality = 1, .cache = .instruction }); + @prefetch(a[0..a_len], .{ .rw = .read, .locality = 0, .cache = .instruction }); - @prefetch(&a, .{ .rw = .write, .locality = 3, .cache = .instruction }); + @prefetch(&a[0], .{ .rw = .write, .locality = 3, .cache = .instruction }); @prefetch(&a, .{ .rw = .write, .locality = 2, .cache = .instruction }); - @prefetch(&a, .{ .rw = .write, .locality = 1, .cache = .instruction }); - @prefetch(&a, .{ .rw = .write, .locality = 0, .cache = .instruction }); + @prefetch(a[0..].ptr, .{ .rw = .write, .locality = 1, .cache = .instruction }); + @prefetch(a[0..a_len], .{ .rw = .write, .locality = 0, .cache = .instruction }); }