|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
|
2 | 2 | ; RUN: opt < %s -passes=asan -S | FileCheck %s
|
| 3 | +; RUN: opt < %s -passes=asan -asan-recover -S | FileCheck %s --check-prefix=RECOV |
3 | 4 | target datalayout = "e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-p7:160:256:256:32-p8:128:128-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8"
|
4 | 5 | target triple = "amdgcn-amd-amdhsa"
|
5 | 6 |
|
@@ -36,6 +37,40 @@ define protected amdgpu_kernel void @generic_store(ptr addrspace(1) %p, i32 %i)
|
36 | 37 | ; CHECK-NEXT: store i32 0, ptr [[Q]], align 4
|
37 | 38 | ; CHECK-NEXT: ret void
|
38 | 39 | ;
|
| 40 | +; RECOV-LABEL: define protected amdgpu_kernel void @generic_store( |
| 41 | +; RECOV-SAME: ptr addrspace(1) [[P:%.*]], i32 [[I:%.*]]) #[[ATTR0:[0-9]+]] { |
| 42 | +; RECOV-NEXT: entry: |
| 43 | +; RECOV-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(1) [[P]] to ptr |
| 44 | +; RECOV-NEXT: [[TMP0:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[Q]]) |
| 45 | +; RECOV-NEXT: [[TMP1:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[Q]]) |
| 46 | +; RECOV-NEXT: [[TMP2:%.*]] = or i1 [[TMP0]], [[TMP1]] |
| 47 | +; RECOV-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true |
| 48 | +; RECOV-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP19:%.*]] |
| 49 | +; RECOV: 4: |
| 50 | +; RECOV-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[Q]] to i64 |
| 51 | +; RECOV-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP5]], 3 |
| 52 | +; RECOV-NEXT: [[TMP7:%.*]] = add i64 [[TMP6]], 2147450880 |
| 53 | +; RECOV-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr |
| 54 | +; RECOV-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 1 |
| 55 | +; RECOV-NEXT: [[TMP10:%.*]] = icmp ne i8 [[TMP9]], 0 |
| 56 | +; RECOV-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP18:%.*]], !prof [[PROF0:![0-9]+]] |
| 57 | +; RECOV: 11: |
| 58 | +; RECOV-NEXT: [[TMP12:%.*]] = and i64 [[TMP5]], 7 |
| 59 | +; RECOV-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 3 |
| 60 | +; RECOV-NEXT: [[TMP14:%.*]] = trunc i64 [[TMP13]] to i8 |
| 61 | +; RECOV-NEXT: [[TMP15:%.*]] = icmp sge i8 [[TMP14]], [[TMP9]] |
| 62 | +; RECOV-NEXT: br i1 [[TMP15]], label [[TMP16:%.*]], label [[TMP17:%.*]] |
| 63 | +; RECOV: 16: |
| 64 | +; RECOV-NEXT: call void @__asan_report_store4_noabort(i64 [[TMP5]]) #[[ATTR3:[0-9]+]] |
| 65 | +; RECOV-NEXT: br label [[TMP17]] |
| 66 | +; RECOV: 17: |
| 67 | +; RECOV-NEXT: br label [[TMP18]] |
| 68 | +; RECOV: 18: |
| 69 | +; RECOV-NEXT: br label [[TMP19]] |
| 70 | +; RECOV: 19: |
| 71 | +; RECOV-NEXT: store i32 0, ptr [[Q]], align 4 |
| 72 | +; RECOV-NEXT: ret void |
| 73 | +; |
39 | 74 | entry:
|
40 | 75 |
|
41 | 76 | %q = addrspacecast ptr addrspace(1) %p to ptr
|
@@ -76,9 +111,161 @@ define protected amdgpu_kernel void @generic_load(ptr addrspace(1) %p, i32 %i) s
|
76 | 111 | ; CHECK-NEXT: [[R:%.*]] = load i32, ptr [[Q]], align 4
|
77 | 112 | ; CHECK-NEXT: ret void
|
78 | 113 | ;
|
| 114 | +; RECOV-LABEL: define protected amdgpu_kernel void @generic_load( |
| 115 | +; RECOV-SAME: ptr addrspace(1) [[P:%.*]], i32 [[I:%.*]]) #[[ATTR0]] { |
| 116 | +; RECOV-NEXT: entry: |
| 117 | +; RECOV-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(1) [[P]] to ptr |
| 118 | +; RECOV-NEXT: [[TMP0:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[Q]]) |
| 119 | +; RECOV-NEXT: [[TMP1:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[Q]]) |
| 120 | +; RECOV-NEXT: [[TMP2:%.*]] = or i1 [[TMP0]], [[TMP1]] |
| 121 | +; RECOV-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true |
| 122 | +; RECOV-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP19:%.*]] |
| 123 | +; RECOV: 4: |
| 124 | +; RECOV-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[Q]] to i64 |
| 125 | +; RECOV-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP5]], 3 |
| 126 | +; RECOV-NEXT: [[TMP7:%.*]] = add i64 [[TMP6]], 2147450880 |
| 127 | +; RECOV-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr |
| 128 | +; RECOV-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 1 |
| 129 | +; RECOV-NEXT: [[TMP10:%.*]] = icmp ne i8 [[TMP9]], 0 |
| 130 | +; RECOV-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP18:%.*]], !prof [[PROF0]] |
| 131 | +; RECOV: 11: |
| 132 | +; RECOV-NEXT: [[TMP12:%.*]] = and i64 [[TMP5]], 7 |
| 133 | +; RECOV-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 3 |
| 134 | +; RECOV-NEXT: [[TMP14:%.*]] = trunc i64 [[TMP13]] to i8 |
| 135 | +; RECOV-NEXT: [[TMP15:%.*]] = icmp sge i8 [[TMP14]], [[TMP9]] |
| 136 | +; RECOV-NEXT: br i1 [[TMP15]], label [[TMP16:%.*]], label [[TMP17:%.*]] |
| 137 | +; RECOV: 16: |
| 138 | +; RECOV-NEXT: call void @__asan_report_load4_noabort(i64 [[TMP5]]) #[[ATTR3]] |
| 139 | +; RECOV-NEXT: br label [[TMP17]] |
| 140 | +; RECOV: 17: |
| 141 | +; RECOV-NEXT: br label [[TMP18]] |
| 142 | +; RECOV: 18: |
| 143 | +; RECOV-NEXT: br label [[TMP19]] |
| 144 | +; RECOV: 19: |
| 145 | +; RECOV-NEXT: [[R:%.*]] = load i32, ptr [[Q]], align 4 |
| 146 | +; RECOV-NEXT: ret void |
| 147 | +; |
79 | 148 | entry:
|
80 | 149 |
|
81 | 150 | %q = addrspacecast ptr addrspace(1) %p to ptr
|
82 | 151 | %r = load i32, ptr %q, align 4
|
83 | 152 | ret void
|
84 | 153 | }
|
| 154 | + |
| 155 | +define protected amdgpu_kernel void @generic_store_8(ptr addrspace(1) %p) sanitize_address { |
| 156 | +; CHECK-LABEL: define protected amdgpu_kernel void @generic_store_8( |
| 157 | +; CHECK-SAME: ptr addrspace(1) [[P:%.*]]) #[[ATTR0]] { |
| 158 | +; CHECK-NEXT: entry: |
| 159 | +; CHECK-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(1) [[P]] to ptr |
| 160 | +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[Q]]) |
| 161 | +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[Q]]) |
| 162 | +; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[TMP0]], [[TMP1]] |
| 163 | +; CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true |
| 164 | +; CHECK-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP13:%.*]] |
| 165 | +; CHECK: 4: |
| 166 | +; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[Q]] to i64 |
| 167 | +; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP5]], 3 |
| 168 | +; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[TMP6]], 2147450880 |
| 169 | +; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr |
| 170 | +; CHECK-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 1 |
| 171 | +; CHECK-NEXT: [[TMP10:%.*]] = icmp ne i8 [[TMP9]], 0 |
| 172 | +; CHECK-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP12:%.*]] |
| 173 | +; CHECK: 11: |
| 174 | +; CHECK-NEXT: call void @__asan_report_store8(i64 [[TMP5]]) #[[ATTR3]] |
| 175 | +; CHECK-NEXT: unreachable |
| 176 | +; CHECK: 12: |
| 177 | +; CHECK-NEXT: br label [[TMP13]] |
| 178 | +; CHECK: 13: |
| 179 | +; CHECK-NEXT: store i64 0, ptr [[Q]], align 8 |
| 180 | +; CHECK-NEXT: ret void |
| 181 | +; |
| 182 | +; RECOV-LABEL: define protected amdgpu_kernel void @generic_store_8( |
| 183 | +; RECOV-SAME: ptr addrspace(1) [[P:%.*]]) #[[ATTR0]] { |
| 184 | +; RECOV-NEXT: entry: |
| 185 | +; RECOV-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(1) [[P]] to ptr |
| 186 | +; RECOV-NEXT: [[TMP0:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[Q]]) |
| 187 | +; RECOV-NEXT: [[TMP1:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[Q]]) |
| 188 | +; RECOV-NEXT: [[TMP2:%.*]] = or i1 [[TMP0]], [[TMP1]] |
| 189 | +; RECOV-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true |
| 190 | +; RECOV-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP13:%.*]] |
| 191 | +; RECOV: 4: |
| 192 | +; RECOV-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[Q]] to i64 |
| 193 | +; RECOV-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP5]], 3 |
| 194 | +; RECOV-NEXT: [[TMP7:%.*]] = add i64 [[TMP6]], 2147450880 |
| 195 | +; RECOV-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr |
| 196 | +; RECOV-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 1 |
| 197 | +; RECOV-NEXT: [[TMP10:%.*]] = icmp ne i8 [[TMP9]], 0 |
| 198 | +; RECOV-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP12:%.*]] |
| 199 | +; RECOV: 11: |
| 200 | +; RECOV-NEXT: call void @__asan_report_store8_noabort(i64 [[TMP5]]) #[[ATTR3]] |
| 201 | +; RECOV-NEXT: br label [[TMP12]] |
| 202 | +; RECOV: 12: |
| 203 | +; RECOV-NEXT: br label [[TMP13]] |
| 204 | +; RECOV: 13: |
| 205 | +; RECOV-NEXT: store i64 0, ptr [[Q]], align 8 |
| 206 | +; RECOV-NEXT: ret void |
| 207 | +; |
| 208 | +entry: |
| 209 | + %q = addrspacecast ptr addrspace(1) %p to ptr |
| 210 | + store i64 0, ptr %q, align 8 |
| 211 | + ret void |
| 212 | +} |
| 213 | + |
| 214 | +define protected amdgpu_kernel void @generic_load_8(ptr addrspace(1) %p) sanitize_address { |
| 215 | +; CHECK-LABEL: define protected amdgpu_kernel void @generic_load_8( |
| 216 | +; CHECK-SAME: ptr addrspace(1) [[P:%.*]]) #[[ATTR0]] { |
| 217 | +; CHECK-NEXT: entry: |
| 218 | +; CHECK-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(1) [[P]] to ptr |
| 219 | +; CHECK-NEXT: [[TMP0:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[Q]]) |
| 220 | +; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[Q]]) |
| 221 | +; CHECK-NEXT: [[TMP2:%.*]] = or i1 [[TMP0]], [[TMP1]] |
| 222 | +; CHECK-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true |
| 223 | +; CHECK-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP13:%.*]] |
| 224 | +; CHECK: 4: |
| 225 | +; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[Q]] to i64 |
| 226 | +; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP5]], 3 |
| 227 | +; CHECK-NEXT: [[TMP7:%.*]] = add i64 [[TMP6]], 2147450880 |
| 228 | +; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr |
| 229 | +; CHECK-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 1 |
| 230 | +; CHECK-NEXT: [[TMP10:%.*]] = icmp ne i8 [[TMP9]], 0 |
| 231 | +; CHECK-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP12:%.*]] |
| 232 | +; CHECK: 11: |
| 233 | +; CHECK-NEXT: call void @__asan_report_load8(i64 [[TMP5]]) #[[ATTR3]] |
| 234 | +; CHECK-NEXT: unreachable |
| 235 | +; CHECK: 12: |
| 236 | +; CHECK-NEXT: br label [[TMP13]] |
| 237 | +; CHECK: 13: |
| 238 | +; CHECK-NEXT: [[R:%.*]] = load i64, ptr [[Q]], align 8 |
| 239 | +; CHECK-NEXT: ret void |
| 240 | +; |
| 241 | +; RECOV-LABEL: define protected amdgpu_kernel void @generic_load_8( |
| 242 | +; RECOV-SAME: ptr addrspace(1) [[P:%.*]]) #[[ATTR0]] { |
| 243 | +; RECOV-NEXT: entry: |
| 244 | +; RECOV-NEXT: [[Q:%.*]] = addrspacecast ptr addrspace(1) [[P]] to ptr |
| 245 | +; RECOV-NEXT: [[TMP0:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[Q]]) |
| 246 | +; RECOV-NEXT: [[TMP1:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[Q]]) |
| 247 | +; RECOV-NEXT: [[TMP2:%.*]] = or i1 [[TMP0]], [[TMP1]] |
| 248 | +; RECOV-NEXT: [[TMP3:%.*]] = xor i1 [[TMP2]], true |
| 249 | +; RECOV-NEXT: br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP13:%.*]] |
| 250 | +; RECOV: 4: |
| 251 | +; RECOV-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[Q]] to i64 |
| 252 | +; RECOV-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP5]], 3 |
| 253 | +; RECOV-NEXT: [[TMP7:%.*]] = add i64 [[TMP6]], 2147450880 |
| 254 | +; RECOV-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr |
| 255 | +; RECOV-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP8]], align 1 |
| 256 | +; RECOV-NEXT: [[TMP10:%.*]] = icmp ne i8 [[TMP9]], 0 |
| 257 | +; RECOV-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP12:%.*]] |
| 258 | +; RECOV: 11: |
| 259 | +; RECOV-NEXT: call void @__asan_report_load8_noabort(i64 [[TMP5]]) #[[ATTR3]] |
| 260 | +; RECOV-NEXT: br label [[TMP12]] |
| 261 | +; RECOV: 12: |
| 262 | +; RECOV-NEXT: br label [[TMP13]] |
| 263 | +; RECOV: 13: |
| 264 | +; RECOV-NEXT: [[R:%.*]] = load i64, ptr [[Q]], align 8 |
| 265 | +; RECOV-NEXT: ret void |
| 266 | +; |
| 267 | +entry: |
| 268 | + %q = addrspacecast ptr addrspace(1) %p to ptr |
| 269 | + %r = load i64, ptr %q, align 8 |
| 270 | + ret void |
| 271 | +} |
0 commit comments