| ... | ... | @@ -1630,7 +1630,6 @@ pub const DeclGen = struct { |
| 1630 | 1630 | /// Convert representation from indirect (in memory) to direct (in 'register') |
| 1631 | 1631 | /// This converts the argument type from resolveType(ty, .indirect) to resolveType(ty, .direct). |
| 1632 | 1632 | fn convertToDirect(self: *DeclGen, ty: Type, operand_id: IdRef) !IdRef { |
| 1633 | | // const direct_ty_ref = try self.resolveType(ty, .direct); |
| 1634 | 1633 | return switch (ty.zigTypeTag()) { |
| 1635 | 1634 | .Bool => blk: { |
| 1636 | 1635 | const direct_bool_ty_ref = try self.resolveType(ty, .direct); |
| ... | ... | @@ -2370,11 +2369,7 @@ pub const DeclGen = struct { |
| 2370 | 2369 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 2371 | 2370 | const field_ty = self.air.typeOfIndex(inst); |
| 2372 | 2371 | const operand_id = try self.resolve(ty_op.operand); |
| 2373 | | return try self.extractField( |
| 2374 | | field_ty, |
| 2375 | | operand_id, |
| 2376 | | field, |
| 2377 | | ); |
| 2372 | return try self.extractField(field_ty, operand_id, field); |
| 2378 | 2373 | } |
| 2379 | 2374 | |
| 2380 | 2375 | fn airSliceElemPtr(self: *DeclGen, inst: Air.Inst.Index) !?IdRef { |
| ... | ... | @@ -2382,23 +2377,14 @@ pub const DeclGen = struct { |
| 2382 | 2377 | const slice_ty = self.air.typeOf(bin_op.lhs); |
| 2383 | 2378 | if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null; |
| 2384 | 2379 | |
| 2385 | | const slice = try self.resolve(bin_op.lhs); |
| 2386 | | const index = try self.resolve(bin_op.rhs); |
| 2380 | const slice_id = try self.resolve(bin_op.lhs); |
| 2381 | const index_id = try self.resolve(bin_op.rhs); |
| 2387 | 2382 | |
| 2388 | | const ptr_ty_ref = try self.resolveType(self.air.typeOfIndex(inst), .direct); |
| 2389 | | |
| 2390 | | const slice_ptr = blk: { |
| 2391 | | const result_id = self.spv.allocId(); |
| 2392 | | try self.func.body.emit(self.spv.gpa, .OpCompositeExtract, .{ |
| 2393 | | .id_result_type = self.typeId(ptr_ty_ref), |
| 2394 | | .id_result = result_id, |
| 2395 | | .composite = slice, |
| 2396 | | .indexes = &.{0}, |
| 2397 | | }); |
| 2398 | | break :blk result_id; |
| 2399 | | }; |
| 2383 | const ptr_ty = self.air.typeOfIndex(inst); |
| 2384 | const ptr_ty_ref = try self.resolveType(ptr_ty, .direct); |
| 2400 | 2385 | |
| 2401 | | return try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index, &.{}); |
| 2386 | const slice_ptr = try self.extractField(ptr_ty, slice_id, 0); |
| 2387 | return try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index_id, &.{}); |
| 2402 | 2388 | } |
| 2403 | 2389 | |
| 2404 | 2390 | fn airSliceElemVal(self: *DeclGen, inst: Air.Inst.Index) !?IdRef { |
| ... | ... | @@ -2406,24 +2392,15 @@ pub const DeclGen = struct { |
| 2406 | 2392 | const slice_ty = self.air.typeOf(bin_op.lhs); |
| 2407 | 2393 | if (!slice_ty.isVolatilePtr() and self.liveness.isUnused(inst)) return null; |
| 2408 | 2394 | |
| 2409 | | const slice = try self.resolve(bin_op.lhs); |
| 2410 | | const index = try self.resolve(bin_op.rhs); |
| 2395 | const slice_id = try self.resolve(bin_op.lhs); |
| 2396 | const index_id = try self.resolve(bin_op.rhs); |
| 2411 | 2397 | |
| 2412 | 2398 | var slice_buf: Type.SlicePtrFieldTypeBuffer = undefined; |
| 2413 | | const ptr_ty_ref = try self.resolveType(slice_ty.slicePtrFieldType(&slice_buf), .direct); |
| 2414 | | |
| 2415 | | const slice_ptr = blk: { |
| 2416 | | const result_id = self.spv.allocId(); |
| 2417 | | try self.func.body.emit(self.spv.gpa, .OpCompositeExtract, .{ |
| 2418 | | .id_result_type = self.typeId(ptr_ty_ref), |
| 2419 | | .id_result = result_id, |
| 2420 | | .composite = slice, |
| 2421 | | .indexes = &.{0}, |
| 2422 | | }); |
| 2423 | | break :blk result_id; |
| 2424 | | }; |
| 2399 | const ptr_ty = slice_ty.slicePtrFieldType(&slice_buf); |
| 2400 | const ptr_ty_ref = try self.resolveType(ptr_ty, .direct); |
| 2425 | 2401 | |
| 2426 | | const elem_ptr = try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index, &.{}); |
| 2402 | const slice_ptr = try self.extractField(ptr_ty, slice_id, 0); |
| 2403 | const elem_ptr = try self.ptrAccessChain(ptr_ty_ref, slice_ptr, index_id, &.{}); |
| 2427 | 2404 | return try self.load(slice_ty, elem_ptr); |
| 2428 | 2405 | } |
| 2429 | 2406 | |
| ... | ... | @@ -2459,24 +2436,15 @@ pub const DeclGen = struct { |
| 2459 | 2436 | const struct_field = self.air.extraData(Air.StructField, ty_pl.payload).data; |
| 2460 | 2437 | |
| 2461 | 2438 | const struct_ty = self.air.typeOf(struct_field.struct_operand); |
| 2462 | | const object = try self.resolve(struct_field.struct_operand); |
| 2439 | const object_id = try self.resolve(struct_field.struct_operand); |
| 2463 | 2440 | const field_index = struct_field.field_index; |
| 2464 | 2441 | const field_ty = struct_ty.structFieldType(field_index); |
| 2465 | | const field_ty_id = try self.resolveTypeId(field_ty); |
| 2466 | 2442 | |
| 2467 | 2443 | if (!field_ty.hasRuntimeBitsIgnoreComptime()) return null; |
| 2468 | 2444 | |
| 2469 | 2445 | assert(struct_ty.zigTypeTag() == .Struct); // Cannot do unions yet. |
| 2470 | 2446 | |
| 2471 | | const result_id = self.spv.allocId(); |
| 2472 | | const indexes = [_]u32{field_index}; |
| 2473 | | try self.func.body.emit(self.spv.gpa, .OpCompositeExtract, .{ |
| 2474 | | .id_result_type = field_ty_id, |
| 2475 | | .id_result = result_id, |
| 2476 | | .composite = object, |
| 2477 | | .indexes = &indexes, |
| 2478 | | }); |
| 2479 | | return result_id; |
| 2447 | return try self.extractField(field_ty, object_id, field_index); |
| 2480 | 2448 | } |
| 2481 | 2449 | |
| 2482 | 2450 | fn structFieldPtr( |