authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-07-15 03:37:06-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-07-26 04:05:41-07:00
log81ca3a1d594cb25dcd7dbedf175dd9931cad0d0f
treea192c596e186cca2bcd37808eeda28a456613ad2
parentcde6956b2128d9c28b00e0e25e27346abd1c3a88
signaturelock-open Commit is signed but in an unrecognized format.

riscv: fix logic bug in `ptr_elem_ptr`

I was doing duplicate work with `elemOffset` multiplying by the abi size and then the `ptr_add` `genBinOp` also multiplying. This led to having writes happening in the wrong place.

8 files changed, 6 insertions(+), 35 deletions(-)

src/arch/riscv64/CodeGen.zig+6-12
......@@ -3620,15 +3620,13 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {
36203620 defer if (base_ptr_lock) |lock| func.register_manager.unlockReg(lock);
36213621
36223622 if (elem_ptr_ty.ptrInfo(zcu).flags.vector_index != .none) {
3623 break :result if (func.reuseOperand(inst, extra.lhs, 0, base_ptr_mcv))
3624 base_ptr_mcv
3625 else
3626 try func.copyToNewRegister(inst, base_ptr_mcv);
3623 // break :result if (func.reuseOperand(inst, extra.lhs, 0, base_ptr_mcv))
3624 // base_ptr_mcv
3625 // else
3626 // try func.copyToNewRegister(inst, base_ptr_mcv);
3627 @panic("audit");
36273628 }
36283629
3629 const elem_ty = base_ptr_ty.elemType2(zcu);
3630 const elem_abi_size = elem_ty.abiSize(pt);
3631 const index_ty = func.typeOf(extra.rhs);
36323630 const index_mcv = try func.resolveInst(extra.rhs);
36333631 const index_lock: ?RegisterLock = switch (index_mcv) {
36343632 .register => |reg| func.register_manager.lockRegAssumeUnused(reg),
......@@ -3636,10 +3634,6 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {
36363634 };
36373635 defer if (index_lock) |lock| func.register_manager.unlockReg(lock);
36383636
3639 const offset_reg = try func.elemOffset(index_ty, index_mcv, elem_abi_size);
3640 const offset_reg_lock = func.register_manager.lockRegAssumeUnused(offset_reg);
3641 defer func.register_manager.unlockReg(offset_reg_lock);
3642
36433637 const result_reg, const result_lock = try func.allocReg(.int);
36443638 defer func.register_manager.unlockReg(result_lock);
36453639
......@@ -3647,7 +3641,7 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {
36473641 .ptr_add,
36483642 base_ptr_mcv,
36493643 base_ptr_ty,
3650 .{ .register = offset_reg },
3644 index_mcv,
36513645 Type.usize,
36523646 result_reg,
36533647 );
test/behavior/array.zig-12
......@@ -22,7 +22,6 @@ test "arrays" {
2222 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2323 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2424 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
25 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
2625
2726 var array: [5]u32 = undefined;
2827
......@@ -614,7 +613,6 @@ test "type coercion of pointer to anon struct literal to pointer to array" {
614613 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
615614 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
616615 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
617 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
618616
619617 const S = struct {
620618 const U = union {
......@@ -667,7 +665,6 @@ test "array init of container level array variable" {
667665 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
668666 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
669667 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
670 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
671668
672669 const S = struct {
673670 var pair: [2]usize = .{ 1, 2 };
......@@ -802,8 +799,6 @@ test "runtime side-effects in comptime-known array init" {
802799}
803800
804801test "slice initialized through reference to anonymous array init provides result types" {
805 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
806
807802 var my_u32: u32 = 123;
808803 var my_u64: u64 = 456;
809804 _ = .{ &my_u32, &my_u64 };
......@@ -817,8 +812,6 @@ test "slice initialized through reference to anonymous array init provides resul
817812}
818813
819814test "sentinel-terminated slice initialized through reference to anonymous array init provides result types" {
820 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
821
822815 var my_u32: u32 = 123;
823816 var my_u64: u64 = 456;
824817 _ = .{ &my_u32, &my_u64 };
......@@ -869,8 +862,6 @@ test "many-item sentinel-terminated pointer initialized through reference to ano
869862}
870863
871864test "pointer to array initialized through reference to anonymous array init provides result types" {
872 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
873
874865 var my_u32: u32 = 123;
875866 var my_u64: u64 = 456;
876867 _ = .{ &my_u32, &my_u64 };
......@@ -884,8 +875,6 @@ test "pointer to array initialized through reference to anonymous array init pro
884875}
885876
886877test "pointer to sentinel-terminated array initialized through reference to anonymous array init provides result types" {
887 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
888
889878 var my_u32: u32 = 123;
890879 var my_u64: u64 = 456;
891880 _ = .{ &my_u32, &my_u64 };
......@@ -912,7 +901,6 @@ test "copied array element doesn't alias source" {
912901 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
913902 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
914903 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
915 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
916904
917905 var x: [10][10]u32 = undefined;
918906
test/behavior/basic.zig-1
......@@ -620,7 +620,6 @@ var global_ptr = &gdt[0];
620620
621621test "global constant is loaded with a runtime-known index" {
622622 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
623 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
624623
625624 const S = struct {
626625 fn doTheTest() !void {
test/behavior/bit_shifting.zig-1
......@@ -65,7 +65,6 @@ test "sharded table" {
6565 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
6666 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
6767 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
68 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
6968
7069 // realistic 16-way sharding
7170 try testShardedTable(u32, 4, 8);
test/behavior/pointers.zig-1
......@@ -515,7 +515,6 @@ test "element pointer to slice" {
515515test "element pointer arithmetic to slice" {
516516 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
517517 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
518 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
519518
520519 const S = struct {
521520 fn doTheTest() !void {
test/behavior/slice.zig-2
......@@ -30,7 +30,6 @@ comptime {
3030
3131test "slicing" {
3232 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
33 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3433
3534 var array: [20]i32 = undefined;
3635
......@@ -256,7 +255,6 @@ test "C pointer slice access" {
256255 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
257256 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
258257 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
259 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
260258
261259 var buf: [10]u32 = [1]u32{42} ** 10;
262260 const c_ptr = @as([*c]const u32, @ptrCast(&buf));
test/behavior/union.zig-2
......@@ -1700,7 +1700,6 @@ test "packed union field pointer has correct alignment" {
17001700
17011701test "union with 128 bit integer" {
17021702 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1703 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
17041703
17051704 const ValueTag = enum { int, other };
17061705
......@@ -2196,7 +2195,6 @@ test "copied union field doesn't alias source" {
21962195 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
21972196 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
21982197 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2199 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
22002198
22012199 const U = union(enum) {
22022200 array: [10]u32,
test/behavior/vector.zig-4
......@@ -395,7 +395,6 @@ test "load vector elements via comptime index" {
395395 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
396396 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
397397 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
398 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
399398
400399 const S = struct {
401400 fn doTheTest() !void {
......@@ -417,7 +416,6 @@ test "store vector elements via comptime index" {
417416 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
418417 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
419418 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
420 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
421419
422420 const S = struct {
423421 fn doTheTest() !void {
......@@ -467,7 +465,6 @@ test "store vector elements via runtime index" {
467465 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
468466 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
469467 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
470 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
471468
472469 const S = struct {
473470 fn doTheTest() !void {
......@@ -1511,7 +1508,6 @@ test "vector pointer is indexable" {
15111508 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
15121509 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
15131510 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1514 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
15151511
15161512 const V = @Vector(2, u32);
15171513