| author | |
| committer | |
| log | 81ca3a1d594cb25dcd7dbedf175dd9931cad0d0f |
| tree | a192c596e186cca2bcd37808eeda28a456613ad2 |
| parent | cde6956b2128d9c28b00e0e25e27346abd1c3a88 |
| signature |
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); |
| 3621 | 3621 | ||
| 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_mcv | 3624 | // base_ptr_mcv |
| 3625 | else | 3625 | // else |
| 3626 | try func.copyToNewRegister(inst, base_ptr_mcv); | 3626 | // try func.copyToNewRegister(inst, base_ptr_mcv); |
| 3627 | @panic("audit"); | ||
| 3627 | } | 3628 | } |
| 3628 | 3629 | ||
| 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); |
| 3638 | 3636 | ||
| 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); |
| 3645 | 3639 | ||
| ... | @@ -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; // TODO | 24 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 25 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 26 | 25 | ||
| 27 | var array: [5]u32 = undefined; | 26 | var array: [5]u32 = undefined; |
| 28 | 27 | ||
| ... | @@ -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; // TODO | 613 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 615 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 614 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 616 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 615 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 617 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 618 | 616 | ||
| 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; // TODO | 665 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 668 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 666 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 669 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 667 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 670 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 671 | 668 | ||
| 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 | } |
| 803 | 800 | ||
| 804 | test "slice initialized through reference to anonymous array init provides result types" { | 801 | test "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 | } |
| 818 | 813 | ||
| 819 | test "sentinel-terminated slice initialized through reference to anonymous array init provides result types" { | 814 | test "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 | } |
| 870 | 863 | ||
| 871 | test "pointer to array initialized through reference to anonymous array init provides result types" { | 864 | test "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 | } |
| 885 | 876 | ||
| 886 | test "pointer to sentinel-terminated array initialized through reference to anonymous array init provides result types" { | 877 | test "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; // TODO | 901 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 913 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 902 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 914 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 903 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 915 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 916 | 904 | ||
| 917 | var x: [10][10]u32 = undefined; | 905 | var x: [10][10]u32 = undefined; |
| 918 | 906 |
test/behavior/basic.zig-1| ... | @@ -620,7 +620,6 @@ var global_ptr = &gdt[0]; | ... | @@ -620,7 +620,6 @@ var global_ptr = &gdt[0]; |
| 620 | 620 | ||
| 621 | test "global constant is loaded with a runtime-known index" { | 621 | test "global constant is loaded with a runtime-known index" { |
| 622 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 622 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 623 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 624 | 623 | ||
| 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; // TODO | 66 | 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; | ||
| 69 | 68 | ||
| 70 | // realistic 16-way sharding | 69 | // 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" { |
| 515 | test "element pointer arithmetic to slice" { | 515 | test "element pointer arithmetic to slice" { |
| 516 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 516 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 517 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 517 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 518 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 519 | 518 | ||
| 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 { |
| 30 | 30 | ||
| 31 | test "slicing" { | 31 | test "slicing" { |
| 32 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 32 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 33 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 34 | 33 | ||
| 35 | var array: [20]i32 = undefined; | 34 | var array: [20]i32 = undefined; |
| 36 | 35 | ||
| ... | @@ -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; // TODO | 257 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 259 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 260 | 258 | ||
| 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" { |
| 1700 | 1700 | ||
| 1701 | test "union with 128 bit integer" { | 1701 | test "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; | ||
| 1704 | 1703 | ||
| 1705 | const ValueTag = enum { int, other }; | 1704 | const ValueTag = enum { int, other }; |
| 1706 | 1705 | ||
| ... | @@ -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; // TODO | 2195 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2197 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 2196 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2198 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 2197 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2199 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 2200 | 2198 | ||
| 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; // TODO | 395 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 396 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 396 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 397 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 397 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 398 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 399 | 398 | ||
| 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; // TODO | 416 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 418 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 417 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 419 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 418 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 420 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 421 | 419 | ||
| 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; // TODO | 465 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 468 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 466 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 469 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 467 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 470 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 471 | 468 | ||
| 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; // TODO | 1508 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1512 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1509 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1513 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 1510 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1514 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | ||
| 1515 | 1511 | ||
| 1516 | const V = @Vector(2, u32); | 1512 | const V = @Vector(2, u32); |
| 1517 | 1513 |