From b6981686649ab74b91ebb27bec8a29658b3d3923 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 3 Jul 2022 13:33:09 -0700 Subject: [PATCH] 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. --- src/type.zig | 4 ++-- test/behavior/vector.zig | 14 +++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/type.zig b/src/type.zig index 55466efe4a282378b3f07090ae92c82f98291f9c..75a19d6330ded95fd07c08b50aca4f732a274f79 100644 --- 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 index e355db51667ef1e1cd9fd1cc2b2eb3eac9fe90bc..a1785fcffb959d3d140af3ef55c5b2b4baab49c7 100644 --- 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); } -- 2.54.0