1target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 2target triple = "x86_64-unknown-linux-gnu" 3 4define dso_local void @Write1(i8* %p) { 5entry: 6 store i8 0, i8* %p, align 1 7 ret void 8} 9 10define dso_local void @Write4(i8* %p) { 11entry: 12 %0 = bitcast i8* %p to i32* 13 store i32 0, i32* %0, align 1 14 ret void 15} 16 17define dso_local void @Write4_2(i8* %p, i8* %q) { 18entry: 19 %0 = bitcast i8* %p to i32* 20 store i32 0, i32* %0, align 1 21 %1 = bitcast i8* %q to i32* 22 store i32 0, i32* %1, align 1 23 ret void 24} 25 26define dso_local void @Write8(i8* %p) { 27entry: 28 %0 = bitcast i8* %p to i64* 29 store i64 0, i64* %0, align 1 30 ret void 31} 32 33define dso_local i8* @WriteAndReturn8(i8* %p) { 34entry: 35 store i8 0, i8* %p, align 1 36 ret i8* %p 37} 38 39declare dso_local void @ExternalCall(i8* %p) 40 41define dso_preemptable void @PreemptableWrite1(i8* %p) { 42entry: 43 store i8 0, i8* %p, align 1 44 ret void 45} 46 47define linkonce dso_local void @InterposableWrite1(i8* %p) { 48entry: 49 store i8 0, i8* %p, align 1 50 ret void 51} 52 53define dso_local i8* @ReturnDependent(i8* %p) { 54entry: 55 %p2 = getelementptr i8, i8* %p, i64 2 56 ret i8* %p2 57} 58 59; access range [2, 6) 60define dso_local void @Rec0(i8* %p) { 61entry: 62 %p1 = getelementptr i8, i8* %p, i64 2 63 call void @Write4(i8* %p1) 64 ret void 65} 66 67; access range [3, 7) 68define dso_local void @Rec1(i8* %p) { 69entry: 70 %p1 = getelementptr i8, i8* %p, i64 1 71 call void @Rec0(i8* %p1) 72 ret void 73} 74 75; access range [-2, 2) 76define dso_local void @Rec2(i8* %p) { 77entry: 78 %p1 = getelementptr i8, i8* %p, i64 -5 79 call void @Rec1(i8* %p1) 80 ret void 81} 82 83; Recursive function that passes %acc unchanged => access range [0, 4). 84define dso_local void @RecursiveNoOffset(i32* %p, i32 %size, i32* %acc) { 85entry: 86 %cmp = icmp eq i32 %size, 0 87 br i1 %cmp, label %return, label %if.end 88 89if.end: 90 %0 = load i32, i32* %p, align 4 91 %1 = load i32, i32* %acc, align 4 92 %add = add nsw i32 %1, %0 93 store i32 %add, i32* %acc, align 4 94 %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 95 %sub = add nsw i32 %size, -1 96 tail call void @RecursiveNoOffset(i32* %add.ptr, i32 %sub, i32* %acc) 97 ret void 98 99return: 100 ret void 101} 102 103; Recursive function that advances %acc on each iteration => access range unlimited. 104define dso_local void @RecursiveWithOffset(i32 %size, i32* %acc) { 105entry: 106 %cmp = icmp eq i32 %size, 0 107 br i1 %cmp, label %return, label %if.end 108 109if.end: 110 store i32 0, i32* %acc, align 4 111 %acc2 = getelementptr inbounds i32, i32* %acc, i64 1 112 %sub = add nsw i32 %size, -1 113 tail call void @RecursiveWithOffset(i32 %sub, i32* %acc2) 114 ret void 115 116return: 117 ret void 118} 119