|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
1 | 2 | ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces -o - %s | FileCheck %s
|
2 | 3 |
|
3 |
| -; CHECK-LABEL: @f0 |
4 |
| -; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(3) |
5 |
| -; CHECK: getelementptr inbounds float, ptr addrspace(3) |
6 |
| -; CHECK: load float, ptr addrspace(3) |
7 | 4 | define float @f0(ptr %p) {
|
| 5 | +; CHECK-LABEL: define float @f0( |
| 6 | +; CHECK-SAME: ptr [[P:%.*]]) { |
| 7 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 8 | +; CHECK-NEXT: [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]]) |
| 9 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[IS_SHARED]]) |
| 10 | +; CHECK-NEXT: [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 11 | +; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64 |
| 12 | +; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3) |
| 13 | +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP0]], i64 [[IDXPROM]] |
| 14 | +; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(3) [[ARRAYIDX]], align 4 |
| 15 | +; CHECK-NEXT: ret float [[LOAD]] |
| 16 | +; |
8 | 17 | entry:
|
9 |
| - %0 = call i1 @llvm.amdgcn.is.shared(ptr %p) |
10 |
| - tail call void @llvm.assume(i1 %0) |
11 |
| - %1 = tail call i32 @llvm.amdgcn.workitem.id.x() |
12 |
| - %idxprom = zext i32 %1 to i64 |
| 18 | + %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p) |
| 19 | + tail call void @llvm.assume(i1 %is.shared) |
| 20 | + %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 21 | + %idxprom = zext i32 %workitem.id.x to i64 |
13 | 22 | %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
|
14 |
| - %2 = load float, ptr %arrayidx, align 4 |
15 |
| - ret float %2 |
| 23 | + %load = load float, ptr %arrayidx, align 4 |
| 24 | + ret float %load |
16 | 25 | }
|
17 | 26 |
|
18 |
| -; CHECK-LABEL: @f1 |
19 |
| -; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(5) |
20 |
| -; CHECK: getelementptr inbounds float, ptr addrspace(5) |
21 |
| -; CHECK: load float, ptr addrspace(5) |
22 | 27 | define float @f1(ptr %p) {
|
| 28 | +; CHECK-LABEL: define float @f1( |
| 29 | +; CHECK-SAME: ptr [[P:%.*]]) { |
| 30 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 31 | +; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]]) |
| 32 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[IS_PRIVATE]]) |
| 33 | +; CHECK-NEXT: [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 34 | +; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64 |
| 35 | +; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(5) |
| 36 | +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(5) [[TMP0]], i64 [[IDXPROM]] |
| 37 | +; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(5) [[ARRAYIDX]], align 4 |
| 38 | +; CHECK-NEXT: ret float [[LOAD]] |
| 39 | +; |
23 | 40 | entry:
|
24 |
| - %0 = call i1 @llvm.amdgcn.is.private(ptr %p) |
25 |
| - tail call void @llvm.assume(i1 %0) |
26 |
| - %1 = tail call i32 @llvm.amdgcn.workitem.id.x() |
27 |
| - %idxprom = zext i32 %1 to i64 |
| 41 | + %is.private = call i1 @llvm.amdgcn.is.private(ptr %p) |
| 42 | + tail call void @llvm.assume(i1 %is.private) |
| 43 | + %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 44 | + %idxprom = zext i32 %workitem.id.x to i64 |
28 | 45 | %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
|
29 |
| - %2 = load float, ptr %arrayidx, align 4 |
30 |
| - ret float %2 |
| 46 | + %load = load float, ptr %arrayidx, align 4 |
| 47 | + ret float %load |
31 | 48 | }
|
32 | 49 |
|
33 |
| -; CHECK-LABEL: @f2 |
34 |
| -; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(1) |
35 |
| -; CHECK: getelementptr inbounds float, ptr addrspace(1) |
36 |
| -; CHECK: load float, ptr addrspace(1) |
37 | 50 | define float @f2(ptr %p) {
|
| 51 | +; CHECK-LABEL: define float @f2( |
| 52 | +; CHECK-SAME: ptr [[P:%.*]]) { |
| 53 | +; CHECK-NEXT: [[ENTRY:.*:]] |
| 54 | +; CHECK-NEXT: [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]]) |
| 55 | +; CHECK-NEXT: [[NOT_PRIVATE:%.*]] = xor i1 [[IS_PRIVATE]], true |
| 56 | +; CHECK-NEXT: [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]]) |
| 57 | +; CHECK-NEXT: [[NOT_SHARED:%.*]] = xor i1 [[IS_SHARED]], true |
| 58 | +; CHECK-NEXT: [[NOT_PRIVATE_AND_NOT_SHARED:%.*]] = and i1 [[NOT_PRIVATE]], [[NOT_SHARED]] |
| 59 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[NOT_PRIVATE_AND_NOT_SHARED]]) |
| 60 | +; CHECK-NEXT: [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 61 | +; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64 |
| 62 | +; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(1) |
| 63 | +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[TMP0]], i64 [[IDXPROM]] |
| 64 | +; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr addrspace(1) [[ARRAYIDX]], align 4 |
| 65 | +; CHECK-NEXT: ret float [[LOAD]] |
| 66 | +; |
38 | 67 | entry:
|
39 |
| - %0 = call i1 @llvm.amdgcn.is.private(ptr %p) |
40 |
| - %1 = xor i1 %0, -1 |
41 |
| - %2 = call i1 @llvm.amdgcn.is.shared(ptr %p) |
42 |
| - %3 = xor i1 %2, -1 |
43 |
| - %4 = and i1 %1, %3 |
44 |
| - tail call void @llvm.assume(i1 %4) |
45 |
| - %5 = tail call i32 @llvm.amdgcn.workitem.id.x() |
46 |
| - %idxprom = zext i32 %5 to i64 |
| 68 | + %is.private = call i1 @llvm.amdgcn.is.private(ptr %p) |
| 69 | + %not.private = xor i1 %is.private, true |
| 70 | + %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p) |
| 71 | + %not.shared = xor i1 %is.shared, true |
| 72 | + %not.private.and.not.shared = and i1 %not.private, %not.shared |
| 73 | + tail call void @llvm.assume(i1 %not.private.and.not.shared) |
| 74 | + %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 75 | + %idxprom = zext i32 %workitem.id.x to i64 |
47 | 76 | %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
|
48 |
| - %6 = load float, ptr %arrayidx, align 4 |
49 |
| - ret float %6 |
| 77 | + %load = load float, ptr %arrayidx, align 4 |
| 78 | + ret float %load |
50 | 79 | }
|
51 | 80 |
|
52 |
| -; CHECK-LABEL: @g0 |
53 |
| -; CHECK: if.then: |
54 |
| -; CHECK: addrspacecast ptr {{%.*}} to ptr addrspace(3) |
55 |
| -; CHECK: getelementptr inbounds float, ptr addrspace(3) |
56 |
| -; CHECK: load float, ptr addrspace(3) |
57 |
| -; CHECK: if.end: |
58 |
| -; CHECK: getelementptr inbounds float, ptr |
59 |
| -; CHECK: load float, ptr |
60 | 81 | define float @g0(i32 %c, ptr %p) {
|
| 82 | +; CHECK-LABEL: define float @g0( |
| 83 | +; CHECK-SAME: i32 [[C:%.*]], ptr [[P:%.*]]) { |
| 84 | +; CHECK-NEXT: [[ENTRY:.*]]: |
| 85 | +; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[C]], 0 |
| 86 | +; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label %[[IF_END:.*]], label %[[IF_THEN:.*]] |
| 87 | +; CHECK: [[IF_THEN]]: |
| 88 | +; CHECK-NEXT: [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]]) |
| 89 | +; CHECK-NEXT: tail call void @llvm.assume(i1 [[IS_SHARED]]) |
| 90 | +; CHECK-NEXT: [[WORKITEM_ID_X_0:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 91 | +; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X_0]] to i64 |
| 92 | +; CHECK-NEXT: [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3) |
| 93 | +; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP0]], i64 [[IDXPROM]] |
| 94 | +; CHECK-NEXT: [[LOAD0:%.*]] = load float, ptr addrspace(3) [[ARRAYIDX]], align 4 |
| 95 | +; CHECK-NEXT: [[ADD:%.*]] = fadd float [[LOAD0]], 0.000000e+00 |
| 96 | +; CHECK-NEXT: br label %[[IF_END]] |
| 97 | +; CHECK: [[IF_END]]: |
| 98 | +; CHECK-NEXT: [[S:%.*]] = phi float [ [[ADD]], %[[IF_THEN]] ], [ 0.000000e+00, %[[ENTRY]] ] |
| 99 | +; CHECK-NEXT: [[WORKITEM_ID_X_1:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.y() |
| 100 | +; CHECK-NEXT: [[IDXPROM2:%.*]] = zext i32 [[WORKITEM_ID_X_1]] to i64 |
| 101 | +; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[P]], i64 [[IDXPROM2]] |
| 102 | +; CHECK-NEXT: [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX2]], align 4 |
| 103 | +; CHECK-NEXT: [[ADD2:%.*]] = fadd float [[S]], [[LOAD1]] |
| 104 | +; CHECK-NEXT: ret float [[ADD2]] |
| 105 | +; |
61 | 106 | entry:
|
62 | 107 | %tobool.not = icmp eq i32 %c, 0
|
63 | 108 | br i1 %tobool.not, label %if.end, label %if.then
|
64 | 109 |
|
65 | 110 | if.then:
|
66 |
| - %0 = call i1 @llvm.amdgcn.is.shared(ptr %p) |
67 |
| - tail call void @llvm.assume(i1 %0) |
68 |
| - %1 = tail call i32 @llvm.amdgcn.workitem.id.x() |
69 |
| - %idxprom = zext i32 %1 to i64 |
| 111 | + %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p) |
| 112 | + tail call void @llvm.assume(i1 %is.shared) |
| 113 | + %workitem.id.x.0 = tail call i32 @llvm.amdgcn.workitem.id.x() |
| 114 | + %idxprom = zext i32 %workitem.id.x.0 to i64 |
70 | 115 | %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
|
71 |
| - %2 = load float, ptr %arrayidx, align 4 |
72 |
| - %add = fadd float %2, 0. |
| 116 | + %load0 = load float, ptr %arrayidx, align 4 |
| 117 | + %add = fadd float %load0, 0.0 |
73 | 118 | br label %if.end
|
74 | 119 |
|
75 | 120 | if.end:
|
76 |
| - %s = phi float [ %add, %if.then ], [ 0., %entry ] |
77 |
| - %3 = tail call i32 @llvm.amdgcn.workitem.id.y() |
78 |
| - %idxprom2 = zext i32 %3 to i64 |
| 121 | + %s = phi float [ %add, %if.then ], [ 0.0, %entry ] |
| 122 | + %workitem.id.x.1 = tail call i32 @llvm.amdgcn.workitem.id.y() |
| 123 | + %idxprom2 = zext i32 %workitem.id.x.1 to i64 |
79 | 124 | %arrayidx2 = getelementptr inbounds float, ptr %p, i64 %idxprom2
|
80 |
| - %4 = load float, ptr %arrayidx2, align 4 |
81 |
| - %add2 = fadd float %s, %4 |
| 125 | + %load1 = load float, ptr %arrayidx2, align 4 |
| 126 | + %add2 = fadd float %s, %load1 |
82 | 127 | ret float %add2
|
83 | 128 | }
|
84 | 129 |
|
|
0 commit comments