From 74f55175d52d68e80688522f41938ee013c56d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Thu, 28 Nov 2024 16:30:49 +0100 Subject: [PATCH] test: Add some basic LLVM IR tests for atomics, volatile, and allowzero. --- test/llvm_ir.zig | 118 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 117 insertions(+), 1 deletion(-) diff --git a/test/llvm_ir.zig b/test/llvm_ir.zig index 127a5f93d4..32221d8287 100644 --- 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");