|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
1 | 2 | ; RUN: opt -S -mtriple=amdgcn-- -amdgpu-lower-module-lds --amdgpu-lower-module-lds-strategy=module < %s | FileCheck %s |
2 | 3 | ; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-lower-module-lds --amdgpu-lower-module-lds-strategy=module < %s | FileCheck %s |
3 | 4 |
|
|
9 | 10 | @kern = addrspace(3) global float poison, align 4 |
10 | 11 |
|
11 | 12 | ; @a_func is only used from a non-kernel function so is rewritten |
12 | | -; CHECK-NOT: @a_func |
13 | 13 | ; @b_both is used from a non-kernel function so is rewritten |
14 | | -; CHECK-NOT: @b_both |
15 | 14 | ; sorted both < func, so @b_both at null and @a_func at 4 |
16 | 15 | @b_both = addrspace(3) global float poison, align 4 |
17 | 16 |
|
18 | | -; CHECK: @llvm.amdgcn.module.lds = internal addrspace(3) global %llvm.amdgcn.module.lds.t poison, align 4 |
19 | | -; CHECK: @llvm.amdgcn.kernel.timestwo.lds = internal addrspace(3) global %llvm.amdgcn.kernel.timestwo.lds.t poison, align 4 |
20 | 17 |
|
21 | | -; CHECK-LABEL: @get_func() |
22 | | -; CHECK: %0 = addrspacecast ptr addrspace(3) @llvm.amdgcn.module.lds to ptr |
23 | | -; CHECK: %1 = ptrtoint ptr %0 to i64 |
24 | | -; CHECK: %2 = addrspacecast ptr addrspace(3) @llvm.amdgcn.module.lds to ptr |
25 | | -; CHECK: %3 = ptrtoint ptr %2 to i64 |
26 | | -; CHECK: %4 = add i64 %1, %3 |
27 | | -; CHECK: %5 = inttoptr i64 %4 to ptr |
28 | | -; CHECK: %6 = load i32, ptr %5, align 4 |
29 | | -; CHECK: ret i32 %6 |
30 | 18 | define i32 @get_func() local_unnamed_addr #0 { |
| 19 | +; CHECK-LABEL: define i32 @get_func() local_unnamed_addr { |
| 20 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 21 | +; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr addrspace(3) @llvm.amdgcn.module.lds to ptr |
| 22 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i64 |
| 23 | +; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[TMP1]] |
| 24 | +; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr |
| 25 | +; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4 |
| 26 | +; CHECK-NEXT: ret i32 [[TMP4]] |
| 27 | +; |
31 | 28 | entry: |
32 | 29 | %0 = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @a_func to ptr) to i64), i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @a_func to ptr) to i64)) to ptr), align 4 |
33 | 30 | ret i32 %0 |
34 | 31 | } |
35 | 32 |
|
36 | | -; CHECK-LABEL: @set_func(i32 %x) |
37 | | -; CHECK: %0 = addrspacecast ptr addrspace(3) getelementptr inbounds (%llvm.amdgcn.module.lds.t, ptr addrspace(3) @llvm.amdgcn.module.lds, i32 0, i32 1) to ptr |
38 | | -; CHECK: %1 = ptrtoint ptr %0 to i64 |
39 | | -; CHECK: %2 = addrspacecast ptr addrspace(3) getelementptr inbounds (%llvm.amdgcn.module.lds.t, ptr addrspace(3) @llvm.amdgcn.module.lds, i32 0, i32 1) to ptr |
40 | | -; CHECK: %3 = ptrtoint ptr %2 to i64 |
41 | | -; CHECK: %4 = add i64 %1, %3 |
42 | | -; CHECK: %5 = inttoptr i64 %4 to ptr |
43 | | -; CHECK: store i32 %x, ptr %5, align 4 |
44 | | -; CHECK: ret void |
45 | 33 | define void @set_func(i32 %x) { |
| 34 | +; CHECK-LABEL: define void @set_func( |
| 35 | +; CHECK-SAME: i32 [[X:%.*]]) { |
| 36 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 37 | +; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr addrspace(3) getelementptr inbounds ([[LLVM_AMDGCN_MODULE_LDS_T:%.*]], ptr addrspace(3) @llvm.amdgcn.module.lds, i32 0, i32 1) to ptr |
| 38 | +; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i64 |
| 39 | +; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[TMP1]], [[TMP1]] |
| 40 | +; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr |
| 41 | +; CHECK-NEXT: store i32 [[X]], ptr [[TMP3]], align 4 |
| 42 | +; CHECK-NEXT: ret void |
| 43 | +; |
46 | 44 | entry: |
47 | 45 | store i32 %x, ptr inttoptr (i64 add (i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @b_both to ptr) to i64), i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @b_both to ptr) to i64)) to ptr), align 4 |
48 | 46 | ret void |
49 | 47 | } |
50 | 48 |
|
51 | | -; CHECK-LABEL: @timestwo() #0 |
52 | | -; CHECK-NOT: call void @llvm.donothing() |
53 | 49 |
|
54 | | -; CHECK: %1 = addrspacecast ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds to ptr |
55 | | -; CHECK: %2 = ptrtoint ptr %1 to i64 |
56 | | -; CHECK: %3 = addrspacecast ptr addrspace(3) getelementptr inbounds (%llvm.amdgcn.kernel.timestwo.lds.t, ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds, i32 0, i32 1) to ptr |
57 | | -; CHECK: %4 = ptrtoint ptr %3 to i64 |
58 | | -; CHECK: %5 = add i64 %2, %4 |
59 | | -; CHECK: %6 = inttoptr i64 %5 to ptr |
60 | | -; CHECK: %ld = load i32, ptr %6, align 4 |
61 | | -; CHECK: %mul = mul i32 %ld, 2 |
62 | | -; CHECK: %7 = addrspacecast ptr addrspace(3) getelementptr inbounds (%llvm.amdgcn.kernel.timestwo.lds.t, ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds, i32 0, i32 1) to ptr |
63 | | -; CHECK: %8 = ptrtoint ptr %7 to i64 |
64 | | -; CHECK: %9 = addrspacecast ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds to ptr |
65 | | -; CHECK: %10 = ptrtoint ptr %9 to i64 |
66 | | -; CHECK: %11 = add i64 %8, %10 |
67 | | -; CHECK: %12 = inttoptr i64 %11 to ptr |
68 | | -; CHECK: store i32 %mul, ptr %12, align 4 |
69 | | -; CHECK: ret void |
70 | 50 | define amdgpu_kernel void @timestwo() { |
| 51 | +; CHECK-LABEL: define amdgpu_kernel void @timestwo( |
| 52 | +; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { |
| 53 | +; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds to ptr |
| 54 | +; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64 |
| 55 | +; CHECK-NEXT: [[TMP3:%.*]] = addrspacecast ptr addrspace(3) getelementptr inbounds ([[LLVM_AMDGCN_KERNEL_TIMESTWO_LDS_T:%.*]], ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds, i32 0, i32 1) to ptr |
| 56 | +; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[TMP3]] to i64 |
| 57 | +; CHECK-NEXT: [[TMP5:%.*]] = add i64 [[TMP2]], [[TMP4]] |
| 58 | +; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr |
| 59 | +; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[TMP6]], align 4 |
| 60 | +; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[LD]], 2 |
| 61 | +; CHECK-NEXT: [[TMP7:%.*]] = addrspacecast ptr addrspace(3) getelementptr inbounds ([[LLVM_AMDGCN_KERNEL_TIMESTWO_LDS_T]], ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds, i32 0, i32 1) to ptr |
| 62 | +; CHECK-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP7]] to i64 |
| 63 | +; CHECK-NEXT: [[TMP9:%.*]] = addrspacecast ptr addrspace(3) @llvm.amdgcn.kernel.timestwo.lds to ptr |
| 64 | +; CHECK-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP9]] to i64 |
| 65 | +; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[TMP8]], [[TMP10]] |
| 66 | +; CHECK-NEXT: [[TMP12:%.*]] = inttoptr i64 [[TMP11]] to ptr |
| 67 | +; CHECK-NEXT: store i32 [[MUL]], ptr [[TMP12]], align 4 |
| 68 | +; CHECK-NEXT: ret void |
| 69 | +; |
71 | 70 | %ld = load i32, ptr inttoptr (i64 add (i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @b_both to ptr) to i64), i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @kern to ptr) to i64)) to ptr), align 4 |
72 | 71 | %mul = mul i32 %ld, 2 |
73 | 72 | store i32 %mul, ptr inttoptr (i64 add (i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @kern to ptr) to i64), i64 ptrtoint (ptr addrspacecast (ptr addrspace(3) @b_both to ptr) to i64)) to ptr), align 4 |
74 | 73 | ret void |
75 | 74 | } |
76 | 75 |
|
77 | | -; CHECK-LABEL: @through_functions() #0 |
78 | 76 | define amdgpu_kernel void @through_functions() { |
| 77 | +; CHECK-LABEL: define amdgpu_kernel void @through_functions( |
| 78 | +; CHECK-SAME: ) #[[ATTR0]] { |
| 79 | +; CHECK-NEXT: call void @llvm.donothing() [ "ExplicitUse"(ptr addrspace(3) @llvm.amdgcn.module.lds) ] |
| 80 | +; CHECK-NEXT: [[LD:%.*]] = call i32 @get_func() |
| 81 | +; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[LD]], 4 |
| 82 | +; CHECK-NEXT: call void @set_func(i32 [[MUL]]) |
| 83 | +; CHECK-NEXT: ret void |
| 84 | +; |
79 | 85 | %ld = call i32 @get_func() |
80 | 86 | %mul = mul i32 %ld, 4 |
81 | 87 | call void @set_func(i32 %mul) |
|
0 commit comments