aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorJacob G-W <jacoblevgw@gmail.com>2021-09-30 21:31:46 -0400
committerJacob G-W <jacoblevgw@gmail.com>2021-10-01 16:46:28 -0400
commit83dcd9f0386a6bd70cf8d7dee3892f3b8d31d506 (patch)
tree6e531bf3dd6d39647a7971cae1d021900ea31055 /src/Sema.zig
parentb0e89ee499b8110bca6964e996c5862337147e32 (diff)
downloadzig-83dcd9f0386a6bd70cf8d7dee3892f3b8d31d506.tar.gz
zig-83dcd9f0386a6bd70cf8d7dee3892f3b8d31d506.zip
stage2: emit Value.repeated for `**` where the array size is one
This takes advantage of the repeated value.
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig24
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 {