1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces -o - %s | FileCheck %s 3 4define 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; 17entry: 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 22 %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom 23 %load = load float, ptr %arrayidx, align 4 24 ret float %load 25} 26 27define 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; 40entry: 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 45 %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom 46 %load = load float, ptr %arrayidx, align 4 47 ret float %load 48} 49 50define 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; 67entry: 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 76 %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom 77 %load = load float, ptr %arrayidx, align 4 78 ret float %load 79} 80 81define 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; 106entry: 107 %tobool.not = icmp eq i32 %c, 0 108 br i1 %tobool.not, label %if.end, label %if.then 109 110if.then: 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 115 %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom 116 %load0 = load float, ptr %arrayidx, align 4 117 %add = fadd float %load0, 0.0 118 br label %if.end 119 120if.end: 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 124 %arrayidx2 = getelementptr inbounds float, ptr %p, i64 %idxprom2 125 %load1 = load float, ptr %arrayidx2, align 4 126 %add2 = fadd float %s, %load1 127 ret float %add2 128} 129 130declare void @llvm.assume(i1) 131declare i1 @llvm.amdgcn.is.shared(ptr nocapture) 132declare i1 @llvm.amdgcn.is.private(ptr nocapture) 133declare i32 @llvm.amdgcn.workitem.id.x() 134declare i32 @llvm.amdgcn.workitem.id.y() 135