diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-10-02 16:05:12 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-02 16:05:12 -0400 |
| commit | 468ed7ada50c743eabe01b36d0ee9f090d80e00a (patch) | |
| tree | fc5a703aaf6211db25355fcf79a945696564f3df /src/Sema.zig | |
| parent | 05d36fce9c7fde223e6657b3dc47105fbf065695 (diff) | |
| parent | 83dcd9f0386a6bd70cf8d7dee3892f3b8d31d506 (diff) | |
| download | zig-468ed7ada50c743eabe01b36d0ee9f090d80e00a.tar.gz zig-468ed7ada50c743eabe01b36d0ee9f090d80e00a.zip | |
Merge pull request #9875 from g-w1/timestimes
stage2: emit Value.repeated for `**` with array len 1
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 7c2ef32ad3..8842a55dcc 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -6189,16 +6189,22 @@ fn zirArrayMul(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileEr try Type.Tag.array.create(anon_decl.arena(), .{ .len = final_len, .elem_type = mulinfo.elem_type }); const buf = try anon_decl.arena().alloc(Value, final_len); - // the actual loop - var i: u64 = 0; - while (i < tomulby) : (i += 1) { - var j: u64 = 0; - while (j < mulinfo.len) : (j += 1) { - const val = try lhs_sub_val.elemValue(sema.arena, j); - buf[mulinfo.len * i + j] = try val.copy(anon_decl.arena()); + // handles the optimisation where arr.len == 0 : [_]T { X } ** N + const val = if (mulinfo.len == 1) blk: { + const copied_val = try (try lhs_sub_val.elemValue(sema.arena, 0)).copy(anon_decl.arena()); + break :blk try Value.Tag.repeated.create(anon_decl.arena(), copied_val); + } else blk: { + // the actual loop + var i: u64 = 0; + while (i < tomulby) : (i += 1) { + var j: u64 = 0; + while (j < mulinfo.len) : (j += 1) { + const val = try lhs_sub_val.elemValue(sema.arena, j); + buf[mulinfo.len * i + j] = try val.copy(anon_decl.arena()); + } } - } - const val = try Value.Tag.array.create(anon_decl.arena(), buf); + break :blk try Value.Tag.array.create(anon_decl.arena(), buf); + }; if (lhs_ty.zigTypeTag() == .Pointer) { return sema.analyzeDeclRef(try anon_decl.finish(final_ty, val)); } else { |
