diff --git a/llvm/lib/Target/DirectX/DXILResource.cpp b/llvm/lib/Target/DirectX/DXILResource.cpp --- a/llvm/lib/Target/DirectX/DXILResource.cpp +++ b/llvm/lib/Target/DirectX/DXILResource.cpp @@ -29,7 +29,10 @@ uint32_t Counter = 0; for (auto *UAV : Entry->operands()) { - UAVs.push_back(UAVResource(Counter++, FrontendResource(cast(UAV)))); + auto Res = FrontendResource(cast(UAV)); + if (Res.getGlobalVariable()->user_empty()) + continue; + UAVs.push_back(UAVResource(Counter++, Res)); } } diff --git a/llvm/test/CodeGen/DirectX/UAVMetadata.ll b/llvm/test/CodeGen/DirectX/UAVMetadata.ll --- a/llvm/test/CodeGen/DirectX/UAVMetadata.ll +++ b/llvm/test/CodeGen/DirectX/UAVMetadata.ll @@ -34,6 +34,20 @@ @Eight = local_unnamed_addr global %"class.hlsl::RWBuffer" zeroinitializer, align 4 @Nine = local_unnamed_addr global %"class.hlsl::RWBuffer" zeroinitializer, align 4 +define void @"foo"() #0 { + %ld0 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Zero + %ld1 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @One + %ld2 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Two + %ld3 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Three + %ld4 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Four + %ld5 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Five + %ld6 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Six + %ld7 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Seven + %ld8 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Eight + %ld9 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Nine + ret void +} +attributes #0 = { noinline optnone } !hlsl.uavs = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9} diff --git a/llvm/test/CodeGen/DirectX/UAVMetadata.ll b/llvm/test/CodeGen/DirectX/UnusedUAV.ll copy from llvm/test/CodeGen/DirectX/UAVMetadata.ll copy to llvm/test/CodeGen/DirectX/UnusedUAV.ll --- a/llvm/test/CodeGen/DirectX/UAVMetadata.ll +++ b/llvm/test/CodeGen/DirectX/UnusedUAV.ll @@ -16,12 +16,10 @@ ; PRINT-NEXT:; UAV f32 buf U1 u1 1 ; PRINT-NEXT:; UAV f64 buf U2 u2 1 ; PRINT-NEXT:; UAV i1 buf U3 u3 2 -; PRINT-NEXT:; UAV byte r/w U4 u5 1 -; PRINT-NEXT:; UAV struct r/w U5 u6 1 -; PRINT-NEXT:; UAV i32 buf U6 u7 1 -; PRINT-NEXT:; UAV struct r/w U7 u8 1 -; PRINT-NEXT:; UAV byte r/w U8 u9 1 -; PRINT-NEXT:; UAV u64 buf U9 u10,space2 1 +; PRINT-NEXT:; UAV struct r/w U4 u6 1 +; PRINT-NEXT:; UAV i32 buf U5 u7 1 +; PRINT-NEXT:; UAV byte r/w U6 u9 1 +; PRINT-NEXT:; UAV u64 buf U7 u10,space2 1 @Zero = local_unnamed_addr global %"class.hlsl::RWBuffer" zeroinitializer, align 4 @One = local_unnamed_addr global %"class.hlsl::RWBuffer" zeroinitializer, align 4 @@ -34,6 +32,18 @@ @Eight = local_unnamed_addr global %"class.hlsl::RWBuffer" zeroinitializer, align 4 @Nine = local_unnamed_addr global %"class.hlsl::RWBuffer" zeroinitializer, align 4 +define void @"foo"() #0 { + %ld0 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Zero + %ld1 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @One + %ld2 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Two + %ld3 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Three + %ld5 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Five + %ld6 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Six + %ld8 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Eight + %ld9 = load %"class.hlsl::RWBuffer", %"class.hlsl::RWBuffer"* @Nine + ret void +} +attributes #0 = { noinline optnone } !hlsl.uavs = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9} @@ -52,8 +62,8 @@ ; CHECK: [[ResList]] = !{null, [[UAVList:[!][0-9]+]], null, null} ; CHECK: [[UAVList]] = !{[[Zero:[!][0-9]+]], [[One:[!][0-9]+]], -; CHECK-SAME: [[Two:[!][0-9]+]], [[Three:[!][0-9]+]], [[Four:[!][0-9]+]], -; CHECK-SAME: [[Five:[!][0-9]+]], [[Six:[!][0-9]+]], [[Seven:[!][0-9]+]], +; CHECK-SAME: [[Two:[!][0-9]+]], [[Three:[!][0-9]+]], +; CHECK-SAME: [[Five:[!][0-9]+]], [[Six:[!][0-9]+]], ; CHECK-SAME: [[Eight:[!][0-9]+]], [[Nine:[!][0-9]+]]} ; CHECK: [[Zero]] = !{i32 0, ptr @Zero, !"", i32 0, i32 0, i32 1, i32 10, i1 false, i1 false, i1 false, [[Half:[!][0-9]+]]} ; CHECK: [[Half]] = !{i32 0, i32 8} @@ -63,15 +73,11 @@ ; CHECK: [[Double]] = !{i32 0, i32 10} ; CHECK: [[Three]] = !{i32 3, ptr @Three, !"", i32 0, i32 3, i32 2, i32 10, i1 false, i1 false, i1 false, [[Bool:[!][0-9]+]]} ; CHECK: [[Bool]] = !{i32 0, i32 1} -; CHECK: [[Four]] = !{i32 4, ptr @Four, !"", i32 0, i32 5, i32 1, i32 11, i1 false, i1 false, i1 false, [[I16:[!][0-9]+]]} -; CHECK: [[I16]] = !{i32 0, i32 2} -; CHECK: [[Five]] = !{i32 5, ptr @Five, !"", i32 0, i32 6, i32 1, i32 12, i1 false, i1 false, i1 false, [[U16:[!][0-9]+]]} +; CHECK: [[Five]] = !{i32 4, ptr @Five, !"", i32 0, i32 6, i32 1, i32 12, i1 false, i1 false, i1 false, [[U16:[!][0-9]+]]} ; CHECK: [[U16]] = !{i32 0, i32 3} -; CHECK: [[Six]] = !{i32 6, ptr @Six, !"", i32 0, i32 7, i32 1, i32 10, i1 false, i1 false, i1 true, [[I32:[!][0-9]+]]} +; CHECK: [[Six]] = !{i32 5, ptr @Six, !"", i32 0, i32 7, i32 1, i32 10, i1 false, i1 false, i1 true, [[I32:[!][0-9]+]]} ; CHECK: [[I32]] = !{i32 0, i32 4} -; CHECK: [[Seven]] = !{i32 7, ptr @Seven, !"", i32 0, i32 8, i32 1, i32 12, i1 false, i1 false, i1 true, [[U32:[!][0-9]+]]} -; CHECK: [[U32]] = !{i32 0, i32 5} -; CHECK: [[Eight]] = !{i32 8, ptr @Eight, !"", i32 0, i32 9, i32 1, i32 11, i1 false, i1 false, i1 true, [[I64:[!][0-9]+]]} +; CHECK: [[Eight]] = !{i32 6, ptr @Eight, !"", i32 0, i32 9, i32 1, i32 11, i1 false, i1 false, i1 true, [[I64:[!][0-9]+]]} ; CHECK: [[I64]] = !{i32 0, i32 6} -; CHECK: [[Nine]] = !{i32 9, ptr @Nine, !"", i32 2, i32 10, i32 1, i32 10, i1 false, i1 false, i1 false, [[U64:[!][0-9]+]]} +; CHECK: [[Nine]] = !{i32 7, ptr @Nine, !"", i32 2, i32 10, i32 1, i32 10, i1 false, i1 false, i1 false, [[U64:[!][0-9]+]]} ; CHECK: [[U64]] = !{i32 0, i32 7}