brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.9 KiB · 32dca86 Raw
327 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces -o - %s | FileCheck %s3 4define float @assume_is_shared_gep(ptr %p) {5; CHECK-LABEL: define float @assume_is_shared_gep(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 i6412; 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 415; 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 i6422  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom23  %load = load float, ptr %arrayidx, align 424  ret float %load25}26 27define float @assume_is_private_gep(ptr %p) {28; CHECK-LABEL: define float @assume_is_private_gep(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 i6435; 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 438; 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 i6445  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom46  %load = load float, ptr %arrayidx, align 447  ret float %load48}49 50define float @assume_not_private_and_not_shared_gep(ptr %p) {51; CHECK-LABEL: define float @assume_not_private_and_not_shared_gep(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]], true56; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])57; CHECK-NEXT:    [[NOT_SHARED:%.*]] = xor i1 [[IS_SHARED]], true58; 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 i6462; 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 465; 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, true70  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)71  %not.shared = xor i1 %is.shared, true72  %not.private.and.not.shared = and i1 %not.private, %not.shared73  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 i6476  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom77  %load = load float, ptr %arrayidx, align 478  ret float %load79}80 81define float @conditionally_assume_is_shared_gep(i32 %c, ptr %p) {82; CHECK-LABEL: define float @conditionally_assume_is_shared_gep(83; CHECK-SAME: i32 [[C:%.*]], ptr [[P:%.*]]) {84; CHECK-NEXT:  [[ENTRY:.*]]:85; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[C]], 086; 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 i6492; 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 495; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[LOAD0]], 0.000000e+0096; 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 i64101; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[P]], i64 [[IDXPROM2]]102; CHECK-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX2]], align 4103; CHECK-NEXT:    [[ADD2:%.*]] = fadd float [[S]], [[LOAD1]]104; CHECK-NEXT:    ret float [[ADD2]]105;106entry:107  %tobool.not = icmp eq i32 %c, 0108  br i1 %tobool.not, label %if.end, label %if.then109 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 i64115  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom116  %load0 = load float, ptr %arrayidx, align 4117  %add = fadd float %load0, 0.0118  br label %if.end119 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 i64124  %arrayidx2 = getelementptr inbounds float, ptr %p, i64 %idxprom2125  %load1 = load float, ptr %arrayidx2, align 4126  %add2 = fadd float %s, %load1127  ret float %add2128}129 130define float @conditionally_assume_is_shared_else_assume_private(i32 %c, ptr %p) {131; CHECK-LABEL: define float @conditionally_assume_is_shared_else_assume_private(132; CHECK-SAME: i32 [[C:%.*]], ptr [[P:%.*]]) {133; CHECK-NEXT:  [[ENTRY:.*:]]134; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[C]], 0135; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label %[[IF_THEN_SHARED:.*]], label %[[IF_THEN_PRIVATE:.*]]136; CHECK:       [[IF_THEN_SHARED]]:137; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])138; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])139; CHECK-NEXT:    [[WORKITEM_ID_X_0:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()140; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X_0]] to i64141; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3)142; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP0]], i64 [[IDXPROM]]143; CHECK-NEXT:    [[LOAD0:%.*]] = load float, ptr addrspace(3) [[ARRAYIDX0]], align 4144; CHECK-NEXT:    [[ADD0:%.*]] = fadd float [[LOAD0]], 4.000000e+00145; CHECK-NEXT:    br label %[[IF_END:.*]]146; CHECK:       [[IF_THEN_PRIVATE]]:147; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]])148; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_PRIVATE]])149; CHECK-NEXT:    [[WORKITEM_ID_X_1:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()150; CHECK-NEXT:    [[IDXPROM1:%.*]] = zext i32 [[WORKITEM_ID_X_1]] to i64151; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(5)152; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds float, ptr addrspace(5) [[TMP1]], i64 [[IDXPROM1]]153; CHECK-NEXT:    [[LOAD1:%.*]] = load float, ptr addrspace(5) [[ARRAYIDX1]], align 4154; CHECK-NEXT:    [[ADD1:%.*]] = fadd float [[LOAD1]], 4.000000e+00155; CHECK-NEXT:    br label %[[IF_END]]156; CHECK:       [[IF_END]]:157; CHECK-NEXT:    [[PHI:%.*]] = phi float [ [[ADD0]], %[[IF_THEN_SHARED]] ], [ [[ADD1]], %[[IF_THEN_PRIVATE]] ]158; CHECK-NEXT:    ret float [[PHI]]159;160entry:161  %tobool.not = icmp eq i32 %c, 0162  br i1 %tobool.not, label %if.then.shared, label %if.then.private163 164if.then.shared:165  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)166  tail call void @llvm.assume(i1 %is.shared)167  %workitem.id.x.0 = tail call i32 @llvm.amdgcn.workitem.id.x()168  %idxprom = zext i32 %workitem.id.x.0 to i64169  %arrayidx0 = getelementptr inbounds float, ptr %p, i64 %idxprom170  %load0 = load float, ptr %arrayidx0, align 4171  %add0 = fadd float %load0, 4.0172  br label %if.end173 174if.then.private:175  %is.private = call i1 @llvm.amdgcn.is.private(ptr %p)176  tail call void @llvm.assume(i1 %is.private)177  %workitem.id.x.1 = tail call i32 @llvm.amdgcn.workitem.id.x()178  %idxprom1 = zext i32 %workitem.id.x.1 to i64179  %arrayidx1 = getelementptr inbounds float, ptr %p, i64 %idxprom1180  %load1 = load float, ptr %arrayidx1, align 4181  %add1 = fadd float %load1, 4.0182  br label %if.end183 184if.end:185  %phi = phi float [ %add0, %if.then.shared ], [ %add1, %if.then.private ]186  ret float %phi187}188 189define float @assume_func_arg_is_shared_load(ptr %flat.ptr) {190; CHECK-LABEL: define float @assume_func_arg_is_shared_load(191; CHECK-SAME: ptr [[FLAT_PTR:%.*]]) {192; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[FLAT_PTR]])193; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])194; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[FLAT_PTR]], align 4195; CHECK-NEXT:    ret float [[LOAD]]196;197  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %flat.ptr)198  tail call void @llvm.assume(i1 %is.shared)199  %load = load float, ptr %flat.ptr, align 4200  ret float %load201}202 203define float @assume_func_arg_is_private_load(ptr %flat.ptr) {204; CHECK-LABEL: define float @assume_func_arg_is_private_load(205; CHECK-SAME: ptr [[FLAT_PTR:%.*]]) {206; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[FLAT_PTR]])207; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_PRIVATE]])208; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[FLAT_PTR]], align 4209; CHECK-NEXT:    ret float [[LOAD]]210;211  %is.private = call i1 @llvm.amdgcn.is.private(ptr %flat.ptr)212  tail call void @llvm.assume(i1 %is.private)213  %load = load float, ptr %flat.ptr, align 4214  ret float %load215}216 217define float @assume_func_arg_is_not_shared_not_private(ptr %flat.ptr) {218; CHECK-LABEL: define float @assume_func_arg_is_not_shared_not_private(219; CHECK-SAME: ptr [[FLAT_PTR:%.*]]) {220; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[FLAT_PTR]])221; CHECK-NEXT:    [[NOT_PRIVATE:%.*]] = xor i1 [[IS_PRIVATE]], true222; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[FLAT_PTR]])223; CHECK-NEXT:    [[NOT_SHARED:%.*]] = xor i1 [[IS_SHARED]], true224; CHECK-NEXT:    [[NOT_PRIVATE_AND_NOT_SHARED:%.*]] = and i1 [[NOT_PRIVATE]], [[NOT_SHARED]]225; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NOT_PRIVATE_AND_NOT_SHARED]])226; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[FLAT_PTR]], align 4227; CHECK-NEXT:    ret float [[LOAD]]228;229  %is.private = call i1 @llvm.amdgcn.is.private(ptr %flat.ptr)230  %not.private = xor i1 %is.private, true231  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %flat.ptr)232  %not.shared = xor i1 %is.shared, true233  %not.private.and.not.shared = and i1 %not.private, %not.shared234  tail call void @llvm.assume(i1 %not.private.and.not.shared)235  %load = load float, ptr %flat.ptr, align 4236  ret float %load237}238 239define float @assume_func_arg_is_not_private_load(ptr %flat.ptr) {240; CHECK-LABEL: define float @assume_func_arg_is_not_private_load(241; CHECK-SAME: ptr [[FLAT_PTR:%.*]]) {242; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[FLAT_PTR]])243; CHECK-NEXT:    [[NOT_IS_PRIVATE:%.*]] = xor i1 [[IS_PRIVATE]], true244; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NOT_IS_PRIVATE]])245; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr [[FLAT_PTR]], align 4246; CHECK-NEXT:    ret float [[LOAD]]247;248  %is.private = call i1 @llvm.amdgcn.is.private(ptr %flat.ptr)249  %not.is.private = xor i1 %is.private, true250  tail call void @llvm.assume(i1 %not.is.private)251  %load = load float, ptr %flat.ptr, align 4252  ret float %load253}254 255define i64 @assume_func_arg_is_not_private_atomicrmw(ptr %flat.ptr, i64 %val) {256; CHECK-LABEL: define i64 @assume_func_arg_is_not_private_atomicrmw(257; CHECK-SAME: ptr [[FLAT_PTR:%.*]], i64 [[VAL:%.*]]) {258; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[FLAT_PTR]])259; CHECK-NEXT:    [[NOT_IS_PRIVATE:%.*]] = xor i1 [[IS_PRIVATE]], true260; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NOT_IS_PRIVATE]])261; CHECK-NEXT:    [[RMW:%.*]] = atomicrmw sub ptr [[FLAT_PTR]], i64 [[VAL]] seq_cst, align 4262; CHECK-NEXT:    ret i64 [[RMW]]263;264  %is.private = call i1 @llvm.amdgcn.is.private(ptr %flat.ptr)265  %not.is.private = xor i1 %is.private, true266  tail call void @llvm.assume(i1 %not.is.private)267  %rmw = atomicrmw sub ptr %flat.ptr, i64 %val seq_cst, align 4268  ret i64 %rmw269}270 271define float @contradictory_assume_after_gep_same_block(ptr %p) {272; CHECK-LABEL: define float @contradictory_assume_after_gep_same_block(273; CHECK-SAME: ptr [[P:%.*]]) {274; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])275; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])276; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()277; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64278; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3)279; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP1]], i64 [[IDXPROM]]280; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[P]], i64 [[IDXPROM]]281; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[TMP2]])282; CHECK-NEXT:    tail call void @llvm.assume(i1 false)283; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(3) [[GEP]], align 4284; CHECK-NEXT:    ret float [[LOAD]]285;286  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)287  tail call void @llvm.assume(i1 %is.shared)288  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()289  %idxprom = zext i32 %workitem.id.x to i64290  %gep = getelementptr inbounds float, ptr %p, i64 %idxprom291  %is.private = call i1 @llvm.amdgcn.is.private(ptr %gep)292  tail call void @llvm.assume(i1 %is.private)293  %load = load float, ptr %gep, align 4294  ret float %load295}296 297define float @contradictory_assume_argument_same_block(ptr %p) {298; CHECK-LABEL: define float @contradictory_assume_argument_same_block(299; CHECK-SAME: ptr [[P:%.*]]) {300; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])301; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]])302; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])303; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_PRIVATE]])304; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()305; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64306; CHECK-NEXT:    [[TMP1:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3)307; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP1]], i64 [[IDXPROM]]308; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(3) [[GEP]], align 4309; CHECK-NEXT:    ret float [[LOAD]]310;311  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)312  %is.private = call i1 @llvm.amdgcn.is.private(ptr %p)313  tail call void @llvm.assume(i1 %is.shared)314  tail call void @llvm.assume(i1 %is.private)315  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()316  %idxprom = zext i32 %workitem.id.x to i64317  %gep = getelementptr inbounds float, ptr %p, i64 %idxprom318  %load = load float, ptr %gep, align 4319  ret float %load320}321 322declare void @llvm.assume(i1)323declare i1 @llvm.amdgcn.is.shared(ptr nocapture)324declare i1 @llvm.amdgcn.is.private(ptr nocapture)325declare i32 @llvm.amdgcn.workitem.id.x()326declare i32 @llvm.amdgcn.workitem.id.y()327