aboutsummaryrefslogtreecommitdiff
path: root/test/llvm_ir.zig
blob: 32221d82878f48be7159a28404dfe3719650c6d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
pub fn addCases(cases: *tests.LlvmIrContext) void {
    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");
const tests = @import("tests.zig");