authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-03 13:33:09-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-03 13:33:09-07:00
logb6981686649ab74b91ebb27bec8a29658b3d3923
tree810f4e48b4e4612a110ef0d31f89eda9bf9ad4b8
parent15f111a085dcd2da7b91da8e29b89def24cb3c6a

stage2: update vector alignment logic

This follows LLVM14's lead on vector alignment, which computes byte count based on the length premultiplied by bits. This commit also disables behavior tests regressed by LLVM 14, only for stage1. stage2 fortunately does not trip the regression.

2 files changed, 15 insertions(+), 3 deletions(-)

src/type.zig+2-2
...@@ -2909,8 +2909,8 @@ pub const Type = extern union {...@@ -2909,8 +2909,8 @@ pub const Type = extern union {
2909 .vector => {2909 .vector => {
2910 const len = ty.arrayLen();2910 const len = ty.arrayLen();
2911 const bits = try bitSizeAdvanced(ty.elemType(), target, sema_kit);2911 const bits = try bitSizeAdvanced(ty.elemType(), target, sema_kit);
2912 const bytes = (bits + 7) / 8;2912 const bytes = ((bits * len) + 7) / 8;
2913 const alignment = std.math.ceilPowerOfTwoAssert(u64, bytes * len);2913 const alignment = std.math.ceilPowerOfTwoAssert(u64, bytes);
2914 return AbiAlignmentAdvanced{ .scalar = @intCast(u32, alignment) };2914 return AbiAlignmentAdvanced{ .scalar = @intCast(u32, alignment) };
2915 },2915 },
29162916
test/behavior/vector.zig+13-1
...@@ -5,6 +5,12 @@ const math = std.math;...@@ -5,6 +5,12 @@ const math = std.math;
5const expect = std.testing.expect;5const expect = std.testing.expect;
66
7test "implicit cast vector to array - bool" {7test "implicit cast vector to array - bool" {
8 if (builtin.zig_backend == .stage1) {
9 // Regressed in LLVM 14:
10 // https://github.com/llvm/llvm-project/issues/55522
11 return error.SkipZigTest;
12 }
13
8 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO14 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO15 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO16 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -391,6 +397,12 @@ test "initialize vector which is a struct field" {...@@ -391,6 +397,12 @@ test "initialize vector which is a struct field" {
391}397}
392398
393test "vector comparison operators" {399test "vector comparison operators" {
400 if (builtin.zig_backend == .stage1) {
401 // Regressed in LLVM 14:
402 // https://github.com/llvm/llvm-project/issues/55522
403 return error.SkipZigTest;
404 }
405
394 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO406 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
395 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO407 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
396 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO408 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
...@@ -1051,7 +1063,7 @@ test "@shlWithOverflow" {...@@ -1051,7 +1063,7 @@ test "@shlWithOverflow" {
10511063
1052test "alignment of vectors" {1064test "alignment of vectors" {
1053 try expect(@alignOf(@Vector(2, u8)) == 2);1065 try expect(@alignOf(@Vector(2, u8)) == 2);
1054 try expect(@alignOf(@Vector(2, u1)) == 2);1066 try expect(@alignOf(@Vector(2, u1)) == 1);
1055 try expect(@alignOf(@Vector(1, u1)) == 1);1067 try expect(@alignOf(@Vector(1, u1)) == 1);
1056 try expect(@alignOf(@Vector(2, u16)) == 4);1068 try expect(@alignOf(@Vector(2, u16)) == 4);
1057}1069}