Skip to content

Commit 4cd7b2d

Browse files
committed
Sema: fix overflow arithmetic with runtime vectors
It should return a a vector of bools for compatibility with scalar operands and stage1 until ziglang#10248 can be implemented. Closes ziglang#13201
1 parent 32ce2f9 commit 4cd7b2d

File tree

2 files changed

+33
-25
lines changed

2 files changed

+33
-25
lines changed

src/Sema.zig

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13468,7 +13468,6 @@ fn zirOverflowArithmetic(
1346813468
const maybe_rhs_val = try sema.resolveMaybeUndefVal(rhs);
1346913469

1347013470
const tuple_ty = try sema.overflowArithmeticTupleType(dest_ty);
13471-
const ov_ty = tuple_ty.tupleFields().types[1];
1347213471
// TODO: Remove and use `ov_ty` instead.
1347313472
// This is a temporary type used until overflow arithmetic properly returns `u1` instead of `bool`.
1347413473
const overflowed_ty = if (dest_ty.zigTypeTag() == .Vector) try Type.vector(sema.arena, dest_ty.vectorLen(), Type.bool) else Type.bool;
@@ -13619,14 +13618,7 @@ fn zirOverflowArithmetic(
1361913618
try sema.storePtr2(block, src, ptr, ptr_src, wrapped, src, .store);
1362013619

1362113620
const overflow_bit = try sema.tupleFieldValByIndex(block, src, tuple, 1, tuple_ty);
13622-
const zero_ov_val = if (dest_ty.zigTypeTag() == .Vector) try Value.Tag.repeated.create(sema.arena, Value.zero) else Value.zero;
13623-
const zero_ov = try sema.addConstant(ov_ty, zero_ov_val);
13624-
13625-
const overflowed_inst = if (dest_ty.zigTypeTag() == .Vector)
13626-
block.addCmpVector(overflow_bit, .zero, .neq, try sema.addType(ov_ty))
13627-
else
13628-
block.addBinOp(.cmp_neq, overflow_bit, zero_ov);
13629-
return overflowed_inst;
13621+
return block.addBitCast(overflowed_ty, overflow_bit);
1363013622
};
1363113623

1363213624
try sema.storePtr2(block, src, ptr, ptr_src, result.wrapped, src, .store);

test/behavior/vector.zig

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -984,27 +984,35 @@ test "@addWithOverflow" {
984984
fn doTheTest() !void {
985985
{
986986
var result: @Vector(4, u8) = undefined;
987-
var overflow = @addWithOverflow(@Vector(4, u8), @Vector(4, u8){ 250, 250, 250, 250 }, @Vector(4, u8){ 0, 5, 6, 10 }, &result);
987+
var lhs = @Vector(4, u8){ 250, 250, 250, 250 };
988+
var rhs = @Vector(4, u8){ 0, 5, 6, 10 };
989+
var overflow = @addWithOverflow(@Vector(4, u8), lhs, rhs, &result);
988990
var expected: @Vector(4, bool) = .{ false, false, true, true };
989-
try expect(mem.eql(bool, &@as([4]bool, overflow), &@as([4]bool, expected)));
991+
try expectEqual(expected, overflow);
990992
}
991993
{
992994
var result: @Vector(4, i8) = undefined;
993-
var overflow = @addWithOverflow(@Vector(4, i8), @Vector(4, i8){ -125, -125, 125, 125 }, @Vector(4, i8){ -3, -4, 2, 3 }, &result);
995+
var lhs = @Vector(4, i8){ -125, -125, 125, 125 };
996+
var rhs = @Vector(4, i8){ -3, -4, 2, 3 };
997+
var overflow = @addWithOverflow(@Vector(4, i8), lhs, rhs, &result);
994998
var expected: @Vector(4, bool) = .{ false, true, false, true };
995-
try expect(mem.eql(bool, &@as([4]bool, overflow), &@as([4]bool, expected)));
999+
try expectEqual(expected, overflow);
9961000
}
9971001
{
9981002
var result: @Vector(4, u1) = undefined;
999-
var overflow = @addWithOverflow(@Vector(4, u1), @Vector(4, u1){ 0, 0, 1, 1 }, @Vector(4, u1){ 0, 1, 0, 1 }, &result);
1003+
var lhs = @Vector(4, u1){ 0, 0, 1, 1 };
1004+
var rhs = @Vector(4, u1){ 0, 1, 0, 1 };
1005+
var overflow = @addWithOverflow(@Vector(4, u1), lhs, rhs, &result);
10001006
var expected: @Vector(4, bool) = .{ false, false, false, true };
1001-
try expect(mem.eql(bool, &@as([4]bool, overflow), &@as([4]bool, expected)));
1007+
try expectEqual(expected, overflow);
10021008
}
10031009
{
10041010
var result: @Vector(4, u0) = undefined;
1005-
var overflow = @addWithOverflow(@Vector(4, u0), @Vector(4, u0){ 0, 0, 0, 0 }, @Vector(4, u0){ 0, 0, 0, 0 }, &result);
1011+
var lhs = @Vector(4, u0){ 0, 0, 0, 0 };
1012+
var rhs = @Vector(4, u0){ 0, 0, 0, 0 };
1013+
var overflow = @addWithOverflow(@Vector(4, u0), lhs, rhs, &result);
10061014
var expected: @Vector(4, bool) = .{ false, false, false, false };
1007-
try expect(mem.eql(bool, &@as([4]bool, overflow), &@as([4]bool, expected)));
1015+
try expectEqual(expected, overflow);
10081016
}
10091017
}
10101018
};
@@ -1027,15 +1035,19 @@ test "@subWithOverflow" {
10271035
fn doTheTest() !void {
10281036
{
10291037
var result: @Vector(2, u8) = undefined;
1030-
var overflow = @subWithOverflow(@Vector(2, u8), @Vector(2, u8){ 5, 5 }, @Vector(2, u8){ 5, 6 }, &result);
1038+
var lhs = @Vector(2, u8){ 5, 5 };
1039+
var rhs = @Vector(2, u8){ 5, 6 };
1040+
var overflow = @subWithOverflow(@Vector(2, u8), lhs, rhs, &result);
10311041
var expected: @Vector(2, bool) = .{ false, true };
1032-
try expect(mem.eql(bool, &@as([2]bool, overflow), &@as([2]bool, expected)));
1042+
try expectEqual(expected, overflow);
10331043
}
10341044
{
10351045
var result: @Vector(4, i8) = undefined;
1036-
var overflow = @subWithOverflow(@Vector(4, i8), @Vector(4, i8){ -120, -120, 120, 120 }, @Vector(4, i8){ 8, 9, -7, -8 }, &result);
1046+
var lhs = @Vector(4, i8){ -120, -120, 120, 120 };
1047+
var rhs = @Vector(4, i8){ 8, 9, -7, -8 };
1048+
var overflow = @subWithOverflow(@Vector(4, i8), lhs, rhs, &result);
10371049
var expected: @Vector(4, bool) = .{ false, true, false, true };
1038-
try expect(mem.eql(bool, &@as([4]bool, overflow), &@as([4]bool, expected)));
1050+
try expectEqual(expected, overflow);
10391051
}
10401052
}
10411053
};
@@ -1057,9 +1069,11 @@ test "@mulWithOverflow" {
10571069
const S = struct {
10581070
fn doTheTest() !void {
10591071
var result: @Vector(4, u8) = undefined;
1060-
var overflow = @mulWithOverflow(@Vector(4, u8), @Vector(4, u8){ 10, 10, 10, 10 }, @Vector(4, u8){ 25, 26, 0, 30 }, &result);
1072+
var lhs = @Vector(4, u8){ 10, 10, 10, 10 };
1073+
var rhs = @Vector(4, u8){ 25, 26, 0, 30 };
1074+
var overflow = @mulWithOverflow(@Vector(4, u8), lhs, rhs, &result);
10611075
var expected: @Vector(4, bool) = .{ false, true, false, true };
1062-
try expect(mem.eql(bool, &@as([4]bool, overflow), &@as([4]bool, expected)));
1076+
try expectEqual(expected, overflow);
10631077
}
10641078
};
10651079
try S.doTheTest();
@@ -1080,9 +1094,11 @@ test "@shlWithOverflow" {
10801094
const S = struct {
10811095
fn doTheTest() !void {
10821096
var result: @Vector(4, u8) = undefined;
1083-
var overflow = @shlWithOverflow(@Vector(4, u8), @Vector(4, u8){ 0, 1, 8, 255 }, @Vector(4, u3){ 7, 7, 7, 7 }, &result);
1097+
var lhs = @Vector(4, u8){ 0, 1, 8, 255 };
1098+
var rhs = @Vector(4, u3){ 7, 7, 7, 7 };
1099+
var overflow = @shlWithOverflow(@Vector(4, u8), lhs, rhs, &result);
10841100
var expected: @Vector(4, bool) = .{ false, false, true, true };
1085-
try expect(mem.eql(bool, &@as([4]bool, overflow), &@as([4]bool, expected)));
1101+
try expectEqual(expected, overflow);
10861102
}
10871103
};
10881104
try S.doTheTest();

0 commit comments

Comments
 (0)