Commit c429bb5d2f

Jacob Young <jacobly0@users.noreply.github.com>
2023-08-27 23:36:43
llvm/cbe: support slice in `@prefetch`
Closes #16967
1 parent 26b03ca
Changed files (3)
src
test
behavior
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
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),
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 });
 }