authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-22 06:29:58+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-07-22 06:29:58+02:00
logc41ac8f19ec96ed854d9ac31a2015006ba3e4657
tree125fb5b12917b1f7b8405f594470f54f33d6bff3
parent9abc3232a8c02f0fc6bef6ad0bad56a3804e6bc3
parent7d02b693beeb53fa7f69c55301d8c5f5581b23b2
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #24534 from ziglang/fix-missed-opvs

Sema: fix missed simplifications of OPVs

1 files changed, 33 insertions(+), 6 deletions(-)

src/Sema.zig+33-6
...@@ -5000,9 +5000,11 @@ fn validateUnionInit(...@@ -5000,9 +5000,11 @@ fn validateUnionInit(
5000 }5000 }
5001 if (init_ref) |v| try sema.validateRuntimeValue(block, block.nodeOffset(field_ptr_data.src_node), v);5001 if (init_ref) |v| try sema.validateRuntimeValue(block, block.nodeOffset(field_ptr_data.src_node), v);
50025002
5003 const new_tag = Air.internedToRef(tag_val.toIntern());5003 if ((try sema.typeHasOnePossibleValue(tag_ty)) == null) {
5004 const set_tag_inst = try block.addBinOp(.set_union_tag, union_ptr, new_tag);5004 const new_tag = Air.internedToRef(tag_val.toIntern());
5005 try sema.checkComptimeKnownStore(block, set_tag_inst, LazySrcLoc.unneeded); // `unneeded` since this isn't a "proper" store5005 const set_tag_inst = try block.addBinOp(.set_union_tag, union_ptr, new_tag);
5006 try sema.checkComptimeKnownStore(block, set_tag_inst, LazySrcLoc.unneeded); // `unneeded` since this isn't a "proper" store
5007 }
5006}5008}
50075009
5008fn validateStructInit(5010fn validateStructInit(
...@@ -6560,6 +6562,11 @@ fn resolveAnalyzedBlock(...@@ -6560,6 +6562,11 @@ fn resolveAnalyzedBlock(
6560 } },6562 } },
6561 });6563 });
6562 }6564 }
6565
6566 if (try sema.typeHasOnePossibleValue(resolved_ty)) |block_only_value| {
6567 return Air.internedToRef(block_only_value.toIntern());
6568 }
6569
6563 return merges.block_inst.toRef();6570 return merges.block_inst.toRef();
6564}6571}
65656572
...@@ -9056,6 +9063,10 @@ fn analyzeErrUnionPayload(...@@ -9056,6 +9063,10 @@ fn analyzeErrUnionPayload(
9056 try sema.addSafetyCheckUnwrapError(block, src, operand, .unwrap_errunion_err, .is_non_err);9063 try sema.addSafetyCheckUnwrapError(block, src, operand, .unwrap_errunion_err, .is_non_err);
9057 }9064 }
90589065
9066 if (try sema.typeHasOnePossibleValue(payload_ty)) |payload_only_value| {
9067 return Air.internedToRef(payload_only_value.toIntern());
9068 }
9069
9059 return block.addTyOp(.unwrap_errunion_payload, payload_ty, operand);9070 return block.addTyOp(.unwrap_errunion_payload, payload_ty, operand);
9060}9071}
90619072
...@@ -19690,8 +19701,10 @@ fn zirStructInit(...@@ -19690,8 +19701,10 @@ fn zirStructInit(
19690 const base_ptr = try sema.optEuBasePtrInit(block, alloc, src);19701 const base_ptr = try sema.optEuBasePtrInit(block, alloc, src);
19691 const field_ptr = try sema.unionFieldPtr(block, field_src, base_ptr, field_name, field_src, resolved_ty, true);19702 const field_ptr = try sema.unionFieldPtr(block, field_src, base_ptr, field_name, field_src, resolved_ty, true);
19692 try sema.storePtr(block, src, field_ptr, init_inst);19703 try sema.storePtr(block, src, field_ptr, init_inst);
19693 const new_tag = Air.internedToRef(tag_val.toIntern());19704 if ((try sema.typeHasOnePossibleValue(tag_ty)) == null) {
19694 _ = try block.addBinOp(.set_union_tag, base_ptr, new_tag);19705 const new_tag = Air.internedToRef(tag_val.toIntern());
19706 _ = try block.addBinOp(.set_union_tag, base_ptr, new_tag);
19707 }
19695 return sema.makePtrConst(block, alloc);19708 return sema.makePtrConst(block, alloc);
19696 }19709 }
1969719710
...@@ -28079,10 +28092,16 @@ fn unionFieldVal(...@@ -28079,10 +28092,16 @@ fn unionFieldVal(
28079 const active_tag = try block.addTyOp(.get_union_tag, .fromInterned(union_obj.enum_tag_ty), union_byval);28092 const active_tag = try block.addTyOp(.get_union_tag, .fromInterned(union_obj.enum_tag_ty), union_byval);
28080 try sema.addSafetyCheckInactiveUnionField(block, src, active_tag, wanted_tag);28093 try sema.addSafetyCheckInactiveUnionField(block, src, active_tag, wanted_tag);
28081 }28094 }
28095
28082 if (field_ty.zigTypeTag(zcu) == .noreturn) {28096 if (field_ty.zigTypeTag(zcu) == .noreturn) {
28083 _ = try block.addNoOp(.unreach);28097 _ = try block.addNoOp(.unreach);
28084 return .unreachable_value;28098 return .unreachable_value;
28085 }28099 }
28100
28101 if (try sema.typeHasOnePossibleValue(field_ty)) |field_only_value| {
28102 return Air.internedToRef(field_only_value.toIntern());
28103 }
28104
28086 try field_ty.resolveLayout(pt);28105 try field_ty.resolveLayout(pt);
28087 return block.addStructFieldVal(union_byval, field_index, field_ty);28106 return block.addStructFieldVal(union_byval, field_index, field_ty);
28088}28107}
...@@ -28214,12 +28233,12 @@ fn elemVal(...@@ -28214,12 +28233,12 @@ fn elemVal(
28214 .many, .c => {28233 .many, .c => {
28215 const maybe_indexable_val = try sema.resolveDefinedValue(block, indexable_src, indexable);28234 const maybe_indexable_val = try sema.resolveDefinedValue(block, indexable_src, indexable);
28216 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);28235 const maybe_index_val = try sema.resolveDefinedValue(block, elem_index_src, elem_index);
28236 const elem_ty = indexable_ty.elemType2(zcu);
2821728237
28218 ct: {28238 ct: {
28219 const indexable_val = maybe_indexable_val orelse break :ct;28239 const indexable_val = maybe_indexable_val orelse break :ct;
28220 const index_val = maybe_index_val orelse break :ct;28240 const index_val = maybe_index_val orelse break :ct;
28221 const index: usize = @intCast(try index_val.toUnsignedIntSema(pt));28241 const index: usize = @intCast(try index_val.toUnsignedIntSema(pt));
28222 const elem_ty = indexable_ty.elemType2(zcu);
28223 const many_ptr_ty = try pt.manyConstPtrType(elem_ty);28242 const many_ptr_ty = try pt.manyConstPtrType(elem_ty);
28224 const many_ptr_val = try pt.getCoerced(indexable_val, many_ptr_ty);28243 const many_ptr_val = try pt.getCoerced(indexable_val, many_ptr_ty);
28225 const elem_ptr_ty = try pt.singleConstPtrType(elem_ty);28244 const elem_ptr_ty = try pt.singleConstPtrType(elem_ty);
...@@ -28228,6 +28247,10 @@ fn elemVal(...@@ -28228,6 +28247,10 @@ fn elemVal(
28228 return Air.internedToRef((try pt.getCoerced(elem_val, elem_ty)).toIntern());28247 return Air.internedToRef((try pt.getCoerced(elem_val, elem_ty)).toIntern());
28229 }28248 }
2823028249
28250 if (try sema.typeHasOnePossibleValue(elem_ty)) |elem_only_value| {
28251 return Air.internedToRef(elem_only_value.toIntern());
28252 }
28253
28231 try sema.checkLogicalPtrOperation(block, src, indexable_ty);28254 try sema.checkLogicalPtrOperation(block, src, indexable_ty);
28232 return block.addBinOp(.ptr_elem_val, indexable, elem_index);28255 return block.addBinOp(.ptr_elem_val, indexable, elem_index);
28233 },28256 },
...@@ -28578,6 +28601,10 @@ fn elemValSlice(...@@ -28578,6 +28601,10 @@ fn elemValSlice(
28578 }28601 }
28579 }28602 }
2858028603
28604 if (try sema.typeHasOnePossibleValue(elem_ty)) |elem_only_value| {
28605 return Air.internedToRef(elem_only_value.toIntern());
28606 }
28607
28581 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, slice_ty, slice_src);28608 try sema.validateRuntimeElemAccess(block, elem_index_src, elem_ty, slice_ty, slice_src);
28582 try sema.validateRuntimeValue(block, slice_src, slice);28609 try sema.validateRuntimeValue(block, slice_src, slice);
2858328610