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 {...@@ -3620,15 +3620,13 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {
3620 defer if (base_ptr_lock) |lock| func.register_manager.unlockReg(lock);3620 defer if (base_ptr_lock) |lock| func.register_manager.unlockReg(lock);
36213621
3622 if (elem_ptr_ty.ptrInfo(zcu).flags.vector_index != .none) {3622 if (elem_ptr_ty.ptrInfo(zcu).flags.vector_index != .none) {
3623 break :result if (func.reuseOperand(inst, extra.lhs, 0, base_ptr_mcv))3623 // break :result if (func.reuseOperand(inst, extra.lhs, 0, base_ptr_mcv))
3624 base_ptr_mcv3624 // base_ptr_mcv
3625 else3625 // else
3626 try func.copyToNewRegister(inst, base_ptr_mcv);3626 // try func.copyToNewRegister(inst, base_ptr_mcv);
3627 @panic("audit");
3627 }3628 }
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);
3632 const index_mcv = try func.resolveInst(extra.rhs);3630 const index_mcv = try func.resolveInst(extra.rhs);
3633 const index_lock: ?RegisterLock = switch (index_mcv) {3631 const index_lock: ?RegisterLock = switch (index_mcv) {
3634 .register => |reg| func.register_manager.lockRegAssumeUnused(reg),3632 .register => |reg| func.register_manager.lockRegAssumeUnused(reg),
...@@ -3636,10 +3634,6 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {...@@ -3636,10 +3634,6 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {
3636 };3634 };
3637 defer if (index_lock) |lock| func.register_manager.unlockReg(lock);3635 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
3643 const result_reg, const result_lock = try func.allocReg(.int);3637 const result_reg, const result_lock = try func.allocReg(.int);
3644 defer func.register_manager.unlockReg(result_lock);3638 defer func.register_manager.unlockReg(result_lock);
36453639
...@@ -3647,7 +3641,7 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {...@@ -3647,7 +3641,7 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void {
3647 .ptr_add,3641 .ptr_add,
3648 base_ptr_mcv,3642 base_ptr_mcv,
3649 base_ptr_ty,3643 base_ptr_ty,
3650 .{ .register = offset_reg },3644 index_mcv,
3651 Type.usize,3645 Type.usize,
3652 result_reg,3646 result_reg,
3653 );3647 );
test/behavior/array.zig-12
...@@ -22,7 +22,6 @@ test "arrays" {...@@ -22,7 +22,6 @@ test "arrays" {
22 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;22 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
23 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;23 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
24 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO24 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
25 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
2625
27 var array: [5]u32 = undefined;26 var array: [5]u32 = undefined;
2827
...@@ -614,7 +613,6 @@ test "type coercion of pointer to anon struct literal to pointer to array" {...@@ -614,7 +613,6 @@ test "type coercion of pointer to anon struct literal to pointer to array" {
614 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO613 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
615 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO614 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
616 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO615 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
617 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
618616
619 const S = struct {617 const S = struct {
620 const U = union {618 const U = union {
...@@ -667,7 +665,6 @@ test "array init of container level array variable" {...@@ -667,7 +665,6 @@ test "array init of container level array variable" {
667 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO665 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
668 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO666 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
669 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO667 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
670 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
671668
672 const S = struct {669 const S = struct {
673 var pair: [2]usize = .{ 1, 2 };670 var pair: [2]usize = .{ 1, 2 };
...@@ -802,8 +799,6 @@ test "runtime side-effects in comptime-known array init" {...@@ -802,8 +799,6 @@ test "runtime side-effects in comptime-known array init" {
802}799}
803800
804test "slice initialized through reference to anonymous array init provides result types" {801test "slice initialized through reference to anonymous array init provides result types" {
805 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
806
807 var my_u32: u32 = 123;802 var my_u32: u32 = 123;
808 var my_u64: u64 = 456;803 var my_u64: u64 = 456;
809 _ = .{ &my_u32, &my_u64 };804 _ = .{ &my_u32, &my_u64 };
...@@ -817,8 +812,6 @@ test "slice initialized through reference to anonymous array init provides resul...@@ -817,8 +812,6 @@ test "slice initialized through reference to anonymous array init provides resul
817}812}
818813
819test "sentinel-terminated slice initialized through reference to anonymous array init provides result types" {814test "sentinel-terminated slice initialized through reference to anonymous array init provides result types" {
820 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
821
822 var my_u32: u32 = 123;815 var my_u32: u32 = 123;
823 var my_u64: u64 = 456;816 var my_u64: u64 = 456;
824 _ = .{ &my_u32, &my_u64 };817 _ = .{ &my_u32, &my_u64 };
...@@ -869,8 +862,6 @@ test "many-item sentinel-terminated pointer initialized through reference to ano...@@ -869,8 +862,6 @@ test "many-item sentinel-terminated pointer initialized through reference to ano
869}862}
870863
871test "pointer to array initialized through reference to anonymous array init provides result types" {864test "pointer to array initialized through reference to anonymous array init provides result types" {
872 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
873
874 var my_u32: u32 = 123;865 var my_u32: u32 = 123;
875 var my_u64: u64 = 456;866 var my_u64: u64 = 456;
876 _ = .{ &my_u32, &my_u64 };867 _ = .{ &my_u32, &my_u64 };
...@@ -884,8 +875,6 @@ test "pointer to array initialized through reference to anonymous array init pro...@@ -884,8 +875,6 @@ test "pointer to array initialized through reference to anonymous array init pro
884}875}
885876
886test "pointer to sentinel-terminated array initialized through reference to anonymous array init provides result types" {877test "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
889 var my_u32: u32 = 123;878 var my_u32: u32 = 123;
890 var my_u64: u64 = 456;879 var my_u64: u64 = 456;
891 _ = .{ &my_u32, &my_u64 };880 _ = .{ &my_u32, &my_u64 };
...@@ -912,7 +901,6 @@ test "copied array element doesn't alias source" {...@@ -912,7 +901,6 @@ test "copied array element doesn't alias source" {
912 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO901 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
913 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO902 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
914 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO903 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
915 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
916904
917 var x: [10][10]u32 = undefined;905 var x: [10][10]u32 = undefined;
918906
test/behavior/basic.zig-1
...@@ -620,7 +620,6 @@ var global_ptr = &gdt[0];...@@ -620,7 +620,6 @@ var global_ptr = &gdt[0];
620620
621test "global constant is loaded with a runtime-known index" {621test "global constant is loaded with a runtime-known index" {
622 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO622 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
623 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
624623
625 const S = struct {624 const S = struct {
626 fn doTheTest() !void {625 fn doTheTest() !void {
test/behavior/bit_shifting.zig-1
...@@ -65,7 +65,6 @@ test "sharded table" {...@@ -65,7 +65,6 @@ test "sharded table" {
65 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;65 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
66 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO66 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
67 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;67 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
68 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
6968
70 // realistic 16-way sharding69 // realistic 16-way sharding
71 try testShardedTable(u32, 4, 8);70 try testShardedTable(u32, 4, 8);
test/behavior/pointers.zig-1
...@@ -515,7 +515,6 @@ test "element pointer to slice" {...@@ -515,7 +515,6 @@ test "element pointer to slice" {
515test "element pointer arithmetic to slice" {515test "element pointer arithmetic to slice" {
516 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO516 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
517 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO517 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
518 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
519518
520 const S = struct {519 const S = struct {
521 fn doTheTest() !void {520 fn doTheTest() !void {
test/behavior/slice.zig-2
...@@ -30,7 +30,6 @@ comptime {...@@ -30,7 +30,6 @@ comptime {
3030
31test "slicing" {31test "slicing" {
32 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO32 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
33 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3433
35 var array: [20]i32 = undefined;34 var array: [20]i32 = undefined;
3635
...@@ -256,7 +255,6 @@ test "C pointer slice access" {...@@ -256,7 +255,6 @@ test "C pointer slice access" {
256 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;255 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
257 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;256 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
258 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO257 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
259 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
260258
261 var buf: [10]u32 = [1]u32{42} ** 10;259 var buf: [10]u32 = [1]u32{42} ** 10;
262 const c_ptr = @as([*c]const u32, @ptrCast(&buf));260 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" {...@@ -1700,7 +1700,6 @@ test "packed union field pointer has correct alignment" {
17001700
1701test "union with 128 bit integer" {1701test "union with 128 bit integer" {
1702 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1702 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1703 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
17041703
1705 const ValueTag = enum { int, other };1704 const ValueTag = enum { int, other };
17061705
...@@ -2196,7 +2195,6 @@ test "copied union field doesn't alias source" {...@@ -2196,7 +2195,6 @@ test "copied union field doesn't alias source" {
2196 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2195 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2197 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2196 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2198 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2197 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2199 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
22002198
2201 const U = union(enum) {2199 const U = union(enum) {
2202 array: [10]u32,2200 array: [10]u32,
test/behavior/vector.zig-4
...@@ -395,7 +395,6 @@ test "load vector elements via comptime index" {...@@ -395,7 +395,6 @@ test "load vector elements via comptime index" {
395 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO395 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
396 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO396 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
397 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO397 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
398 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
399398
400 const S = struct {399 const S = struct {
401 fn doTheTest() !void {400 fn doTheTest() !void {
...@@ -417,7 +416,6 @@ test "store vector elements via comptime index" {...@@ -417,7 +416,6 @@ test "store vector elements via comptime index" {
417 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO416 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
418 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO417 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
419 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO418 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
420 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
421419
422 const S = struct {420 const S = struct {
423 fn doTheTest() !void {421 fn doTheTest() !void {
...@@ -467,7 +465,6 @@ test "store vector elements via runtime index" {...@@ -467,7 +465,6 @@ test "store vector elements via runtime index" {
467 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO465 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
468 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO466 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
469 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO467 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
470 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
471468
472 const S = struct {469 const S = struct {
473 fn doTheTest() !void {470 fn doTheTest() !void {
...@@ -1511,7 +1508,6 @@ test "vector pointer is indexable" {...@@ -1511,7 +1508,6 @@ test "vector pointer is indexable" {
1511 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1508 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1512 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1509 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1513 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1510 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1514 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
15151511
1516 const V = @Vector(2, u32);1512 const V = @Vector(2, u32);
15171513