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