stage2: optimize size of optional slices
This commit is contained in:
@@ -726,7 +726,11 @@ pub const DeclGen = struct {
|
||||
}
|
||||
|
||||
if (ty.optionalReprIsPayload()) {
|
||||
return dg.renderValue(writer, payload_ty, val, location);
|
||||
if (val.castTag(.opt_payload)) |payload| {
|
||||
return dg.renderValue(writer, payload_ty, payload.data, location);
|
||||
} else {
|
||||
return dg.renderValue(writer, payload_ty, val, location);
|
||||
}
|
||||
}
|
||||
|
||||
try writer.writeByte('(');
|
||||
@@ -3263,11 +3267,9 @@ fn airIsNull(
|
||||
try f.writeCValue(writer, operand);
|
||||
|
||||
const ty = f.air.typeOf(un_op);
|
||||
const opt_ty = if (deref_suffix[0] != 0) ty.childType() else ty;
|
||||
var opt_buf: Type.Payload.ElemType = undefined;
|
||||
const payload_ty = if (deref_suffix[0] != 0)
|
||||
ty.childType().optionalChild(&opt_buf)
|
||||
else
|
||||
ty.optionalChild(&opt_buf);
|
||||
const payload_ty = opt_ty.optionalChild(&opt_buf);
|
||||
|
||||
if (!payload_ty.hasRuntimeBitsIgnoreComptime()) {
|
||||
try writer.print("){s} {s} true;\n", .{ deref_suffix, operator });
|
||||
@@ -3276,6 +3278,8 @@ fn airIsNull(
|
||||
try writer.print("){s} {s} NULL;\n", .{ deref_suffix, operator });
|
||||
} else if (payload_ty.zigTypeTag() == .ErrorSet) {
|
||||
try writer.print("){s} {s} 0;\n", .{ deref_suffix, operator });
|
||||
} else if (payload_ty.isSlice() and opt_ty.optionalReprIsPayload()) {
|
||||
try writer.print("){s}.ptr {s} NULL;\n", .{ deref_suffix, operator });
|
||||
} else {
|
||||
try writer.print("){s}.is_null {s} true;\n", .{ deref_suffix, operator });
|
||||
}
|
||||
|
||||
@@ -6316,18 +6316,24 @@ pub const FuncGen = struct {
|
||||
const operand_ty = self.air.typeOf(un_op);
|
||||
const optional_ty = if (operand_is_ptr) operand_ty.childType() else operand_ty;
|
||||
const optional_llvm_ty = try self.dg.lowerType(optional_ty);
|
||||
var buf: Type.Payload.ElemType = undefined;
|
||||
const payload_ty = optional_ty.optionalChild(&buf);
|
||||
if (optional_ty.optionalReprIsPayload()) {
|
||||
const loaded = if (operand_is_ptr)
|
||||
self.builder.buildLoad(optional_llvm_ty, operand, "")
|
||||
else
|
||||
operand;
|
||||
if (payload_ty.isSlice()) {
|
||||
const slice_ptr = self.builder.buildExtractValue(loaded, 0, "");
|
||||
var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined;
|
||||
const ptr_ty = try self.dg.lowerType(payload_ty.slicePtrFieldType(&slice_buf));
|
||||
return self.builder.buildICmp(pred, slice_ptr, ptr_ty.constNull(), "");
|
||||
}
|
||||
return self.builder.buildICmp(pred, loaded, optional_llvm_ty.constNull(), "");
|
||||
}
|
||||
|
||||
comptime assert(optional_layout_version == 3);
|
||||
|
||||
var buf: Type.Payload.ElemType = undefined;
|
||||
const payload_ty = optional_ty.optionalChild(&buf);
|
||||
if (!payload_ty.hasRuntimeBitsIgnoreComptime()) {
|
||||
const loaded = if (operand_is_ptr)
|
||||
self.builder.buildLoad(optional_llvm_ty, operand, "")
|
||||
|
||||
Reference in New Issue
Block a user