133 lines · cpp
1//===- llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp -----===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ADT/ArrayRef.h"10#include "llvm/Analysis/DXILResource.h"11#include "llvm/AsmParser/Parser.h"12#include "llvm/Passes/PassBuilder.h"13#include "llvm/Support/DXILABI.h"14#include "gtest/gtest.h"15#include <cstdint>16 17using namespace llvm;18using namespace llvm::dxil;19 20namespace {21class ResourceBindingAnalysisTest : public testing::Test {22protected:23 PassBuilder *PB;24 ModuleAnalysisManager *MAM;25 LLVMContext *Context;26 27 virtual void SetUp() {28 PB = new PassBuilder();29 MAM = new ModuleAnalysisManager();30 Context = new LLVMContext();31 PB->registerModuleAnalyses(*MAM);32 MAM->registerPass([&] { return DXILResourceBindingAnalysis(); });33 }34 35 std::unique_ptr<Module> parseAsm(StringRef Asm) {36 SMDiagnostic Error;37 std::unique_ptr<Module> M = parseAssemblyString(Asm, Error, *Context);38 EXPECT_TRUE(M) << "Bad assembly?: " << Error.getMessage();39 return M;40 }41 42 virtual void TearDown() {43 delete PB;44 delete MAM;45 delete Context;46 }47};48 49TEST_F(ResourceBindingAnalysisTest, TestTrivialCase) {50 // RWBuffer<float> Buf : register(u5);51 StringRef Assembly = R"(52define void @main() {53entry:54 %handle = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, ptr null)55 ret void56}57 )";58 59 auto M = parseAsm(Assembly);60 61 DXILResourceBindingInfo &DRBI =62 MAM->getResult<DXILResourceBindingAnalysis>(*M);63 64 EXPECT_EQ(false, DRBI.hasImplicitBinding());65 EXPECT_EQ(false, DRBI.hasOverlappingBinding());66}67 68TEST_F(ResourceBindingAnalysisTest, TestOverlap) {69 // StructuredBuffer<float> A[] : register(t0, space2);70 // StructuredBuffer<float> B : register(t4, space2); /* overlapping */71 StringRef Assembly = R"(72define void @main() {73entry:74 %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 0, i32 -1, i32 100, ptr null)75 %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 4, i32 1, i32 0, ptr null)76 ret void77}78 )";79 80 auto M = parseAsm(Assembly);81 82 DXILResourceBindingInfo &DRBI =83 MAM->getResult<DXILResourceBindingAnalysis>(*M);84 85 EXPECT_EQ(false, DRBI.hasImplicitBinding());86 EXPECT_EQ(true, DRBI.hasOverlappingBinding());87}88 89TEST_F(ResourceBindingAnalysisTest, TestExactOverlap) {90 // StructuredBuffer<float> A : register(t5);91 // StructuredBuffer<float> B : register(t5);92 StringRef Assembly = R"(93@A.str = private unnamed_addr constant [2 x i8] c"A\00", align 194@B.str = private unnamed_addr constant [2 x i8] c"B\00", align 195define void @main() {96entry:97 %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, ptr @A.str)98 %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, ptr @B.str)99 ret void100}101 )";102 103 auto M = parseAsm(Assembly);104 105 DXILResourceBindingInfo &DRBI =106 MAM->getResult<DXILResourceBindingAnalysis>(*M);107 108 EXPECT_EQ(false, DRBI.hasImplicitBinding());109 EXPECT_EQ(true, DRBI.hasOverlappingBinding());110}111 112TEST_F(ResourceBindingAnalysisTest, TestImplicitFlag) {113 // RWBuffer<float> A : register(u5, space100);114 // RWBuffer<float> B;115 StringRef Assembly = R"(116define void @main() {117entry:118 %handleA = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 100, i32 5, i32 1, i32 0, ptr null)119 %handleB = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefromimplicitbinding(i32 0, i32 0, i32 1, i32 0, ptr null)120 ret void121}122 )";123 124 auto M = parseAsm(Assembly);125 126 DXILResourceBindingInfo &DRBI =127 MAM->getResult<DXILResourceBindingAnalysis>(*M);128 EXPECT_TRUE(DRBI.hasImplicitBinding());129 EXPECT_FALSE(DRBI.hasOverlappingBinding());130}131 132} // namespace133