From 00b690540e561391d17c65e45f818db6be8fecec Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 26 Apr 2023 12:49:32 -0700 Subject: llvm backend: fix lowering of memset The bitcast of ABI size 1 elements was problematic for some types. --- test/behavior.zig | 1 + 1 file changed, 1 insertion(+) (limited to 'test/behavior.zig') diff --git a/test/behavior.zig b/test/behavior.zig index b6fe8d120f..c75e7bc788 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -177,6 +177,7 @@ test { _ = @import("behavior/math.zig"); _ = @import("behavior/maximum_minimum.zig"); _ = @import("behavior/member_func.zig"); + _ = @import("behavior/memset.zig"); _ = @import("behavior/merge_error_sets.zig"); _ = @import("behavior/muladd.zig"); _ = @import("behavior/namespace_depends_on_compile_var.zig"); -- cgit v1.2.3 From 73d3fb9883c1d89fd1460a18f186a1737613bfbc Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 27 Apr 2023 14:01:16 -0700 Subject: C backend: fix ptr comparison of array ptrs when one is null-terminated --- src/codegen/c.zig | 2 +- test/behavior.zig | 1 + test/behavior/memcpy.zig | 44 ++++++++++++++++++++++++++++++++++++++++++++ test/behavior/memset.zig | 21 --------------------- 4 files changed, 46 insertions(+), 22 deletions(-) create mode 100644 test/behavior/memcpy.zig (limited to 'test/behavior.zig') diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 27b04cee8e..a97d7c0b70 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -3858,7 +3858,7 @@ fn airCmpOp( try reap(f, inst, &.{ data.lhs, data.rhs }); const rhs_ty = f.air.typeOf(data.rhs); - const need_cast = lhs_ty.isSinglePointer() != rhs_ty.isSinglePointer(); + const need_cast = lhs_ty.isSinglePointer() or rhs_ty.isSinglePointer(); const writer = f.object.writer(); const local = try f.allocLocal(inst, inst_ty); const v = try Vectorize.start(f, inst, writer, lhs_ty); diff --git a/test/behavior.zig b/test/behavior.zig index c75e7bc788..70293bf45d 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -177,6 +177,7 @@ test { _ = @import("behavior/math.zig"); _ = @import("behavior/maximum_minimum.zig"); _ = @import("behavior/member_func.zig"); + _ = @import("behavior/memcpy.zig"); _ = @import("behavior/memset.zig"); _ = @import("behavior/merge_error_sets.zig"); _ = @import("behavior/muladd.zig"); diff --git a/test/behavior/memcpy.zig b/test/behavior/memcpy.zig new file mode 100644 index 0000000000..1d99a7163b --- /dev/null +++ b/test/behavior/memcpy.zig @@ -0,0 +1,44 @@ +const std = @import("std"); +const builtin = @import("builtin"); +const expect = std.testing.expect; + +test "memcpy and memset intrinsics" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO + + try testMemcpyMemset(); + try comptime testMemcpyMemset(); +} + +fn testMemcpyMemset() !void { + var foo: [20]u8 = undefined; + var bar: [20]u8 = undefined; + + @memset(&foo, 'A'); + @memcpy(&bar, &foo); + + try expect(bar[0] == 'A'); + try expect(bar[11] == 'A'); + try expect(bar[19] == 'A'); +} + +test "@memcpy with both operands single-ptr-to-array, one is null-terminated" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; + if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; + + try testMemcpyBothSinglePtrArrayOneIsNullTerminated(); + try comptime testMemcpyBothSinglePtrArrayOneIsNullTerminated(); +} + +fn testMemcpyBothSinglePtrArrayOneIsNullTerminated() !void { + var buf: [100]u8 = undefined; + const suffix = "hello"; + @memcpy(buf[buf.len - suffix.len ..], suffix); + try expect(buf[95] == 'h'); + try expect(buf[96] == 'e'); + try expect(buf[97] == 'l'); + try expect(buf[98] == 'l'); + try expect(buf[99] == 'o'); +} diff --git a/test/behavior/memset.zig b/test/behavior/memset.zig index 67f7d7344d..89e01a0e56 100644 --- a/test/behavior/memset.zig +++ b/test/behavior/memset.zig @@ -142,24 +142,3 @@ test "memset with large array element, comptime known" { for (buf[3]) |elem| try expect(elem == 0); for (buf[4]) |elem| try expect(elem == 0); } - -test "memcpy and memset intrinsics" { - if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; - if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO - - try testMemcpyMemset(); - try comptime testMemcpyMemset(); -} - -fn testMemcpyMemset() !void { - var foo: [20]u8 = undefined; - var bar: [20]u8 = undefined; - - @memset(&foo, 'A'); - @memcpy(&bar, &foo); - - try expect(bar[0] == 'A'); - try expect(bar[11] == 'A'); - try expect(bar[19] == 'A'); -} -- cgit v1.2.3