authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-09-15 14:41:00-07:00
committergravatar for mlugg@mlugg.co.ukMatthew Lugg <mlugg@mlugg.co.uk> 2024-09-16 16:42:42+01:00
log7f60d2e4658ad78839ce0fce63a95dbcb893a256
treea8706d5a8eff95360b271173be2f7cac09f4d3b6
parent1365be5d02429dbbbfab43133d399b2af42047c5
signaturelock-open Commit is signed but in an unrecognized format.

riscv: fix up `ptr_elem_val` to not doubly lock


1 files changed, 10 insertions(+), 7 deletions(-)

src/arch/riscv64/CodeGen.zig+10-7
......@@ -3897,7 +3897,7 @@ fn airArrayElemVal(func: *Func, inst: Air.Inst.Index) !void {
38973897
38983898 if (array_ty.isVector(zcu)) {
38993899 // we need to load the vector, vslidedown to get the element we want
3900 // and store that element at in a load frame.
3900 // and store that element in a load frame.
39013901
39023902 const src_reg, const src_lock = try func.allocReg(.vector);
39033903 defer func.register_manager.unlockReg(src_lock);
......@@ -3970,12 +3970,15 @@ fn airPtrElemVal(func: *Func, inst: Air.Inst.Index) !void {
39703970 };
39713971 defer if (index_lock) |lock| func.register_manager.unlockReg(lock);
39723972
3973 const elem_ptr_reg = if (base_ptr_mcv.isRegister() and func.liveness.operandDies(inst, 0))
3974 base_ptr_mcv.register
3975 else
3976 try func.copyToTmpRegister(base_ptr_ty, base_ptr_mcv);
3977 const elem_ptr_lock = func.register_manager.lockRegAssumeUnused(elem_ptr_reg);
3978 defer func.register_manager.unlockReg(elem_ptr_lock);
3973 const elem_ptr_reg, const elem_ptr_lock = if (base_ptr_mcv.isRegister() and
3974 func.liveness.operandDies(inst, 0))
3975 .{ base_ptr_mcv.register, null }
3976 else blk: {
3977 const reg, const lock = try func.allocReg(.int);
3978 try func.genSetReg(base_ptr_ty, reg, base_ptr_mcv);
3979 break :blk .{ reg, lock };
3980 };
3981 defer if (elem_ptr_lock) |lock| func.register_manager.unlockReg(lock);
39793982
39803983 try func.genBinOp(
39813984 .ptr_add,