|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5 |
| 2 | +; RUN: opt < %s -passes=asan -S -mtriple=amdgcn-- | FileCheck %s |
| 3 | + |
| 4 | +%llvm.amdgcn.sw.lds.k0.md.type = type { %llvm.amdgcn.sw.lds.k0.md.item, %llvm.amdgcn.sw.lds.k0.md.item } |
| 5 | +%llvm.amdgcn.sw.lds.k0.md.item = type { i32, i32, i32 } |
| 6 | + |
| 7 | +@llvm.amdgcn.sw.lds.k0 = internal addrspace(3) global ptr poison, no_sanitize_address, align 1, !absolute_symbol !0 |
| 8 | +@llvm.amdgcn.k0.dynlds = external addrspace(3) global [0 x i8], no_sanitize_address, align 1, !absolute_symbol !1 |
| 9 | +@llvm.amdgcn.sw.lds.k0.md = internal addrspace(1) global %llvm.amdgcn.sw.lds.k0.md.type { %llvm.amdgcn.sw.lds.k0.md.item { i32 0, i32 8, i32 8 }, %llvm.amdgcn.sw.lds.k0.md.item { i32 8, i32 0, i32 0 } }, no_sanitize_address |
| 10 | + |
| 11 | +; Function Attrs: sanitize_address |
| 12 | +;. |
| 13 | +; CHECK: @llvm.amdgcn.sw.lds.k0 = internal addrspace(3) global ptr poison, no_sanitize_address, align 1, !absolute_symbol [[META0:![0-9]+]] |
| 14 | +; CHECK: @llvm.amdgcn.k0.dynlds = external addrspace(3) global [0 x i8], no_sanitize_address, align 1, !absolute_symbol [[META1:![0-9]+]] |
| 15 | +; CHECK: @llvm.amdgcn.sw.lds.k0.md = internal addrspace(1) global %0 { %1 { i32 0, i32 8, i32 32, i32 8, i32 24 }, %1 { i32 32, i32 0, i32 0, i32 0, i32 0 } }, no_sanitize_address, align 1 |
| 16 | +; CHECK: @llvm.used = appending addrspace(1) global [1 x ptr] [ptr @asan.module_ctor], section "llvm.metadata" |
| 17 | +; CHECK: @___asan_globals_registered = common hidden addrspace(1) global i64 0 |
| 18 | +; CHECK: @__start_asan_globals = extern_weak hidden addrspace(1) global i64 |
| 19 | +; CHECK: @__stop_asan_globals = extern_weak hidden addrspace(1) global i64 |
| 20 | +; CHECK: @llvm.global_ctors = appending addrspace(1) global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] |
| 21 | +;. |
| 22 | +define amdgpu_kernel void @k0() #0 { |
| 23 | +; CHECK-LABEL: define amdgpu_kernel void @k0( |
| 24 | +; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { |
| 25 | +; CHECK-NEXT: [[WID:.*]]: |
| 26 | +; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.amdgcn.workitem.id.x() |
| 27 | +; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.amdgcn.workitem.id.y() |
| 28 | +; CHECK-NEXT: [[TMP2:%.*]] = call i32 @llvm.amdgcn.workitem.id.z() |
| 29 | +; CHECK-NEXT: [[TMP3:%.*]] = or i32 [[TMP0]], [[TMP1]] |
| 30 | +; CHECK-NEXT: [[TMP4:%.*]] = or i32 [[TMP3]], [[TMP2]] |
| 31 | +; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i32 [[TMP4]], 0 |
| 32 | +; CHECK-NEXT: br i1 [[TMP5]], label %[[MALLOC:.*]], label %[[BB43:.*]] |
| 33 | +; CHECK: [[MALLOC]]: |
| 34 | +; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, align 4 |
| 35 | +; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr addrspace(1) getelementptr inbounds ([[TMP0]], ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 0, i32 2), align 4 |
| 36 | +; CHECK-NEXT: [[TMP8:%.*]] = add i32 [[TMP6]], [[TMP7]] |
| 37 | +; CHECK-NEXT: [[TMP9:%.*]] = call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr() |
| 38 | +; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds ptr addrspace(4), ptr addrspace(4) [[TMP9]], i64 15 |
| 39 | +; CHECK-NEXT: store i32 [[TMP8]], ptr addrspace(1) getelementptr inbounds ([[TMP0]], ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 0), align 4 |
| 40 | +; CHECK-NEXT: [[TMP11:%.*]] = ptrtoint ptr addrspace(4) [[TMP10]] to i64 |
| 41 | +; CHECK-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP11]], 3 |
| 42 | +; CHECK-NEXT: [[TMP13:%.*]] = add i64 [[TMP12]], 2147450880 |
| 43 | +; CHECK-NEXT: [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr |
| 44 | +; CHECK-NEXT: [[TMP15:%.*]] = load i8, ptr [[TMP14]], align 1 |
| 45 | +; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i8 [[TMP15]], 0 |
| 46 | +; CHECK-NEXT: [[TMP17:%.*]] = and i64 [[TMP11]], 7 |
| 47 | +; CHECK-NEXT: [[TMP18:%.*]] = add i64 [[TMP17]], 3 |
| 48 | +; CHECK-NEXT: [[TMP19:%.*]] = trunc i64 [[TMP18]] to i8 |
| 49 | +; CHECK-NEXT: [[TMP20:%.*]] = icmp sge i8 [[TMP19]], [[TMP15]] |
| 50 | +; CHECK-NEXT: [[TMP21:%.*]] = and i1 [[TMP16]], [[TMP20]] |
| 51 | +; CHECK-NEXT: [[TMP22:%.*]] = call i64 @llvm.amdgcn.ballot.i64(i1 [[TMP21]]) |
| 52 | +; CHECK-NEXT: [[TMP23:%.*]] = icmp ne i64 [[TMP22]], 0 |
| 53 | +; CHECK-NEXT: br i1 [[TMP23]], label %[[ASAN_REPORT:.*]], label %[[BB26:.*]], !prof [[PROF2:![0-9]+]] |
| 54 | +; CHECK: [[ASAN_REPORT]]: |
| 55 | +; CHECK-NEXT: br i1 [[TMP21]], label %[[BB24:.*]], label %[[BB25:.*]] |
| 56 | +; CHECK: [[BB24]]: |
| 57 | +; CHECK-NEXT: call void @__asan_report_load4(i64 [[TMP11]]) #[[ATTR7:[0-9]+]] |
| 58 | +; CHECK-NEXT: call void @llvm.amdgcn.unreachable() |
| 59 | +; CHECK-NEXT: br label %[[BB25]] |
| 60 | +; CHECK: [[BB25]]: |
| 61 | +; CHECK-NEXT: br label %[[BB26]] |
| 62 | +; CHECK: [[BB26]]: |
| 63 | +; CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr addrspace(4) [[TMP10]], align 4 |
| 64 | +; CHECK-NEXT: store i32 [[TMP27]], ptr addrspace(1) getelementptr inbounds ([[TMP0]], ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 1), align 4 |
| 65 | +; CHECK-NEXT: [[TMP28:%.*]] = add i32 [[TMP27]], 0 |
| 66 | +; CHECK-NEXT: [[TMP29:%.*]] = udiv i32 [[TMP28]], 1 |
| 67 | +; CHECK-NEXT: [[TMP30:%.*]] = mul i32 [[TMP29]], 1 |
| 68 | +; CHECK-NEXT: store i32 [[TMP30]], ptr addrspace(1) getelementptr inbounds ([[TMP0]], ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 2), align 4 |
| 69 | +; CHECK-NEXT: [[TMP31:%.*]] = add i32 [[TMP8]], [[TMP30]] |
| 70 | +; CHECK-NEXT: [[TMP32:%.*]] = zext i32 [[TMP31]] to i64 |
| 71 | +; CHECK-NEXT: [[TMP33:%.*]] = call ptr @llvm.returnaddress(i32 0) |
| 72 | +; CHECK-NEXT: [[TMP34:%.*]] = ptrtoint ptr [[TMP33]] to i64 |
| 73 | +; CHECK-NEXT: [[TMP35:%.*]] = call i64 @__asan_malloc_impl(i64 [[TMP32]], i64 [[TMP34]]) |
| 74 | +; CHECK-NEXT: [[TMP36:%.*]] = inttoptr i64 [[TMP35]] to ptr addrspace(1) |
| 75 | +; CHECK-NEXT: store ptr addrspace(1) [[TMP36]], ptr addrspace(3) @llvm.amdgcn.sw.lds.k0, align 8 |
| 76 | +; CHECK-NEXT: [[TMP37:%.*]] = load i32, ptr addrspace(1) getelementptr inbounds ([[TMP0]], ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 0, i32 3), align 4 |
| 77 | +; CHECK-NEXT: [[TMP38:%.*]] = zext i32 [[TMP37]] to i64 |
| 78 | +; CHECK-NEXT: [[TMP39:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP36]], i64 [[TMP38]] |
| 79 | +; CHECK-NEXT: [[TMP40:%.*]] = ptrtoint ptr addrspace(1) [[TMP39]] to i64 |
| 80 | +; CHECK-NEXT: [[TMP41:%.*]] = load i32, ptr addrspace(1) getelementptr inbounds ([[TMP0]], ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 0, i32 4), align 4 |
| 81 | +; CHECK-NEXT: [[TMP42:%.*]] = zext i32 [[TMP41]] to i64 |
| 82 | +; CHECK-NEXT: call void @__asan_poison_region(i64 [[TMP40]], i64 [[TMP42]]) |
| 83 | +; CHECK-NEXT: br label %[[BB43]] |
| 84 | +; CHECK: [[BB43]]: |
| 85 | +; CHECK-NEXT: [[XYZCOND:%.*]] = phi i1 [ false, %[[WID]] ], [ true, %[[BB26]] ] |
| 86 | +; CHECK-NEXT: call void @llvm.amdgcn.s.barrier() |
| 87 | +; CHECK-NEXT: [[TMP44:%.*]] = load i32, ptr addrspace(1) getelementptr inbounds ([[TMP0]], ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 0), align 4 |
| 88 | +; CHECK-NEXT: [[TMP45:%.*]] = getelementptr inbounds i8, ptr addrspace(3) @llvm.amdgcn.sw.lds.k0, i32 [[TMP44]] |
| 89 | +; CHECK-NEXT: call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.k0.dynlds) ] |
| 90 | +; CHECK-NEXT: [[TMP46:%.*]] = ptrtoint ptr addrspace(3) [[TMP45]] to i32 |
| 91 | +; CHECK-NEXT: [[TMP47:%.*]] = load ptr addrspace(1), ptr addrspace(3) @llvm.amdgcn.sw.lds.k0, align 8 |
| 92 | +; CHECK-NEXT: [[TMP48:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[TMP47]], i32 [[TMP46]] |
| 93 | +; CHECK-NEXT: [[TMP49:%.*]] = ptrtoint ptr addrspace(1) [[TMP48]] to i64 |
| 94 | +; CHECK-NEXT: [[TMP50:%.*]] = lshr i64 [[TMP49]], 3 |
| 95 | +; CHECK-NEXT: [[TMP51:%.*]] = add i64 [[TMP50]], 2147450880 |
| 96 | +; CHECK-NEXT: [[TMP52:%.*]] = inttoptr i64 [[TMP51]] to ptr |
| 97 | +; CHECK-NEXT: [[TMP53:%.*]] = load i8, ptr [[TMP52]], align 1 |
| 98 | +; CHECK-NEXT: [[TMP54:%.*]] = icmp ne i8 [[TMP53]], 0 |
| 99 | +; CHECK-NEXT: [[TMP55:%.*]] = and i64 [[TMP49]], 7 |
| 100 | +; CHECK-NEXT: [[TMP56:%.*]] = trunc i64 [[TMP55]] to i8 |
| 101 | +; CHECK-NEXT: [[TMP57:%.*]] = icmp sge i8 [[TMP56]], [[TMP53]] |
| 102 | +; CHECK-NEXT: [[TMP58:%.*]] = and i1 [[TMP54]], [[TMP57]] |
| 103 | +; CHECK-NEXT: [[TMP59:%.*]] = call i64 @llvm.amdgcn.ballot.i64(i1 [[TMP58]]) |
| 104 | +; CHECK-NEXT: [[TMP60:%.*]] = icmp ne i64 [[TMP59]], 0 |
| 105 | +; CHECK-NEXT: br i1 [[TMP60]], label %[[ASAN_REPORT1:.*]], label %[[BB63:.*]], !prof [[PROF2]] |
| 106 | +; CHECK: [[ASAN_REPORT1]]: |
| 107 | +; CHECK-NEXT: br i1 [[TMP58]], label %[[BB61:.*]], label %[[BB62:.*]] |
| 108 | +; CHECK: [[BB61]]: |
| 109 | +; CHECK-NEXT: call void @__asan_report_store1(i64 [[TMP49]]) #[[ATTR7]] |
| 110 | +; CHECK-NEXT: call void @llvm.amdgcn.unreachable() |
| 111 | +; CHECK-NEXT: br label %[[BB62]] |
| 112 | +; CHECK: [[BB62]]: |
| 113 | +; CHECK-NEXT: br label %[[BB63]] |
| 114 | +; CHECK: [[BB63]]: |
| 115 | +; CHECK-NEXT: store i8 7, ptr addrspace(3) [[TMP45]], align 4 |
| 116 | +; CHECK-NEXT: br label %[[CONDFREE:.*]] |
| 117 | +; CHECK: [[CONDFREE]]: |
| 118 | +; CHECK-NEXT: call void @llvm.amdgcn.s.barrier() |
| 119 | +; CHECK-NEXT: br i1 [[XYZCOND]], label %[[FREE:.*]], label %[[END:.*]] |
| 120 | +; CHECK: [[FREE]]: |
| 121 | +; CHECK-NEXT: [[TMP64:%.*]] = load ptr addrspace(1), ptr addrspace(3) @llvm.amdgcn.sw.lds.k0, align 8 |
| 122 | +; CHECK-NEXT: [[TMP65:%.*]] = call ptr @llvm.returnaddress(i32 0) |
| 123 | +; CHECK-NEXT: [[TMP66:%.*]] = ptrtoint ptr [[TMP65]] to i64 |
| 124 | +; CHECK-NEXT: [[TMP67:%.*]] = ptrtoint ptr addrspace(1) [[TMP64]] to i64 |
| 125 | +; CHECK-NEXT: call void @__asan_free_impl(i64 [[TMP67]], i64 [[TMP66]]) |
| 126 | +; CHECK-NEXT: br label %[[END]] |
| 127 | +; CHECK: [[END]]: |
| 128 | +; CHECK-NEXT: ret void |
| 129 | +; |
| 130 | +WId: |
| 131 | + %0 = call i32 @llvm.amdgcn.workitem.id.x() |
| 132 | + %1 = call i32 @llvm.amdgcn.workitem.id.y() |
| 133 | + %2 = call i32 @llvm.amdgcn.workitem.id.z() |
| 134 | + %3 = or i32 %0, %1 |
| 135 | + %4 = or i32 %3, %2 |
| 136 | + %5 = icmp eq i32 %4, 0 |
| 137 | + br i1 %5, label %Malloc, label %21 |
| 138 | + |
| 139 | +Malloc: ; preds = %WId |
| 140 | + %6 = load i32, ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, align 4 |
| 141 | + %7 = load i32, ptr addrspace(1) getelementptr inbounds (%llvm.amdgcn.sw.lds.k0.md.type, ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 0, i32 2), align 4 |
| 142 | + %8 = add i32 %6, %7 |
| 143 | + %9 = call ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr() |
| 144 | + %10 = getelementptr inbounds ptr addrspace(4), ptr addrspace(4) %9, i64 15 |
| 145 | + store i32 %8, ptr addrspace(1) getelementptr inbounds (%llvm.amdgcn.sw.lds.k0.md.type, ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 0), align 4 |
| 146 | + %11 = load i32, ptr addrspace(4) %10, align 4 |
| 147 | + store i32 %11, ptr addrspace(1) getelementptr inbounds (%llvm.amdgcn.sw.lds.k0.md.type, ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 1), align 4 |
| 148 | + %12 = add i32 %11, 0 |
| 149 | + %13 = udiv i32 %12, 1 |
| 150 | + %14 = mul i32 %13, 1 |
| 151 | + store i32 %14, ptr addrspace(1) getelementptr inbounds (%llvm.amdgcn.sw.lds.k0.md.type, ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 2), align 4 |
| 152 | + %15 = add i32 %8, %14 |
| 153 | + %16 = zext i32 %15 to i64 |
| 154 | + %17 = call ptr @llvm.returnaddress(i32 0) |
| 155 | + %18 = ptrtoint ptr %17 to i64 |
| 156 | + %19 = call i64 @__asan_malloc_impl(i64 %16, i64 %18) |
| 157 | + %20 = inttoptr i64 %19 to ptr addrspace(1) |
| 158 | + store ptr addrspace(1) %20, ptr addrspace(3) @llvm.amdgcn.sw.lds.k0, align 8 |
| 159 | + br label %21 |
| 160 | + |
| 161 | +21: ; preds = %Malloc, %WId |
| 162 | + %xyzCond = phi i1 [ false, %WId ], [ true, %Malloc ] |
| 163 | + call void @llvm.amdgcn.s.barrier() |
| 164 | + %22 = load i32, ptr addrspace(1) getelementptr inbounds (%llvm.amdgcn.sw.lds.k0.md.type, ptr addrspace(1) @llvm.amdgcn.sw.lds.k0.md, i32 0, i32 1, i32 0), align 4 |
| 165 | + %23 = getelementptr inbounds i8, ptr addrspace(3) @llvm.amdgcn.sw.lds.k0, i32 %22 |
| 166 | + call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.k0.dynlds) ] |
| 167 | + store i8 7, ptr addrspace(3) %23, align 4 |
| 168 | + br label %CondFree |
| 169 | + |
| 170 | +CondFree: ; preds = %21 |
| 171 | + call void @llvm.amdgcn.s.barrier() |
| 172 | + br i1 %xyzCond, label %Free, label %End |
| 173 | + |
| 174 | +Free: ; preds = %CondFree |
| 175 | + %24 = load ptr addrspace(1), ptr addrspace(3) @llvm.amdgcn.sw.lds.k0, align 8 |
| 176 | + %25 = call ptr @llvm.returnaddress(i32 0) |
| 177 | + %26 = ptrtoint ptr %25 to i64 |
| 178 | + %27 = ptrtoint ptr addrspace(1) %24 to i64 |
| 179 | + call void @__asan_free_impl(i64 %27, i64 %26) |
| 180 | + br label %End |
| 181 | + |
| 182 | +End: ; preds = %Free, %CondFree |
| 183 | + ret void |
| 184 | +} |
| 185 | + |
| 186 | +; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none) |
| 187 | +declare void @llvm.donothing() #1 |
| 188 | + |
| 189 | +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) |
| 190 | +declare i32 @llvm.amdgcn.workitem.id.x() #2 |
| 191 | + |
| 192 | +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) |
| 193 | +declare i32 @llvm.amdgcn.workitem.id.y() #2 |
| 194 | + |
| 195 | +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) |
| 196 | +declare i32 @llvm.amdgcn.workitem.id.z() #2 |
| 197 | + |
| 198 | +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) |
| 199 | +declare align 4 ptr addrspace(4) @llvm.amdgcn.implicitarg.ptr() #2 |
| 200 | + |
| 201 | +; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none) |
| 202 | +declare ptr @llvm.returnaddress(i32 immarg) #1 |
| 203 | + |
| 204 | +declare i64 @__asan_malloc_impl(i64, i64) |
| 205 | + |
| 206 | +; Function Attrs: convergent nocallback nofree nounwind willreturn |
| 207 | +declare void @llvm.amdgcn.s.barrier() #3 |
| 208 | + |
| 209 | +declare void @__asan_free_impl(i64, i64) |
| 210 | + |
| 211 | +attributes #0 = { sanitize_address "amdgpu-lds-size"="8,8" } |
| 212 | +attributes #1 = { nocallback nofree nosync nounwind willreturn memory(none) } |
| 213 | +attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } |
| 214 | +attributes #3 = { convergent nocallback nofree nounwind willreturn } |
| 215 | + |
| 216 | +!0 = !{i32 0, i32 1} |
| 217 | +!1 = !{i32 8, i32 9} |
| 218 | +;. |
| 219 | +; CHECK: attributes #[[ATTR0]] = { sanitize_address "amdgpu-lds-size"="32,32" } |
| 220 | +; CHECK: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(none) } |
| 221 | +; CHECK: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } |
| 222 | +; CHECK: attributes #[[ATTR3:[0-9]+]] = { convergent nocallback nofree nounwind willreturn } |
| 223 | +; CHECK: attributes #[[ATTR4:[0-9]+]] = { convergent nocallback nofree nounwind willreturn memory(none) } |
| 224 | +; CHECK: attributes #[[ATTR5:[0-9]+]] = { convergent nocallback nofree nounwind } |
| 225 | +; CHECK: attributes #[[ATTR6:[0-9]+]] = { nounwind } |
| 226 | +; CHECK: attributes #[[ATTR7]] = { nomerge } |
| 227 | +;. |
| 228 | +; CHECK: [[META0]] = !{i32 0, i32 1} |
| 229 | +; CHECK: [[META1]] = !{i32 32, i32 33} |
| 230 | +; CHECK: [[PROF2]] = !{!"branch_weights", i32 1, i32 1048575} |
| 231 | +;. |
0 commit comments