78 lines · plain
1; RUN: opt -S -passes=dxil-op-lower %s | FileCheck %s2 3target triple = "dxil-pc-shadermodel6.6-compute"4 5@A.str = internal unnamed_addr constant [2 x i8] c"A\00", align 16@B.str = internal unnamed_addr constant [2 x i8] c"A\00", align 17 8declare i32 @some_val();9 10define void @test_buffers_with_nuri() {11 12 %val = call i32 @some_val()13 %foo = alloca i32, align 414 15 ; RWBuffer<float> A[10];16 ;17 ; A[NonUniformResourceIndex(val)];18 19 %nuri1 = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %val)20 %res1 = call target("dx.TypedBuffer", float, 1, 0, 0) 21 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 10, i32 %nuri1, ptr @A.str)22 ; CHECK: %[[RES1:.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 0, i32 9, i32 0, i8 1 }, i32 %val, i1 true) #[[ATTR:.*]]23 ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %[[RES1]], %dx.types.ResourceProperties { i32 4106, i32 265 }) #[[ATTR]]24 ; CHECK-NOT: @llvm.dx.cast.handle25 ; CHECK-NOT: @llvm.dx.resource.nonuniformindex26 27 ; A[NonUniformResourceIndex(val + 1) % 10];28 %add1 = add i32 %val, 129 %nuri2 = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %add1)30 %rem1 = urem i32 %nuri2, 1031 %res2 = call target("dx.TypedBuffer", float, 1, 0, 0) 32 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 10, i32 %rem1, ptr @A.str)33 ; CHECK: %[[RES2:.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 0, i32 9, i32 0, i8 1 }, i32 %rem1, i1 true) #[[ATTR]]34 ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %[[RES2]], %dx.types.ResourceProperties { i32 4106, i32 265 }) #[[ATTR]]35 36 ; A[10 + 3 * NonUniformResourceIndex(GI)];37 %mul1 = mul i32 %nuri1, 338 %add2 = add i32 %mul1, 1039 %res3 = call target("dx.TypedBuffer", float, 1, 0, 0)40 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 10, i32 %add2, ptr @A.str)41 ; CHECK: %[[RES3:.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 0, i32 9, i32 0, i8 1 }, i32 %add2, i1 true) #[[ATTR]]42 ; CHECK: %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %[[RES3]], %dx.types.ResourceProperties { i32 4106, i32 265 }) #[[ATTR]]43 ret void44 45 ; NonUniformResourceIndex value going through store & load: the flag is not going to get picked up46 %a = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %val)47 store i32 %a, ptr %foo48 %b = load i32, ptr %foo49 %res4 = call target("dx.TypedBuffer", float, 1, 0, 0)50 @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 10, i32 %b, ptr @A.str)51 ; CHECK: %[[RES4:.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 0, i32 9, i32 0, i8 1 }, i32 %b, i1 false) #[[ATTR]]52 ; CHECK: %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %[[RES4]], %dx.types.ResourceProperties { i32 4106, i32 265 }) #[[ATTR]]53 54 ; NonUniformResourceIndex index value on a single resouce (not an array): the flag is not going to get picked up55 ; RWBuffer<float> B : register(u20);56 ;57 ; B[NonUniformResourceIndex(val)];58 59 %nuri3 = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %val)60 %res5 = call target("dx.TypedBuffer", float, 1, 0, 0)61 @llvm.dx.resource.handlefrombinding(i32 20, i32 0, i32 1, i32 %nuri1, ptr @B.str)62 ; CHECK: %[[RES4:.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 0, i32 0, i32 20, i8 1 }, i32 %val, i1 false) #[[ATTR]]63 ; CHECK: %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %[[RES4]], %dx.types.ResourceProperties { i32 4106, i32 265 }) #[[ATTR]]64 65 ; NonUniformResourceIndex on unrelated value - the call is removed:66 ; foo = NonUniformResourceIndex(val);67 %nuri4 = tail call noundef i32 @llvm.dx.resource.nonuniformindex(i32 %val)68 store i32 %nuri4, ptr %foo69 ; CHECK: store i32 %val, ptr %foo70 ; CHECK-NOT: @llvm.dx.resource.nonuniformindex71 72 ret void73}74 75; CHECK: attributes #[[ATTR]] = {{{.*}} memory(none) {{.*}}}76 77attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) }78