| 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 | 3620 | defer if (base_ptr_lock) |lock| func.register_manager.unlockReg(lock); |
| 3621 | 3621 | |
| 3622 | 3622 | 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"); | |
| 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 | 3630 | const index_mcv = try func.resolveInst(extra.rhs); |
| 3633 | 3631 | const index_lock: ?RegisterLock = switch (index_mcv) { |
| 3634 | 3632 | .register => |reg| func.register_manager.lockRegAssumeUnused(reg), |
| ... | ... | @@ -3636,10 +3634,6 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void { |
| 3636 | 3634 | }; |
| 3637 | 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 | 3637 | const result_reg, const result_lock = try func.allocReg(.int); |
| 3644 | 3638 | defer func.register_manager.unlockReg(result_lock); |
| 3645 | 3639 | |
| ... | ... | @@ -3647,7 +3641,7 @@ fn airPtrElemPtr(func: *Func, inst: Air.Inst.Index) !void { |
| 3647 | 3641 | .ptr_add, |
| 3648 | 3642 | base_ptr_mcv, |
| 3649 | 3643 | base_ptr_ty, |
| 3650 | .{ .register = offset_reg }, | |
| 3644 | index_mcv, | |
| 3651 | 3645 | Type.usize, |
| 3652 | 3646 | result_reg, |
| 3653 | 3647 | ); |
test/behavior/array.zig-12| ... | ... | @@ -22,7 +22,6 @@ test "arrays" { |
| 22 | 22 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 23 | 23 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 24 | 24 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 25 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 26 | 25 | |
| 27 | 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 | 613 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 615 | 614 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 616 | 615 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 617 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 618 | 616 | |
| 619 | 617 | const S = struct { |
| 620 | 618 | const U = union { |
| ... | ... | @@ -667,7 +665,6 @@ test "array init of container level array variable" { |
| 667 | 665 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 668 | 666 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 669 | 667 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 670 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 671 | 668 | |
| 672 | 669 | const S = struct { |
| 673 | 670 | var pair: [2]usize = .{ 1, 2 }; |
| ... | ... | @@ -802,8 +799,6 @@ test "runtime side-effects in comptime-known array init" { |
| 802 | 799 | } |
| 803 | 800 | |
| 804 | 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 | 802 | var my_u32: u32 = 123; |
| 808 | 803 | var my_u64: u64 = 456; |
| 809 | 804 | _ = .{ &my_u32, &my_u64 }; |
| ... | ... | @@ -817,8 +812,6 @@ test "slice initialized through reference to anonymous array init provides resul |
| 817 | 812 | } |
| 818 | 813 | |
| 819 | 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 | 815 | var my_u32: u32 = 123; |
| 823 | 816 | var my_u64: u64 = 456; |
| 824 | 817 | _ = .{ &my_u32, &my_u64 }; |
| ... | ... | @@ -869,8 +862,6 @@ test "many-item sentinel-terminated pointer initialized through reference to ano |
| 869 | 862 | } |
| 870 | 863 | |
| 871 | 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 | 865 | var my_u32: u32 = 123; |
| 875 | 866 | var my_u64: u64 = 456; |
| 876 | 867 | _ = .{ &my_u32, &my_u64 }; |
| ... | ... | @@ -884,8 +875,6 @@ test "pointer to array initialized through reference to anonymous array init pro |
| 884 | 875 | } |
| 885 | 876 | |
| 886 | 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 | 878 | var my_u32: u32 = 123; |
| 890 | 879 | var my_u64: u64 = 456; |
| 891 | 880 | _ = .{ &my_u32, &my_u64 }; |
| ... | ... | @@ -912,7 +901,6 @@ test "copied array element doesn't alias source" { |
| 912 | 901 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 913 | 902 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 914 | 903 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 915 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 916 | 904 | |
| 917 | 905 | var x: [10][10]u32 = undefined; |
| 918 | 906 |
test/behavior/basic.zig-1| ... | ... | @@ -620,7 +620,6 @@ var global_ptr = &gdt[0]; |
| 620 | 620 | |
| 621 | 621 | test "global constant is loaded with a runtime-known index" { |
| 622 | 622 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 623 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 624 | 623 | |
| 625 | 624 | const S = struct { |
| 626 | 625 | fn doTheTest() !void { |
test/behavior/bit_shifting.zig-1| ... | ... | @@ -65,7 +65,6 @@ test "sharded table" { |
| 65 | 65 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 66 | 66 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 67 | 67 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 68 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 69 | 68 | |
| 70 | 69 | // realistic 16-way sharding |
| 71 | 70 | try testShardedTable(u32, 4, 8); |
test/behavior/pointers.zig-1| ... | ... | @@ -515,7 +515,6 @@ test "element pointer to slice" { |
| 515 | 515 | test "element pointer arithmetic to slice" { |
| 516 | 516 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 517 | 517 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 518 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 519 | 518 | |
| 520 | 519 | const S = struct { |
| 521 | 520 | fn doTheTest() !void { |
test/behavior/slice.zig-2| ... | ... | @@ -30,7 +30,6 @@ comptime { |
| 30 | 30 | |
| 31 | 31 | test "slicing" { |
| 32 | 32 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 33 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 34 | 33 | |
| 35 | 34 | var array: [20]i32 = undefined; |
| 36 | 35 | |
| ... | ... | @@ -256,7 +255,6 @@ test "C pointer slice access" { |
| 256 | 255 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 257 | 256 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; |
| 258 | 257 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 259 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 260 | 258 | |
| 261 | 259 | var buf: [10]u32 = [1]u32{42} ** 10; |
| 262 | 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 | 1700 | |
| 1701 | 1701 | test "union with 128 bit integer" { |
| 1702 | 1702 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 1703 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 1704 | 1703 | |
| 1705 | 1704 | const ValueTag = enum { int, other }; |
| 1706 | 1705 | |
| ... | ... | @@ -2196,7 +2195,6 @@ test "copied union field doesn't alias source" { |
| 2196 | 2195 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 2197 | 2196 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 2198 | 2197 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 2199 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 2200 | 2198 | |
| 2201 | 2199 | const U = union(enum) { |
| 2202 | 2200 | array: [10]u32, |
test/behavior/vector.zig-4| ... | ... | @@ -395,7 +395,6 @@ test "load vector elements via comptime index" { |
| 395 | 395 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 396 | 396 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 397 | 397 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 398 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 399 | 398 | |
| 400 | 399 | const S = struct { |
| 401 | 400 | fn doTheTest() !void { |
| ... | ... | @@ -417,7 +416,6 @@ test "store vector elements via comptime index" { |
| 417 | 416 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 418 | 417 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 419 | 418 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 420 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 421 | 419 | |
| 422 | 420 | const S = struct { |
| 423 | 421 | fn doTheTest() !void { |
| ... | ... | @@ -467,7 +465,6 @@ test "store vector elements via runtime index" { |
| 467 | 465 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 468 | 466 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 469 | 467 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 470 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 471 | 468 | |
| 472 | 469 | const S = struct { |
| 473 | 470 | fn doTheTest() !void { |
| ... | ... | @@ -1511,7 +1508,6 @@ test "vector pointer is indexable" { |
| 1511 | 1508 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 1512 | 1509 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1513 | 1510 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 1514 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | |
| 1515 | 1511 | |
| 1516 | 1512 | const V = @Vector(2, u32); |
| 1517 | 1513 |