commit b6981686649ab74b91ebb27bec8a29658b3d3923 (tree)
parent 15f111a085dcd2da7b91da8e29b89def24cb3c6a
Author: Andrew Kelley <andrew@ziglang.org>
Date: Sun, 3 Jul 2022 13:33:09 -0700
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.
Diffstat:
2 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/src/type.zig b/src/type.zig
@@ -2909,8 +2909,8 @@ pub const Type = extern union {
.vector => {
const len = ty.arrayLen();
const bits = try bitSizeAdvanced(ty.elemType(), target, sema_kit);
- const bytes = (bits + 7) / 8;
- const alignment = std.math.ceilPowerOfTwoAssert(u64, bytes * len);
+ const bytes = ((bits * len) + 7) / 8;
+ const alignment = std.math.ceilPowerOfTwoAssert(u64, bytes);
return AbiAlignmentAdvanced{ .scalar = @intCast(u32, alignment) };
},
diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig
@@ -5,6 +5,12 @@ const math = std.math;
const expect = std.testing.expect;
test "implicit cast vector to array - bool" {
+ if (builtin.zig_backend == .stage1) {
+ // Regressed in LLVM 14:
+ // https://github.com/llvm/llvm-project/issues/55522
+ return error.SkipZigTest;
+ }
+
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
@@ -391,6 +397,12 @@ test "initialize vector which is a struct field" {
}
test "vector comparison operators" {
+ if (builtin.zig_backend == .stage1) {
+ // Regressed in LLVM 14:
+ // https://github.com/llvm/llvm-project/issues/55522
+ return error.SkipZigTest;
+ }
+
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
@@ -1051,7 +1063,7 @@ test "@shlWithOverflow" {
test "alignment of vectors" {
try expect(@alignOf(@Vector(2, u8)) == 2);
- try expect(@alignOf(@Vector(2, u1)) == 2);
+ try expect(@alignOf(@Vector(2, u1)) == 1);
try expect(@alignOf(@Vector(1, u1)) == 1);
try expect(@alignOf(@Vector(2, u16)) == 4);
}