mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
Sema: don't rely on Liveness
We're currently experimenting with backends which effectively do their own liveness analysis, so this old trick of mine isn't necessarily valid anymore. However, we can fix that trivially: just make the "nop" instruction we jam into here have the right type. That way, the leftover field/element pointer instructions are perfectly valid, but still unused.
This commit is contained in:
parent
d0bc5efba4
commit
0d482775cc
15
src/Sema.zig
15
src/Sema.zig
@ -4113,14 +4113,13 @@ fn finishResolveComptimeKnownAllocPtr(
|
||||
// We're almost done - we have the resolved comptime value. We just need to
|
||||
// eliminate the now-dead runtime instructions.
|
||||
|
||||
// We will rewrite the AIR to eliminate the alloc and all stores to it.
|
||||
// This will cause instructions deriving field pointers etc of the alloc to
|
||||
// become invalid, however, since we are removing all stores to those pointers,
|
||||
// they will be eliminated by Liveness before they reach codegen.
|
||||
|
||||
// The specifics of this instruction aren't really important: we just want
|
||||
// Liveness to elide it.
|
||||
const nop_inst: Air.Inst = .{ .tag = .bitcast, .data = .{ .ty_op = .{ .ty = .u8_type, .operand = .zero_u8 } } };
|
||||
// This instruction has type `alloc_ty`, meaning we can rewrite the `alloc` AIR instruction to
|
||||
// this one to drop the side effect. We also need to rewrite the stores; we'll turn them to this
|
||||
// too because it doesn't really matter what they become.
|
||||
const nop_inst: Air.Inst = .{ .tag = .bitcast, .data = .{ .ty_op = .{
|
||||
.ty = .fromIntern(alloc_ty.toIntern()),
|
||||
.operand = .zero_usize,
|
||||
} } };
|
||||
|
||||
sema.air_instructions.set(@intFromEnum(alloc_inst), nop_inst);
|
||||
for (comptime_info.stores.items(.inst)) |store_inst| {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user