zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 74f55175d52d68e80688522f41938ee013c56d71 (tree)
parent e63e3f7a7cabb10e86e94682835fe99669a404bf
Author: Alex Rønne Petersen <alex@alexrp.com>
Date:   Thu, 28 Nov 2024 16:30:49 +0100

test: Add some basic LLVM IR tests for atomics, volatile, and allowzero.

Diffstat:
Mtest/llvm_ir.zig | 118++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 117 insertions(+), 1 deletion(-)

diff --git a/test/llvm_ir.zig b/test/llvm_ir.zig @@ -1,5 +1,121 @@ pub fn addCases(cases: *tests.LlvmIrContext) void { - _ = cases; + cases.addMatches("nonnull ptr load", + \\export fn entry(ptr: *i16) i16 { + \\ return ptr.*; + \\} + , &.{ + "ptr nonnull", + "load i16, ptr %0", + }, .{}); + + cases.addMatches("nonnull ptr store", + \\export fn entry(ptr: *i16) void { + \\ ptr.* = 42; + \\} + , &.{ + "ptr nonnull", + "store i16 42, ptr %0", + }, .{}); + + cases.addMatches("unused acquire atomic ptr load", + \\export fn entry(ptr: *i16) void { + \\ _ = @atomicLoad(i16, ptr, .acquire); + \\} + , &.{ + "load atomic i16, ptr %0 acquire", + }, .{}); + + cases.addMatches("unused unordered atomic volatile ptr load", + \\export fn entry(ptr: *volatile i16) void { + \\ _ = @atomicLoad(i16, ptr, .unordered); + \\} + , &.{ + "load atomic volatile i16, ptr %0 unordered", + }, .{}); + + cases.addMatches("unused volatile ptr load", + \\export fn entry(ptr: *volatile i16) void { + \\ _ = ptr.*; + \\} + , &.{ + "load volatile i16, ptr %0", + }, .{}); + + cases.addMatches("dead volatile ptr store", + \\export fn entry(ptr: *volatile i16) void { + \\ ptr.* = 123; + \\ ptr.* = 321; + \\} + , &.{ + "store volatile i16 123, ptr %0", + "store volatile i16 321, ptr %0", + }, .{}); + + cases.addMatches("unused volatile slice load", + \\export fn entry(ptr: *volatile i16) void { + \\ entry2(ptr[0..1]); + \\} + \\fn entry2(ptr: []volatile i16) void { + \\ _ = ptr[0]; + \\} + , &.{ + "load volatile i16, ptr", + }, .{}); + + cases.addMatches("dead volatile slice store", + \\export fn entry(ptr: *volatile i16) void { + \\ entry2(ptr[0..1]); + \\} + \\fn entry2(ptr: []volatile i16) void { + \\ ptr[0] = 123; + \\ ptr[0] = 321; + \\} + , &.{ + "store volatile i16 123, ptr", + "store volatile i16 321, ptr", + }, .{}); + + cases.addMatches("allowzero ptr load", + \\export fn entry(ptr: *allowzero i16) i16 { + \\ return ptr.*; + \\} + , &.{ + "null_pointer_is_valid", + "load i16, ptr %0", + }, .{}); + + cases.addMatches("allowzero ptr store", + \\export fn entry(ptr: *allowzero i16) void { + \\ ptr.* = 42; + \\} + , &.{ + "null_pointer_is_valid", + "store i16 42, ptr %0", + }, .{}); + + cases.addMatches("allowzero slice load", + \\export fn entry(ptr: *allowzero i16) i16 { + \\ return entry2(ptr[0..1]); + \\} + \\fn entry2(ptr: []allowzero i16) i16 { + \\ return ptr[0]; + \\} + , &.{ + "null_pointer_is_valid", + "load i16, ptr", + }, .{}); + + cases.addMatches("allowzero slice store", + \\export fn entry(ptr: *allowzero i16) void { + \\ entry2(ptr[0..1]); + \\} + \\fn entry2(ptr: []allowzero i16) void { + \\ ptr[0] = 42; + \\} + , &.{ + "null_pointer_is_valid", + "store i16 42, ptr", + }, .{}); } const std = @import("std");