1target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 2target triple = "aarch64-unknown-linux" 3 4attributes #0 = { noinline sanitize_memtag "target-features"="+mte,+neon" } 5 6define dso_local void @Write1(ptr %p) #0 { 7entry: 8 store i8 0, ptr %p, align 1 9 ret void 10} 11 12define dso_local void @Write4(ptr %p) #0 { 13entry: 14 store i32 0, ptr %p, align 1 15 ret void 16} 17 18define dso_local void @Write4_2(ptr %p, ptr %q) #0 { 19entry: 20 store i32 0, ptr %p, align 1 21 store i32 0, ptr %q, align 1 22 ret void 23} 24 25define dso_local void @Write8(ptr %p) #0 { 26entry: 27 store i64 0, ptr %p, align 1 28 ret void 29} 30 31define dso_local ptr @WriteAndReturn8(ptr %p) #0 { 32entry: 33 store i8 0, ptr %p, align 1 34 ret ptr %p 35} 36 37declare dso_local void @ExternalCall(ptr %p) 38 39define dso_preemptable void @PreemptableWrite1(ptr %p) #0 { 40entry: 41 store i8 0, ptr %p, align 1 42 ret void 43} 44 45define linkonce dso_local void @InterposableWrite1(ptr %p) #0 { 46entry: 47 store i8 0, ptr %p, align 1 48 ret void 49} 50 51define dso_local ptr @ReturnDependent(ptr %p) #0 { 52entry: 53 %p2 = getelementptr i8, ptr %p, i64 2 54 ret ptr %p2 55} 56 57; access range [2, 6) 58define dso_local void @Rec0(ptr %p) #0 { 59entry: 60 %p1 = getelementptr i8, ptr %p, i64 2 61 call void @Write4(ptr %p1) 62 ret void 63} 64 65; access range [3, 7) 66define dso_local void @Rec1(ptr %p) #0 { 67entry: 68 %p1 = getelementptr i8, ptr %p, i64 1 69 call void @Rec0(ptr %p1) 70 ret void 71} 72 73; access range [-2, 2) 74define dso_local void @Rec2(ptr %p) #0 { 75entry: 76 %p1 = getelementptr i8, ptr %p, i64 -5 77 call void @Rec1(ptr %p1) 78 ret void 79} 80 81; Recursive function that passes %acc unchanged => access range [0, 4). 82define dso_local void @RecursiveNoOffset(ptr %p, i32 %size, ptr %acc) { 83entry: 84 %cmp = icmp eq i32 %size, 0 85 br i1 %cmp, label %return, label %if.end 86 87if.end: 88 %load0 = load i32, ptr %p, align 4 89 %load1 = load i32, ptr %acc, align 4 90 %add = add nsw i32 %load1, %load0 91 store i32 %add, ptr %acc, align 4 92 %add.ptr = getelementptr inbounds i32, ptr %p, i64 1 93 %sub = add nsw i32 %size, -1 94 tail call void @RecursiveNoOffset(ptr %add.ptr, i32 %sub, ptr %acc) 95 ret void 96 97return: 98 ret void 99} 100 101; Recursive function that advances %acc on each iteration => access range unlimited. 102define dso_local void @RecursiveWithOffset(i32 %size, ptr %acc) { 103entry: 104 %cmp = icmp eq i32 %size, 0 105 br i1 %cmp, label %return, label %if.end 106 107if.end: 108 store i32 0, ptr %acc, align 4 109 %acc2 = getelementptr inbounds i32, ptr %acc, i64 1 110 %sub = add nsw i32 %size, -1 111 tail call void @RecursiveWithOffset(i32 %sub, ptr %acc2) 112 ret void 113 114return: 115 ret void 116} 117 118define dso_local ptr @ReturnAlloca() { 119entry: 120 %x = alloca i64, align 4 121 ret ptr %x 122} 123 124define dso_local void @Write1Private(ptr %p) #0 { 125entry: 126 call void @Private(ptr %p) 127 ret void 128} 129 130define dso_local void @Write1SameModule(ptr %p) #0 { 131entry: 132 call void @Write1(ptr %p) 133 ret void 134} 135 136declare void @Write1Module0(ptr %p) 137 138define dso_local void @Write1DiffModule(ptr %p) #0 { 139entry: 140 call void @Write1Module0(ptr %p) 141 ret void 142} 143 144define private dso_local void @Private(ptr %p) #0 { 145entry: 146 %p1 = getelementptr i8, ptr %p, i64 -1 147 store i8 0, ptr %p1, align 1 148 ret void 149} 150 151define dso_local void @Write1Weak(ptr %p) #0 { 152entry: 153 call void @Weak(ptr %p) 154 ret void 155} 156 157define weak dso_local void @Weak(ptr %p) #0 { 158entry: 159 %p1 = getelementptr i8, ptr %p, i64 -1 160 store i8 0, ptr %p1, align 1 161 ret void 162} 163 164