Sema: defer stores to inferred allocs
This lets us generate the store with knowledge of the type to be stored. Therefore, we can avoid generating garbage Air with stores through pointers to comptime-only types which backends cannot lower. Closes #13410 Closes #15122
This commit is contained in:
committed by
Veikka Tuominen
parent
878163e588
commit
f4b411314c
@@ -3597,10 +3597,6 @@ fn airStore(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
const ptr_ty = f.air.typeOf(bin_op.lhs);
|
||||
const ptr_scalar_ty = ptr_ty.scalarType();
|
||||
const ptr_info = ptr_scalar_ty.ptrInfo().data;
|
||||
if (!ptr_info.pointee_type.hasRuntimeBitsIgnoreComptime()) {
|
||||
try reap(f, inst, &.{ bin_op.lhs, bin_op.rhs });
|
||||
return .none;
|
||||
}
|
||||
|
||||
const ptr_val = try f.resolveInst(bin_op.lhs);
|
||||
const src_ty = f.air.typeOf(bin_op.rhs);
|
||||
@@ -4461,9 +4457,7 @@ fn airBr(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
fn airBitcast(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
const ty_op = f.air.instructions.items(.data)[inst].ty_op;
|
||||
const dest_ty = f.air.typeOfIndex(inst);
|
||||
// No IgnoreComptime until Sema stops giving us garbage Air.
|
||||
// https://github.com/ziglang/zig/issues/13410
|
||||
if (f.liveness.isUnused(inst) or !dest_ty.hasRuntimeBits()) {
|
||||
if (f.liveness.isUnused(inst)) {
|
||||
try reap(f, inst, &.{ty_op.operand});
|
||||
return .none;
|
||||
}
|
||||
|
||||
@@ -8216,7 +8216,6 @@ pub const FuncGen = struct {
|
||||
const dest_ptr = try self.resolveInst(bin_op.lhs);
|
||||
const ptr_ty = self.air.typeOf(bin_op.lhs);
|
||||
const operand_ty = ptr_ty.childType();
|
||||
if (!operand_ty.isFnOrHasRuntimeBitsIgnoreComptime()) return null;
|
||||
|
||||
// TODO Sema should emit a different instruction when the store should
|
||||
// possibly do the safety 0xaa bytes for undefined.
|
||||
|
||||
Reference in New Issue
Block a user