brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.1 KiB · 3211c2c Raw
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