| ... | @@ -1,5 +1,121 @@ | ... | @@ -1,5 +1,121 @@ |
| 1 | pub fn addCases(cases: *tests.LlvmIrContext) void { | 1 | pub fn addCases(cases: *tests.LlvmIrContext) void { |
| 2 | _ = cases; | 2 | cases.addMatches("nonnull ptr load", |
| | 3 | \\export fn entry(ptr: *i16) i16 { |
| | 4 | \\ return ptr.*; |
| | 5 | \\} |
| | 6 | , &.{ |
| | 7 | "ptr nonnull", |
| | 8 | "load i16, ptr %0", |
| | 9 | }, .{}); |
| | 10 | |
| | 11 | cases.addMatches("nonnull ptr store", |
| | 12 | \\export fn entry(ptr: *i16) void { |
| | 13 | \\ ptr.* = 42; |
| | 14 | \\} |
| | 15 | , &.{ |
| | 16 | "ptr nonnull", |
| | 17 | "store i16 42, ptr %0", |
| | 18 | }, .{}); |
| | 19 | |
| | 20 | cases.addMatches("unused acquire atomic ptr load", |
| | 21 | \\export fn entry(ptr: *i16) void { |
| | 22 | \\ _ = @atomicLoad(i16, ptr, .acquire); |
| | 23 | \\} |
| | 24 | , &.{ |
| | 25 | "load atomic i16, ptr %0 acquire", |
| | 26 | }, .{}); |
| | 27 | |
| | 28 | cases.addMatches("unused unordered atomic volatile ptr load", |
| | 29 | \\export fn entry(ptr: *volatile i16) void { |
| | 30 | \\ _ = @atomicLoad(i16, ptr, .unordered); |
| | 31 | \\} |
| | 32 | , &.{ |
| | 33 | "load atomic volatile i16, ptr %0 unordered", |
| | 34 | }, .{}); |
| | 35 | |
| | 36 | cases.addMatches("unused volatile ptr load", |
| | 37 | \\export fn entry(ptr: *volatile i16) void { |
| | 38 | \\ _ = ptr.*; |
| | 39 | \\} |
| | 40 | , &.{ |
| | 41 | "load volatile i16, ptr %0", |
| | 42 | }, .{}); |
| | 43 | |
| | 44 | cases.addMatches("dead volatile ptr store", |
| | 45 | \\export fn entry(ptr: *volatile i16) void { |
| | 46 | \\ ptr.* = 123; |
| | 47 | \\ ptr.* = 321; |
| | 48 | \\} |
| | 49 | , &.{ |
| | 50 | "store volatile i16 123, ptr %0", |
| | 51 | "store volatile i16 321, ptr %0", |
| | 52 | }, .{}); |
| | 53 | |
| | 54 | cases.addMatches("unused volatile slice load", |
| | 55 | \\export fn entry(ptr: *volatile i16) void { |
| | 56 | \\ entry2(ptr[0..1]); |
| | 57 | \\} |
| | 58 | \\fn entry2(ptr: []volatile i16) void { |
| | 59 | \\ _ = ptr[0]; |
| | 60 | \\} |
| | 61 | , &.{ |
| | 62 | "load volatile i16, ptr", |
| | 63 | }, .{}); |
| | 64 | |
| | 65 | cases.addMatches("dead volatile slice store", |
| | 66 | \\export fn entry(ptr: *volatile i16) void { |
| | 67 | \\ entry2(ptr[0..1]); |
| | 68 | \\} |
| | 69 | \\fn entry2(ptr: []volatile i16) void { |
| | 70 | \\ ptr[0] = 123; |
| | 71 | \\ ptr[0] = 321; |
| | 72 | \\} |
| | 73 | , &.{ |
| | 74 | "store volatile i16 123, ptr", |
| | 75 | "store volatile i16 321, ptr", |
| | 76 | }, .{}); |
| | 77 | |
| | 78 | cases.addMatches("allowzero ptr load", |
| | 79 | \\export fn entry(ptr: *allowzero i16) i16 { |
| | 80 | \\ return ptr.*; |
| | 81 | \\} |
| | 82 | , &.{ |
| | 83 | "null_pointer_is_valid", |
| | 84 | "load i16, ptr %0", |
| | 85 | }, .{}); |
| | 86 | |
| | 87 | cases.addMatches("allowzero ptr store", |
| | 88 | \\export fn entry(ptr: *allowzero i16) void { |
| | 89 | \\ ptr.* = 42; |
| | 90 | \\} |
| | 91 | , &.{ |
| | 92 | "null_pointer_is_valid", |
| | 93 | "store i16 42, ptr %0", |
| | 94 | }, .{}); |
| | 95 | |
| | 96 | cases.addMatches("allowzero slice load", |
| | 97 | \\export fn entry(ptr: *allowzero i16) i16 { |
| | 98 | \\ return entry2(ptr[0..1]); |
| | 99 | \\} |
| | 100 | \\fn entry2(ptr: []allowzero i16) i16 { |
| | 101 | \\ return ptr[0]; |
| | 102 | \\} |
| | 103 | , &.{ |
| | 104 | "null_pointer_is_valid", |
| | 105 | "load i16, ptr", |
| | 106 | }, .{}); |
| | 107 | |
| | 108 | cases.addMatches("allowzero slice store", |
| | 109 | \\export fn entry(ptr: *allowzero i16) void { |
| | 110 | \\ entry2(ptr[0..1]); |
| | 111 | \\} |
| | 112 | \\fn entry2(ptr: []allowzero i16) void { |
| | 113 | \\ ptr[0] = 42; |
| | 114 | \\} |
| | 115 | , &.{ |
| | 116 | "null_pointer_is_valid", |
| | 117 | "store i16 42, ptr", |
| | 118 | }, .{}); |
| 3 | } | 119 | } |
| 4 | | 120 | |
| 5 | const std = @import("std"); | 121 | const std = @import("std"); |