From 8776c02d4f296f13f356c34707f4052f057c4538 Mon Sep 17 00:00:00 2001 From: Helena Kotas Date: Wed, 14 May 2025 17:26:10 -0700 Subject: [PATCH 1/7] [HLSL] Add resource name argument to resource class constructors --- clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp | 9 +++-- clang/lib/Sema/SemaHLSL.cpp | 21 +++++++--- .../test/AST/HLSL/ByteAddressBuffers-AST.hlsl | 8 +++- .../test/AST/HLSL/StructuredBuffers-AST.hlsl | 8 +++- clang/test/AST/HLSL/TypedBuffers-AST.hlsl | 8 +++- .../CodeGenHLSL/GlobalConstructorLib.hlsl | 2 +- .../ByteAddressBuffers-constructors.hlsl | 38 ++++++++++--------- .../builtins/RWBuffer-constructor.hlsl | 36 ++++++++++-------- .../StructuredBuffers-constructors.hlsl | 37 +++++++++--------- 9 files changed, 101 insertions(+), 66 deletions(-) diff --git a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp index 7a561638aebbc..e5c6220bfb47d 100644 --- a/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp +++ b/clang/lib/Sema/HLSLBuiltinTypeDeclBuilder.cpp @@ -120,7 +120,7 @@ struct BuiltinTypeMethodBuilder { // LastStmt - refers to the last statement in the method body; referencing // LastStmt will remove the statement from the method body since // it will be linked from the new expression being constructed. - enum class PlaceHolder { _0, _1, _2, _3, Handle = 128, LastStmt }; + enum class PlaceHolder { _0, _1, _2, _3, _4, Handle = 128, LastStmt }; Expr *convertPlaceholder(PlaceHolder PH); Expr *convertPlaceholder(Expr *E) { return E; } @@ -662,8 +662,9 @@ BuiltinTypeDeclBuilder::addHandleConstructorFromBinding() { .addParam("spaceNo", AST.UnsignedIntTy) .addParam("range", AST.IntTy) .addParam("index", AST.UnsignedIntTy) + .addParam("name", AST.getPointerType(AST.CharTy.withConst())) .callBuiltin("__builtin_hlsl_resource_handlefrombinding", HandleType, - PH::Handle, PH::_0, PH::_1, PH::_2, PH::_3) + PH::Handle, PH::_0, PH::_1, PH::_2, PH::_3, PH::_4) .assign(PH::Handle, PH::LastStmt) .finalize(); } @@ -682,8 +683,10 @@ BuiltinTypeDeclBuilder::addHandleConstructorFromImplicitBinding() { .addParam("range", AST.IntTy) .addParam("index", AST.UnsignedIntTy) .addParam("orderId", AST.UnsignedIntTy) + .addParam("name", AST.getPointerType(AST.CharTy.withConst())) .callBuiltin("__builtin_hlsl_resource_handlefromimplicitbinding", - HandleType, PH::Handle, PH::_0, PH::_1, PH::_2, PH::_3) + HandleType, PH::Handle, PH::_0, PH::_1, PH::_2, PH::_3, + PH::_4) .assign(PH::Handle, PH::LastStmt) .finalize(); } diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index c4dcfd3eb8f99..391bdcf20ca99 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -2465,12 +2465,14 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { } case Builtin::BI__builtin_hlsl_resource_handlefrombinding: { ASTContext &AST = SemaRef.getASTContext(); - if (SemaRef.checkArgCount(TheCall, 5) || + if (SemaRef.checkArgCount(TheCall, 6) || CheckResourceHandle(&SemaRef, TheCall, 0) || CheckArgTypeMatches(&SemaRef, TheCall->getArg(1), AST.UnsignedIntTy) || CheckArgTypeMatches(&SemaRef, TheCall->getArg(2), AST.UnsignedIntTy) || CheckArgTypeMatches(&SemaRef, TheCall->getArg(3), AST.IntTy) || - CheckArgTypeMatches(&SemaRef, TheCall->getArg(4), AST.UnsignedIntTy)) + CheckArgTypeMatches(&SemaRef, TheCall->getArg(4), AST.UnsignedIntTy) || + CheckArgTypeMatches(&SemaRef, TheCall->getArg(5), + AST.getPointerType(AST.CharTy.withConst()))) return true; // use the type of the handle (arg0) as a return type QualType ResourceTy = TheCall->getArg(0)->getType(); @@ -2479,12 +2481,14 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { } case Builtin::BI__builtin_hlsl_resource_handlefromimplicitbinding: { ASTContext &AST = SemaRef.getASTContext(); - if (SemaRef.checkArgCount(TheCall, 5) || + if (SemaRef.checkArgCount(TheCall, 6) || CheckResourceHandle(&SemaRef, TheCall, 0) || CheckArgTypeMatches(&SemaRef, TheCall->getArg(1), AST.UnsignedIntTy) || CheckArgTypeMatches(&SemaRef, TheCall->getArg(2), AST.IntTy) || CheckArgTypeMatches(&SemaRef, TheCall->getArg(3), AST.UnsignedIntTy) || - CheckArgTypeMatches(&SemaRef, TheCall->getArg(4), AST.UnsignedIntTy)) + CheckArgTypeMatches(&SemaRef, TheCall->getArg(4), AST.UnsignedIntTy) || + CheckArgTypeMatches(&SemaRef, TheCall->getArg(5), + AST.getPointerType(AST.CharTy.withConst()))) return true; // use the type of the handle (arg0) as a return type QualType ResourceTy = TheCall->getArg(0)->getType(); @@ -3355,13 +3359,18 @@ bool SemaHLSL::initGlobalResourceDecl(VarDecl *VD) { IntegerLiteral *Space = IntegerLiteral::Create(AST, llvm::APInt(UIntTySize, SpaceNo), AST.UnsignedIntTy, SourceLocation()); + StringRef VarName = VD->getName(); + StringLiteral *Name = StringLiteral::Create( + AST, VarName, StringLiteralKind::Ordinary, false, + AST.getStringLiteralArrayType(AST.CharTy.withConst(), VarName.size()), + SourceLocation()); // resource with explicit binding if (RegisterSlot.has_value()) { IntegerLiteral *RegSlot = IntegerLiteral::Create( AST, llvm::APInt(UIntTySize, RegisterSlot.value()), AST.UnsignedIntTy, SourceLocation()); - Expr *Args[] = {RegSlot, Space, RangeSize, Index}; + Expr *Args[] = {RegSlot, Space, RangeSize, Index, Name}; return initVarDeclWithCtor(SemaRef, VD, Args); } @@ -3369,7 +3378,7 @@ bool SemaHLSL::initGlobalResourceDecl(VarDecl *VD) { IntegerLiteral *OrderId = IntegerLiteral::Create( AST, llvm::APInt(UIntTySize, getNextImplicitBindingOrderID()), AST.UnsignedIntTy, SourceLocation()); - Expr *Args[] = {Space, RangeSize, Index, OrderId}; + Expr *Args[] = {Space, RangeSize, Index, OrderId, Name}; return initVarDeclWithCtor(SemaRef, VD, Args); } diff --git a/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl b/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl index 8b9aa99a5314e..ba837b2d8cce5 100644 --- a/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl +++ b/clang/test/AST/HLSL/ByteAddressBuffers-AST.hlsl @@ -58,11 +58,12 @@ RESOURCE Buffer; // Constructor from binding -// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, unsigned int, int, unsigned int)' inline +// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, unsigned int, int, unsigned int, const char *)' inline // CHECK-NEXT: ParmVarDecl {{.*}} registerNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' +// CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' // CHECK-NEXT: CompoundStmt {{.*}} // CHECK-NEXT: BinaryOperator {{.*}} '=' // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle @@ -76,15 +77,17 @@ RESOURCE Buffer; // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'spaceNo' 'unsigned int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' +// CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' // CHECK-NEXT: AlwaysInlineAttr // Constructor from implicit binding -// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, int, unsigned int, unsigned int)' inline +// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, int, unsigned int, unsigned int, const char *)' inline // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} orderId 'unsigned int' +// CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' // CHECK-NEXT: CompoundStmt {{.*}} // CHECK-NEXT: BinaryOperator {{.*}} '=' // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle @@ -98,6 +101,7 @@ RESOURCE Buffer; // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'orderId' 'unsigned int' +// CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' // CHECK-NEXT: AlwaysInlineAttr // CHECK-NOSUBSCRIPT-NOT: CXXMethodDecl {{.*}} operator[] 'const element_type &(unsigned int) const' diff --git a/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl b/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl index f8659313ff19c..bebd6a37d3747 100644 --- a/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl +++ b/clang/test/AST/HLSL/StructuredBuffers-AST.hlsl @@ -105,11 +105,12 @@ RESOURCE Buffer; // Constructor from binding -// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, unsigned int, int, unsigned int)' inline +// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, unsigned int, int, unsigned int, const char *)' inline // CHECK-NEXT: ParmVarDecl {{.*}} registerNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' +// CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' // CHECK-NEXT: CompoundStmt {{.*}} // CHECK-NEXT: BinaryOperator {{.*}} '=' // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle @@ -123,15 +124,17 @@ RESOURCE Buffer; // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'spaceNo' 'unsigned int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' +// CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' // CHECK-NEXT: AlwaysInlineAttr // Constructor from implicit binding -// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, int, unsigned int, unsigned int)' inline +// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, int, unsigned int, unsigned int, const char *)' inline // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} orderId 'unsigned int' +// CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' // CHECK-NEXT: CompoundStmt {{.*}} // CHECK-NEXT: BinaryOperator {{.*}} '=' // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle @@ -145,6 +148,7 @@ RESOURCE Buffer; // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'orderId' 'unsigned int' +// CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' // CHECK-NEXT: AlwaysInlineAttr // Subscript operators diff --git a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl index dad1ef17a1f86..ccaca6b12ff64 100644 --- a/clang/test/AST/HLSL/TypedBuffers-AST.hlsl +++ b/clang/test/AST/HLSL/TypedBuffers-AST.hlsl @@ -72,11 +72,12 @@ RESOURCE Buffer; // Constructor from binding -// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, unsigned int, int, unsigned int)' inline +// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, unsigned int, int, unsigned int, const char *)' inline // CHECK-NEXT: ParmVarDecl {{.*}} registerNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' +// CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' // CHECK-NEXT: CompoundStmt {{.*}} // CHECK-NEXT: BinaryOperator {{.*}} '=' // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle @@ -90,15 +91,17 @@ RESOURCE Buffer; // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'spaceNo' 'unsigned int' // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' +// CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' // CHECK-NEXT: AlwaysInlineAttr // Constructor from implicit binding -// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, int, unsigned int, unsigned int)' inline +// CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]] 'void (unsigned int, int, unsigned int, unsigned int, const char *)' inline // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' // CHECK-NEXT: ParmVarDecl {{.*}} orderId 'unsigned int' +// CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' // CHECK-NEXT: CompoundStmt {{.*}} // CHECK-NEXT: BinaryOperator {{.*}} '=' // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle @@ -112,6 +115,7 @@ RESOURCE Buffer; // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'orderId' 'unsigned int' +// CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' // CHECK-NEXT: AlwaysInlineAttr // Subsctript operators diff --git a/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl b/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl index 1d451acfc6214..2f904f6bb3146 100644 --- a/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl +++ b/clang/test/CodeGenHLSL/GlobalConstructorLib.hlsl @@ -33,7 +33,7 @@ void SecondEntry() {} // Verify the constructor is alwaysinline // NOINLINE: ; Function Attrs: {{.*}}alwaysinline -// NOINLINE-NEXT: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2Ejijj({{.*}} [[CtorAttr:\#[0-9]+]] +// NOINLINE-NEXT: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2EjijjPKc({{.*}} [[CtorAttr:\#[0-9]+]] // NOINLINE: ; Function Attrs: {{.*}}alwaysinline // NOINLINE-NEXT: define internal void @_GLOBAL__sub_I_GlobalConstructorLib.hlsl() [[InitAttr:\#[0-9]+]] diff --git a/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl b/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl index 5f844fcfe4121..2601a2ee4ff35 100644 --- a/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl +++ b/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl @@ -24,30 +24,33 @@ export void foo() { // CHECK: %"class.hlsl::RasterizerOrderedByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 1) } // CHECK: @_ZL4Buf1 = internal global %"class.hlsl::ByteAddressBuffer" poison, align 4 +// CHECK: @[[Buf1Str:.*]] = private unnamed_addr constant [5 x i8] c"Buf1\00", align 1 // CHECK: @_ZL4Buf2 = internal global %"class.hlsl::RWByteAddressBuffer" poison, align 4 +// CHECK: @[[Buf2Str:.*]] = private unnamed_addr constant [5 x i8] c"Buf2\00", align 1 // Buf1 initialization part 1 - global init function that calls ByteAddressBuffer C1 constructor with explicit binding // CHECK: define internal void @__cxx_global_var_init() // CHECK-NEXT: entry: -// CHECK-NEXT: call void @_ZN4hlsl17ByteAddressBufferC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf1, -// CHECK-SAME: i32 noundef 1, i32 noundef 2, i32 noundef 1, i32 noundef 0) +// CHECK-NEXT: call void @_ZN4hlsl17ByteAddressBufferC1EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf1, +// CHECK-SAME: i32 noundef 1, i32 noundef 2, i32 noundef 1, i32 noundef 0, ptr noundef @[[Buf1Str]]) // Buf1 initialization part 2 - body of ByteAddressBuffer C1 constructor with explicit binding that calls the C2 constructor -// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index) -// CHECK: call void @_ZN4hlsl17ByteAddressBufferC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) -// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}) +// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC1EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) +// CHECK: call void @_ZN4hlsl17ByteAddressBufferC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) +// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, ptr noundef %{{.*}}) // Buf2 initialization part 1 - global init function that calls RWByteAddressBuffer C1 constructor with implicit binding -// CHECK: define internal void @__cxx_global_var_init.1() #0 { +// CHECK: define internal void @__cxx_global_var_init.1() // CHECK-NEXT: entry: -// CHECK-NEXT: call void @_ZN4hlsl19RWByteAddressBufferC1Ejijj(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf2, -// CHECK-SAME: i32 noundef 0, i32 noundef 1, i32 noundef 0, i32 noundef 0) +// CHECK-NEXT: call void @_ZN4hlsl19RWByteAddressBufferC1EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf2, +// CHECK-SAME: i32 noundef 0, i32 noundef 1, i32 noundef 0, i32 noundef 0, ptr noundef @[[Buf2Str]]) // Buf2 initialization part 2 - body of RWByteAddressBuffer C1 constructor with implicit binding that calls the C2 constructor -// CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC1Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId) -// CHECK: call void @_ZN4hlsl19RWByteAddressBufferC2Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %this1, i32 noundef %0, i32 noundef %1, i32 noundef %2, i32 noundef %3) #4 +// CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC1EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) +// CHECK: call void @_ZN4hlsl19RWByteAddressBufferC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this1, +// CHECK-SAME: i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, ptr noundef %{{.*}}) // Buf3 initialization part 1 - local variable declared in function foo() is initialized by // RasterizerOrderedByteAddressBuffer C1 default constructor @@ -64,8 +67,8 @@ export void foo() { // Buf1 initialization part 3 - ByteAddressBuffer C2 constructor with explicit binding that initializes // handle with @llvm.dx.resource.handlefrombinding -// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index) +// CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) // CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( // CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0 @@ -73,9 +76,10 @@ export void foo() { // Buf2 initialization part 3 - body of RWByteAddressBuffer C2 constructor with implicit binding that initializes // handle with @llvm.dx.resource.handlefromimplicitbinding -// CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC2Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId) unnamed_addr #1 align 2 { -// CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i8_1_0t(i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) +// CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i8_1_0t +// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %this1, i32 0, i32 0 // CHECK-NEXT: store target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], ptr %__handle, align 4 diff --git a/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl b/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl index ad8ebdf7d8c85..c2796fa177705 100644 --- a/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl +++ b/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl @@ -24,30 +24,33 @@ export void foo() { // CHECK: %"class.hlsl::RWBuffer.1" = type { target("dx.TypedBuffer", i32, 1, 0, 1) } // CHECK: @_ZL4Buf1 = internal global %"class.hlsl::RWBuffer" poison, align 4 +// CHECK: @[[Buf1Str:.*]] = private unnamed_addr constant [5 x i8] c"Buf1\00", align 1 // CHECK: @_ZL4Buf2 = internal global %"class.hlsl::RWBuffer.0" poison, align 4 +// CHECK: @[[Buf2Str:.*]] = private unnamed_addr constant [5 x i8] c"Buf2\00", align 1 // Buf1 initialization part 1 - global init function that calls RWBuffer C1 constructor with explicit binding // CHECK: define internal void @__cxx_global_var_init() // CHECK-NEXT: entry: -// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf1, -// CHECK-SAME: i32 noundef 5, i32 noundef 3, i32 noundef 1, i32 noundef 0) +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf1, +// CHECK-SAME: i32 noundef 5, i32 noundef 3, i32 noundef 1, i32 noundef 0, ptr noundef @[[Buf1Str]]) // Buf1 initialization part 2 - body of RWBuffer C1 constructor with explicit binding that calls the C2 constructor -// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index) -// CHECK: call void @_ZN4hlsl8RWBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) -// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}) +// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC1EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) +// CHECK: call void @_ZN4hlsl8RWBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) +// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, ptr noundef %{{.*}}) // Buf2 initialization part 1 - global init function that calls RWBuffer C1 constructor with implicit binding // CHECK: define internal void @__cxx_global_var_init.1() // CHECK-NEXT: entry: -// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIdEC1Ejijj(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf2, -// CHECK-SAME: i32 noundef 0, i32 noundef 1, i32 noundef 0, i32 noundef 0) +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIdEC1EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf2, +// CHECK-SAME: i32 noundef 0, i32 noundef 1, i32 noundef 0, i32 noundef 0, ptr noundef @[[Buf2Str]]) // Buf2 initialization part 2 - body of RWBuffer C1 constructor with implicit binding that calls the C2 constructor -// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIdEC1Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId) -// CHECK: call void @_ZN4hlsl8RWBufferIdEC2Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}) #4 +// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIdEC1EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) +// CHECK: call void @_ZN4hlsl8RWBufferIdEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) +// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, ptr noundef %{{.*}}) // Buf3 initialization part 1 - local variable declared in function foo() is initialized by RWBuffer C1 default constructor // CHECK: define void @_Z3foov() @@ -61,8 +64,8 @@ export void foo() { // Buf1 initialization part 3 - body of RWBuffer C2 constructor with explicit binding that initializes // handle with @llvm.dx.resource.handlefrombinding -// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index) +// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) // CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t( // CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %{{.*}}, i32 0, i32 0 @@ -70,9 +73,10 @@ export void foo() { // Buf2 initialization part 3 - body of RWBuffer C2 constructor with implicit binding that initializes // handle with @llvm.dx.resource.handlefromimplicitbinding -// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIdEC2Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId) unnamed_addr #1 align 2 { -// CHECK: %[[HANDLE:.*]] = call target("dx.TypedBuffer", double, 1, 0, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.TypedBuffer_f64_1_0_0t(i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIdEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) +// CHECK: %[[HANDLE:.*]] = call target("dx.TypedBuffer", double, 1, 0, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.TypedBuffer_f64_1_0_0t +// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer.0", ptr %{{.*}}, i32 0, i32 0 // CHECK-NEXT: store target("dx.TypedBuffer", double, 1, 0, 0) %[[HANDLE]], ptr %__handle, align 4 diff --git a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl index 34ce676a02f83..a85a0b0880b6b 100644 --- a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl +++ b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl @@ -23,34 +23,36 @@ export void foo() { // CHECK: %"class.hlsl::AppendStructuredBuffer" = type { target("dx.RawBuffer", float, 1, 0) } // CHECK: @_ZL4Buf1 = internal global %"class.hlsl::StructuredBuffer" poison, align 4 +// CHECK: @[[Buf1Str:.*]] = private unnamed_addr constant [5 x i8] c"Buf1\00", align 1 // CHECK: @_ZL4Buf2 = internal global %"class.hlsl::RWStructuredBuffer" poison, align 4 +// CHECK: @[[Buf2Str:.*]] = private unnamed_addr constant [5 x i8] c"Buf2\00", align 1 // Buf1 initialization part 1 - global init function that calls StructuredBuffer C1 constructor // with explicit binding // CHECK: define internal void @__cxx_global_var_init() // CHECK-NEXT: entry: -// CHECK-NEXT: call void @_ZN4hlsl16StructuredBufferIfEC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf1, -// CHECK-SAME: i32 noundef 10, i32 noundef 2, i32 noundef 1, i32 noundef 0) +// CHECK-NEXT: call void @_ZN4hlsl16StructuredBufferIfEC1EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf1, +// CHECK-SAME: i32 noundef 10, i32 noundef 2, i32 noundef 1, i32 noundef 0, ptr noundef @[[Buf1Str]]) // Buf1 initialization part 2 - body of StructuredBuffer C1 constructor with explicit binding // that calls the C2 constructor -// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC1Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index) -// CHECK: call void @_ZN4hlsl16StructuredBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) -// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}) +// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC1EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) +// CHECK: call void @_ZN4hlsl16StructuredBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) +// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, ptr noundef %{{.*}}) // Buf2 initialization part 1 - global init function that calls RWStructuredBuffer C1 constructor with // implicit binding // CHECK: define internal void @__cxx_global_var_init.1() // CHECK-NEXT: entry: -// CHECK-NEXT: call void @_ZN4hlsl18RWStructuredBufferIfEC1Ejijj(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf2, -// CHECK-SAME: i32 noundef 0, i32 noundef 1, i32 noundef 0, i32 noundef 0) +// CHECK-NEXT: call void @_ZN4hlsl18RWStructuredBufferIfEC1EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) @_ZL4Buf2, +// CHECK-SAME: i32 noundef 0, i32 noundef 1, i32 noundef 0, i32 noundef 0, ptr noundef @[[Buf2Str]]) // Buf2 initialization part 2 - body of RWStructuredBuffer C1 constructor with implicit binding that calls the C2 constructor -// CHECK: define linkonce_odr void @_ZN4hlsl18RWStructuredBufferIfEC1Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId) -// CHECK: call void @_ZN4hlsl18RWStructuredBufferIfEC2Ejijj(ptr noundef nonnull align 4 dereferenceable(4) -// CHECK-SAME; %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}) #4 +// CHECK: define linkonce_odr void @_ZN4hlsl18RWStructuredBufferIfEC1EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) +// CHECK: call void @_ZN4hlsl18RWStructuredBufferIfEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) +// CHECK-SAME: %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}, ptr noundef %{{.*}}) // Buf3 initialization part 1 - local variable declared in function foo() is initialized by // AppendStructuredBuffer C1 default constructor @@ -66,8 +68,8 @@ export void foo() { // Buf1 initialization part 3 - body of AppendStructuredBuffer C2 constructor with explicit binding // that initializes handle with @llvm.dx.resource.handlefrombinding -// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC2Ejjij(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index) +// CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) // CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t( // CHECK-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %{{.*}}, i32 0, i32 0 @@ -75,9 +77,10 @@ export void foo() { // Buf2 initialization part 3 - body of RWStructuredBuffer C2 constructor with implicit binding that initializes // handle with @llvm.dx.resource.handlefromimplicitbinding -// CHECK: define linkonce_odr void @_ZN4hlsl18RWStructuredBufferIfEC2Ejijj(ptr noundef nonnull align 4 dereferenceable(4) %this, -// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId) unnamed_addr #1 align 2 { -// CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f32_1_0t(i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK: define linkonce_odr void @_ZN4hlsl18RWStructuredBufferIfEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, +// CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) +// CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f32_1_0t +// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 // CHECK-NEXT: store target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], ptr %__handle, align 4 From a0b6179acfcf0e75217721593c6701740286c18c Mon Sep 17 00:00:00 2001 From: Helena Kotas Date: Wed, 14 May 2025 19:14:04 -0700 Subject: [PATCH 2/7] [DirectX] Add resource name argument to llvm.dx.handlefrombinding intrinsic (DirectX only) Also adding the resource name to llvm.dx.handlefromimplicitbinding --- clang/lib/CodeGen/CGHLSLBuiltins.cpp | 35 +++++++++++++---- clang/lib/CodeGen/CGHLSLRuntime.cpp | 38 +++++++++++++------ clang/lib/CodeGen/CGHLSLRuntime.h | 3 ++ .../ByteAddressBuffers-constructors.hlsl | 4 +- .../builtins/RWBuffer-constructor.hlsl | 4 +- .../StructuredBuffers-constructors.hlsl | 4 +- clang/test/CodeGenHLSL/cbuffer.hlsl | 27 ++++++++----- .../CodeGenHLSL/cbuffer_with_packoffset.hlsl | 3 +- clang/test/CodeGenHLSL/resource-bindings.hlsl | 8 ++-- llvm/include/llvm/IR/IntrinsicsDirectX.td | 4 +- llvm/lib/Target/DirectX/DXILOpLowering.cpp | 28 ++++++++------ .../DirectX/DXILResourceImplicitBinding.cpp | 3 +- llvm/test/CodeGen/DirectX/BufferLoad-sm61.ll | 6 +-- llvm/test/CodeGen/DirectX/BufferLoad.ll | 16 ++++---- .../CodeGen/DirectX/BufferStore-errors.ll | 2 +- llvm/test/CodeGen/DirectX/BufferStore-sm61.ll | 12 +++--- llvm/test/CodeGen/DirectX/BufferStore.ll | 14 +++---- .../DirectX/CBufferAccess/array-typedgep.ll | 2 +- .../CodeGen/DirectX/CBufferAccess/arrays.ll | 2 +- .../CodeGen/DirectX/CBufferAccess/scalars.ll | 2 +- .../CodeGen/DirectX/CBufferAccess/vectors.ll | 2 +- .../DirectX/CBufferLoadLegacy-errors.ll | 4 +- .../test/CodeGen/DirectX/CBufferLoadLegacy.ll | 6 +-- .../ContainerData/PSVResources-order.ll | 6 +-- .../DirectX/ContainerData/PSVResources.ll | 16 ++++---- llvm/test/CodeGen/DirectX/CreateHandle.ll | 12 +++--- .../DirectX/CreateHandleFromBinding.ll | 14 +++---- .../DirectX/ForwardHandleAccesses/alloca.ll | 2 +- .../ForwardHandleAccesses/ambiguous.ll | 4 +- .../ForwardHandleAccesses/buffer-O0.ll | 8 ++-- .../ForwardHandleAccesses/cbuffer-access.ll | 4 +- .../ForwardHandleAccesses/undominated.ll | 2 +- .../CodeGen/DirectX/ImplicitBinding/arrays.ll | 20 +++++----- .../ImplicitBinding/multiple-spaces.ll | 24 ++++++------ .../CodeGen/DirectX/ImplicitBinding/simple.ll | 12 +++--- .../ImplicitBinding/unbounded-arrays-error.ll | 8 ++-- .../ImplicitBinding/unbounded-arrays.ll | 16 ++++---- .../CodeGen/DirectX/Metadata/cbuffer-only.ll | 2 +- .../DirectX/Metadata/cbuffer_metadata.ll | 6 +-- .../DirectX/Metadata/resource-symbols.ll | 10 ++--- .../CodeGen/DirectX/Metadata/srv_metadata.ll | 18 ++++----- .../CodeGen/DirectX/Metadata/uav_metadata.ll | 24 ++++++------ .../CodeGen/DirectX/RawBufferLoad-error64.ll | 2 +- llvm/test/CodeGen/DirectX/RawBufferLoad.ll | 14 +++---- .../CodeGen/DirectX/RawBufferStore-error64.ll | 2 +- llvm/test/CodeGen/DirectX/RawBufferStore.ll | 14 +++---- .../DirectX/ResourceAccess/load_rawbuffer.ll | 14 +++---- .../ResourceAccess/load_typedbuffer.ll | 6 +-- .../DirectX/ResourceAccess/store_rawbuffer.ll | 14 +++---- .../ResourceAccess/store_typedbuffer.ll | 6 +-- .../DirectX/ResourceGlobalElimination.ll | 4 +- .../max-64-uavs-array-valver1.5.ll | 4 +- .../max-64-uavs-array-valver1.6.ll | 4 +- .../DirectX/ShaderFlags/max-64-uavs.ll | 18 ++++----- .../ShaderFlags/raw-and-structured-buffers.ll | 6 +-- .../DirectX/ShaderFlags/res-may-alias-0.ll | 4 +- .../DirectX/ShaderFlags/res-may-alias-1.ll | 4 +- .../ShaderFlags/res-may-not-alias-sm6.6.ll | 4 +- .../ShaderFlags/res-may-not-alias-sm6.7.ll | 4 +- .../res-may-not-alias-valver1.8.ll | 4 +- .../typed-uav-load-additional-formats.ll | 6 +-- .../uavs-at-every-stage-lib-valver1.7.ll | 2 +- .../uavs-at-every-stage-lib-valver1.8.ll | 2 +- .../ShaderFlags/uavs-at-every-stage-vs.ll | 2 +- .../CodeGen/DirectX/bufferUpdateCounter.ll | 6 +-- .../CodeGen/DirectX/resource_counter_error.ll | 2 +- 66 files changed, 319 insertions(+), 266 deletions(-) diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp index d4a0714da07b3..0e0bafb0d3fd6 100644 --- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp +++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp @@ -299,9 +299,20 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, // (llvm/llvm-project#135452) Value *NonUniform = llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false); - return Builder.CreateIntrinsic( - HandleTy, CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic(), - ArrayRef{SpaceOp, RegisterOp, RangeOp, IndexOp, NonUniform}); + + Intrinsic::ID IID = + CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic(); + // SPIR-V intrinsic does not have include the resource name + if (IID == Intrinsic::spv_resource_handlefrombinding) + return Builder.CreateIntrinsic( + HandleTy, IID, + ArrayRef{SpaceOp, RegisterOp, RangeOp, IndexOp, NonUniform}); + + Value *NameOp = EmitScalarExpr(E->getArg(5)); + return Builder.CreateIntrinsic(HandleTy, IID, + ArrayRef{SpaceOp, RegisterOp, + RangeOp, IndexOp, + NonUniform, NameOp}); } case Builtin::BI__builtin_hlsl_resource_handlefromimplicitbinding: { llvm::Type *HandleTy = CGM.getTypes().ConvertType(E->getType()); @@ -313,10 +324,20 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, // (llvm/llvm-project#135452) Value *NonUniform = llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false); - return Builder.CreateIntrinsic( - HandleTy, - CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic(), - ArrayRef{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform}); + + Intrinsic::ID IID = + CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic(); + // SPIR-V intrinsic does not include the resource name + if (IID == Intrinsic::spv_resource_handlefromimplicitbinding) + return Builder.CreateIntrinsic( + HandleTy, IID, + ArrayRef{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform}); + + Value *NameOp = EmitScalarExpr(E->getArg(5)); + return Builder.CreateIntrinsic(HandleTy, IID, + ArrayRef{OrderID, SpaceOp, RangeOp, + IndexOp, NonUniform, + NameOp}); } case Builtin::BI__builtin_hlsl_all: { Value *Op0 = EmitScalarExpr(E->getArg(0)); diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index a708b3aea129d..b9577a0dc48a1 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -42,10 +42,6 @@ using namespace llvm; using llvm::hlsl::CBufferRowSizeInBytes; -static void initializeBufferFromBinding(CodeGenModule &CGM, - llvm::GlobalVariable *GV, - HLSLResourceBindingAttr *RBA); - namespace { void addDxilValVersion(StringRef ValVersionStr, llvm::Module &M) { @@ -275,7 +271,7 @@ void CGHLSLRuntime::addBuffer(const HLSLBufferDecl *BufDecl) { HLSLResourceBindingAttr *RBA = BufDecl->getAttr(); assert(RBA && "cbuffer/tbuffer should always have resource binding attribute"); - initializeBufferFromBinding(CGM, BufGV, RBA); + initializeBufferFromBinding(BufDecl, BufGV, RBA); } llvm::TargetExtType * @@ -557,29 +553,47 @@ static void initializeBuffer(CodeGenModule &CGM, llvm::GlobalVariable *GV, CGM.AddCXXGlobalInit(InitResFunc); } -static void initializeBufferFromBinding(CodeGenModule &CGM, - llvm::GlobalVariable *GV, - HLSLResourceBindingAttr *RBA) { +void CGHLSLRuntime::initializeBufferFromBinding(const HLSLBufferDecl *BufDecl, + llvm::GlobalVariable *GV, + HLSLResourceBindingAttr *RBA) { llvm::Type *Int1Ty = llvm::Type::getInt1Ty(CGM.getLLVMContext()); auto *NonUniform = llvm::ConstantInt::get(Int1Ty, false); auto *Index = llvm::ConstantInt::get(CGM.IntTy, 0); auto *RangeSize = llvm::ConstantInt::get(CGM.IntTy, 1); auto *Space = llvm::ConstantInt::get(CGM.IntTy, RBA ? RBA->getSpaceNumber() : 0); + Value *Name = nullptr; + + // DXIL intrinsic includes resource name + if (getArch() == Triple::dxil) { + std::string Str = std::string(BufDecl->getName()); + std::string GlobalName = Str + ".str"; + Name = CGM.GetAddrOfConstantCString(Str, GlobalName.c_str()).getPointer(); + } + // buffer with explicit binding if (RBA->hasRegisterSlot()) { auto *RegSlot = llvm::ConstantInt::get(CGM.IntTy, RBA->getSlotNumber()); Intrinsic::ID Intr = CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic(); - initializeBuffer(CGM, GV, Intr, - {Space, RegSlot, RangeSize, Index, NonUniform}); + if (Name) + initializeBuffer(CGM, GV, Intr, + {Space, RegSlot, RangeSize, Index, NonUniform, Name}); + else + initializeBuffer(CGM, GV, Intr, + {Space, RegSlot, RangeSize, Index, NonUniform}); } else { + // buffer with implicit binding auto *OrderID = llvm::ConstantInt::get(CGM.IntTy, RBA->getImplicitBindingOrderID()); Intrinsic::ID Intr = CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic(); - initializeBuffer(CGM, GV, Intr, - {OrderID, Space, RangeSize, Index, NonUniform}); + if (Name) + initializeBuffer(CGM, GV, Intr, + {OrderID, Space, RangeSize, Index, NonUniform, Name}); + else + initializeBuffer(CGM, GV, Intr, + {OrderID, Space, RangeSize, Index, NonUniform}); } } diff --git a/clang/lib/CodeGen/CGHLSLRuntime.h b/clang/lib/CodeGen/CGHLSLRuntime.h index e40864d8ed854..f86dca8c4fd26 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.h +++ b/clang/lib/CodeGen/CGHLSLRuntime.h @@ -164,6 +164,9 @@ class CGHLSLRuntime { private: void emitBufferGlobalsAndMetadata(const HLSLBufferDecl *BufDecl, llvm::GlobalVariable *BufGV); + void initializeBufferFromBinding(const HLSLBufferDecl *BufDecl, + llvm::GlobalVariable *GV, + HLSLResourceBindingAttr *RBA); llvm::Triple::ArchType getArch(); llvm::DenseMap LayoutTypes; diff --git a/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl b/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl index 2601a2ee4ff35..c29166e3fd749 100644 --- a/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl +++ b/clang/test/CodeGenHLSL/builtins/ByteAddressBuffers-constructors.hlsl @@ -70,7 +70,7 @@ export void foo() { // CHECK: define linkonce_odr void @_ZN4hlsl17ByteAddressBufferC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, // CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) // CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( -// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}}) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::ByteAddressBuffer", ptr %{{.*}}, i32 0, i32 0 // CHECK-DXIL-NEXT: store target("dx.RawBuffer", i8, 0, 0) %[[HANDLE]], ptr %__handle, align 4 @@ -79,7 +79,7 @@ export void foo() { // CHECK: define linkonce_odr void @_ZN4hlsl19RWByteAddressBufferC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, // CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) // CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", i8, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_i8_1_0t -// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}}) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWByteAddressBuffer", ptr %this1, i32 0, i32 0 // CHECK-NEXT: store target("dx.RawBuffer", i8, 1, 0) %[[HANDLE]], ptr %__handle, align 4 diff --git a/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl b/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl index c2796fa177705..16e994457259a 100644 --- a/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl +++ b/clang/test/CodeGenHLSL/builtins/RWBuffer-constructor.hlsl @@ -67,7 +67,7 @@ export void foo() { // CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, // CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) // CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t( -// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK-DXIL-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}}) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %{{.*}}, i32 0, i32 0 // CHECK-DXIL-NEXT: store target("dx.TypedBuffer", float, 1, 0, 0) %[[HANDLE]], ptr %__handle, align 4 @@ -76,7 +76,7 @@ export void foo() { // CHECK: define linkonce_odr void @_ZN4hlsl8RWBufferIdEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, // CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) // CHECK: %[[HANDLE:.*]] = call target("dx.TypedBuffer", double, 1, 0, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.TypedBuffer_f64_1_0_0t -// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CEHCK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}}) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWBuffer.0", ptr %{{.*}}, i32 0, i32 0 // CHECK-NEXT: store target("dx.TypedBuffer", double, 1, 0, 0) %[[HANDLE]], ptr %__handle, align 4 diff --git a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl index a85a0b0880b6b..9dd5a9b80da88 100644 --- a/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl +++ b/clang/test/CodeGenHLSL/builtins/StructuredBuffers-constructors.hlsl @@ -71,7 +71,7 @@ export void foo() { // CHECK: define linkonce_odr void @_ZN4hlsl16StructuredBufferIfEC2EjjijPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, // CHECK-SAME: i32 noundef %registerNo, i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, ptr noundef %name) // CHECK-DXIL: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t( -// CHECK-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK-SAME: i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}}) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %{{.*}}, i32 0, i32 0 // CHECK-DXIL-NEXT: store target("dx.RawBuffer", float, 0, 0) %[[HANDLE]], ptr %__handle, align 4 @@ -80,7 +80,7 @@ export void foo() { // CHECK: define linkonce_odr void @_ZN4hlsl18RWStructuredBufferIfEC2EjijjPKc(ptr noundef nonnull align 4 dereferenceable(4) %this, // CHECK-SAME: i32 noundef %spaceNo, i32 noundef %range, i32 noundef %index, i32 noundef %orderId, ptr noundef %name) // CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefromimplicitbinding.tdx.RawBuffer_f32_1_0t -// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false) +// CHECK-SAME: (i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}, i1 false, ptr %{{.*}}) // CHECK-NEXT: %__handle = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %{{.*}}, i32 0, i32 0 // CHECK-NEXT: store target("dx.RawBuffer", float, 1, 0) %[[HANDLE]], ptr %__handle, align 4 diff --git a/clang/test/CodeGenHLSL/cbuffer.hlsl b/clang/test/CodeGenHLSL/cbuffer.hlsl index 3fb76d57341cf..e0919266dc3b7 100644 --- a/clang/test/CodeGenHLSL/cbuffer.hlsl +++ b/clang/test/CodeGenHLSL/cbuffer.hlsl @@ -54,6 +54,7 @@ cbuffer CBScalars : register(b1, space5) { // CHECK: @a6 = external addrspace(2) global i16, align 2 // CHECK: @a7 = external addrspace(2) global i32, align 4 // CHECK: @a8 = external addrspace(2) global i64, align 8 +// CHECK: @CBScalars.str = private unnamed_addr constant [10 x i8] c"CBScalars\00", align 1 cbuffer CBVectors { float3 b1; @@ -75,6 +76,7 @@ cbuffer CBVectors { // CHECK: @b5 = external addrspace(2) global <4 x i32>, align 16 // CHECK: @b6 = external addrspace(2) global <3 x i16>, align 8 // CHECK: @b7 = external addrspace(2) global <3 x i64>, align 32 +// CHECK: @CBVectors.str = private unnamed_addr constant [10 x i8] c"CBVectors\00", align 1 cbuffer CBArrays : register(b2) { float c1[3]; @@ -97,6 +99,7 @@ cbuffer CBArrays : register(b2) { // CHECK: @c6 = external addrspace(2) global [1 x i16], align 2 // CHECK: @c7 = external addrspace(2) global [2 x i64], align 8 // CHECK: @c8 = external addrspace(2) global [4 x i32], align 4 +// CHECK: @CBArrays.str = private unnamed_addr constant [9 x i8] c"CBArrays\00", align 1 typedef uint32_t4 uint32_t8[2]; typedef uint4 T1; @@ -111,6 +114,7 @@ cbuffer CBTypedefArray : register(space2) { // CHECK-SAME: 128, 0, 64)) // CHECK: @t1 = external addrspace(2) global [2 x [2 x <4 x i32>]], align 16 // CHECK: @t2 = external addrspace(2) global [2 x [2 x <4 x i32>]], align 16 +// CHECK: @CBTypedefArray.str = private unnamed_addr constant [15 x i8] c"CBTypedefArray\00", align 1 struct Empty {}; struct A { @@ -140,6 +144,7 @@ struct D { // CHECK: @d = external addrspace(2) global target("dx.Layout", %__cblayout_D, 94, 0), align 1 // CHECK: @e = external addrspace(2) global half, align 2 // CHECK: @f = external addrspace(2) global <3 x i16>, align 8 +// CHECK: @CBStructs.str = private unnamed_addr constant [10 x i8] c"CBStructs\00", align 1 cbuffer CBStructs { A a; @@ -177,6 +182,7 @@ cbuffer CBClasses { // CHECK: @l = external addrspace(2) global target("dx.Layout", %L, 8, 0, 4), align 1 // CHECK: @m = external addrspace(2) global target("dx.Layout", %M, 68, 0), align 1 // CHECK: @ka = external addrspace(2) global [10 x target("dx.Layout", %K, 4, 0)], align 1 +// CHECK: @CBClasses.str = private unnamed_addr constant [10 x i8] c"CBClasses\00", align 1 struct Test { float a, b; @@ -194,6 +200,7 @@ struct Test { // CHECK: @f7 = external addrspace(2) global float, align 4 // CHECK: @f8 = external addrspace(2) global <1 x double>, align 8 // CHECK: @f9 = external addrspace(2) global i16, align 2 +// CHECK: @CBMix.str = private unnamed_addr constant [6 x i8] c"CBMix\00", align 1 cbuffer CBMix { Test test[2]; @@ -269,61 +276,61 @@ cbuffer CB_C { // CHECK: define internal void @_init_buffer_CBScalars.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CBScalars.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CBScalars, 56, 0, 8, 16, 24, 32, 36, 40, 48)) -// CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBScalarss_56_0_8_16_24_32_36_40_48tt(i32 5, i32 1, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBScalarss_56_0_8_16_24_32_36_40_48tt(i32 5, i32 1, i32 1, i32 0, i1 false, ptr @CBScalars.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CBScalars, 56, 0, 8, 16, 24, 32, 36, 40, 48)) %CBScalars.cb_h, ptr @CBScalars.cb, align 4 // CHECK: define internal void @_init_buffer_CBVectors.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CBVectors.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CBVectors, 136, 0, 16, 40, 48, 80, 96, 112)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBVectorss_136_0_16_40_48_80_96_112tt(i32 0, i32 0, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBVectorss_136_0_16_40_48_80_96_112tt(i32 0, i32 0, i32 1, i32 0, i1 false, ptr @CBVectors.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CBVectors, 136, 0, 16, 40, 48, 80, 96, 112)) %CBVectors.cb_h, ptr @CBVectors.cb, align 4 // CHECK: define internal void @_init_buffer_CBArrays.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CBArrays.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CBArrays, 708, 0, 48, 112, 176, 224, 608, 624, 656)) -// CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBArrayss_708_0_48_112_176_224_608_624_656tt(i32 0, i32 2, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBArrayss_708_0_48_112_176_224_608_624_656tt(i32 0, i32 2, i32 1, i32 0, i1 false, ptr @CBArrays.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CBArrays, 708, 0, 48, 112, 176, 224, 608, 624, 656)) %CBArrays.cb_h, ptr @CBArrays.cb, align 4 // CHECK: define internal void @_init_buffer_CBTypedefArray.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CBTypedefArray.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CBTypedefArray, 128, 0, 64)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBTypedefArrays_128_0_64tt(i32 1, i32 2, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBTypedefArrays_128_0_64tt(i32 1, i32 2, i32 1, i32 0, i1 false, ptr @CBTypedefArray.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CBTypedefArray, 128, 0, 64)) %CBTypedefArray.cb_h, ptr @CBTypedefArray.cb, align 4 // CHECK: define internal void @_init_buffer_CBStructs.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CBStructs.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CBStructs, 246, 0, 16, 32, 64, 144, 238, 240)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBStructss_246_0_16_32_64_144_238_240tt(i32 2, i32 0, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBStructss_246_0_16_32_64_144_238_240tt(i32 2, i32 0, i32 1, i32 0, i1 false, ptr @CBStructs.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CBStructs, 246, 0, 16, 32, 64, 144, 238, 240)) %CBStructs.cb_h, ptr @CBStructs.cb, align 4 // CHECK: define internal void @_init_buffer_CBClasses.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CBClasses.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CBClasses, 260, 0, 16, 32, 112)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBClassess_260_0_16_32_112tt(i32 3, i32 0, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBClassess_260_0_16_32_112tt(i32 3, i32 0, i32 1, i32 0, i1 false, ptr @CBClasses.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CBClasses, 260, 0, 16, 32, 112)) %CBClasses.cb_h, ptr @CBClasses.cb, align 4 // CHECK: define internal void @_init_buffer_CBMix.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CBMix.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CBMix, 170, 0, 24, 32, 120, 128, 136, 144, 152, 160, 168)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBMixs_170_0_24_32_120_128_136_144_152_160_168tt(i32 4, i32 0, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBMixs_170_0_24_32_120_128_136_144_152_160_168tt(i32 4, i32 0, i32 1, i32 0, i1 false, ptr @CBMix.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CBMix, 170, 0, 24, 32, 120, 128, 136, 144, 152, 160, 168)) %CBMix.cb_h, ptr @CBMix.cb, align 4 // CHECK: define internal void @_init_buffer_CB_A.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CB_A.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB_A, 188, 0, 32, 76, 80, 120, 128, 144, 160, 182)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CB_As_188_0_32_76_80_120_128_144_160_182tt(i32 5, i32 0, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CB_As_188_0_32_76_80_120_128_144_160_182tt(i32 5, i32 0, i32 1, i32 0, i1 false, ptr @CB_A.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB_A, 188, 0, 32, 76, 80, 120, 128, 144, 160, 182)) %CB_A.cb_h, ptr @CB_A.cb, align 4 // CHECK: define internal void @_init_buffer_CB_B.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CB_B.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB_B, 94, 0, 88)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CB_Bs_94_0_88tt(i32 6, i32 0, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CB_Bs_94_0_88tt(i32 6, i32 0, i32 1, i32 0, i1 false, ptr @CB_B.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB_B, 94, 0, 88)) %CB_B.cb_h, ptr @CB_B.cb, align 4 // CHECK: define internal void @_init_buffer_CB_C.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CB_C.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB_C, 400, 0, 16, 112, 128, 392)) -// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CB_Cs_400_0_16_112_128_392tt(i32 7, i32 0, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefromimplicitbinding.tdx.CBuffer_tdx.Layout_s___cblayout_CB_Cs_400_0_16_112_128_392tt(i32 7, i32 0, i32 1, i32 0, i1 false, ptr @CB_C.str) // CHECK-NEXT: store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB_C, 400, 0, 16, 112, 128, 392)) %CB_C.cb_h, ptr @CB_C.cb, align 4 RWBuffer Buf; diff --git a/clang/test/CodeGenHLSL/cbuffer_with_packoffset.hlsl b/clang/test/CodeGenHLSL/cbuffer_with_packoffset.hlsl index 11ca7b6724ae4..0d092f0c36c29 100644 --- a/clang/test/CodeGenHLSL/cbuffer_with_packoffset.hlsl +++ b/clang/test/CodeGenHLSL/cbuffer_with_packoffset.hlsl @@ -9,6 +9,7 @@ // CHECK: @a = external addrspace(2) global float, align 4 // CHECK: @b = external addrspace(2) global double, align 8 // CHECK: @c = external addrspace(2) global <2 x i32>, align 8 +// CHECK: @CB.str = private unnamed_addr constant [3 x i8] c"CB\00", align 1 cbuffer CB : register(b1, space3) { float a : packoffset(c1.x); @@ -30,7 +31,7 @@ cbuffer CB : register(b0) { // CHECK: define internal void @_init_buffer_CB.cb() // CHECK-NEXT: entry: // CHECK-NEXT: %CB.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 176, 16, 168, 88)) -// CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBs_176_16_168_88tt(i32 3, i32 1, i32 1, i32 0, i1 false) +// CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBs_176_16_168_88tt(i32 3, i32 1, i32 1, i32 0, i1 false, ptr @CB.str) float foo() { // CHECK: load float, ptr addrspace(2) @a, align 4 diff --git a/clang/test/CodeGenHLSL/resource-bindings.hlsl b/clang/test/CodeGenHLSL/resource-bindings.hlsl index d8e105ed7e98c..0a301346e55be 100644 --- a/clang/test/CodeGenHLSL/resource-bindings.hlsl +++ b/clang/test/CodeGenHLSL/resource-bindings.hlsl @@ -12,28 +12,28 @@ // CHECK: %[[HANDLE:.*]] = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) // CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t( -// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false) +// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false, ptr %{{.*}}) // CHECK: %[[HANDLE_PTR:.*]] = getelementptr inbounds nuw %"class.hlsl::RWBuffer", ptr %this{{[0-9]*}}, i32 0, i32 0 // CHECK: store target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %[[HANDLE]], ptr %[[HANDLE_PTR]], align 4 RWBuffer U0S0 : register(u0); // CHECK: %[[HANDLE:.*]] = call target("dx.TypedBuffer", float, 1, 0, 0) // CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t( -// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false) +// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false, ptr %{{.*}}) // CHECK: %[[HANDLE_PTR:.*]] = getelementptr inbounds nuw %"class.hlsl::RWBuffer.0", ptr %this{{[0-9]*}}, i32 0, i32 0 // CHECK: store target("dx.TypedBuffer", float, 1, 0, 0) %[[HANDLE]], ptr %[[HANDLE_PTR]], align 4 RWBuffer U5S3 : register(u5, space3); // CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", i32, 0, 0) // CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_0_0t( -// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false) +// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false, ptr %{{.*}}) // CHECK: %[[HANDLE_PTR:.*]] = getelementptr inbounds nuw %"class.hlsl::StructuredBuffer", ptr %this{{[0-9]*}}, i32 0, i32 0 // CHECK: store target("dx.RawBuffer", i32, 0, 0) %[[HANDLE]], ptr %[[HANDLE_PTR]], align 4 StructuredBuffer T2S2 : register(t2, space2); // CHECK: %[[HANDLE:.*]] = call target("dx.RawBuffer", %struct.S, 1, 0) // CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_s_struct.Ss_1_0t( -// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false) +// CHECK-SAME: i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i32 %{{[0-9]+}}, i1 false, ptr %{{.*}}) // CHECK: %[[HANDLE_PTR:.*]] = getelementptr inbounds nuw %"class.hlsl::RWStructuredBuffer", ptr %this{{[0-9]*}}, i32 0, i32 0 // CHECK: store target("dx.RawBuffer", %struct.S, 1, 0) %[[HANDLE]], ptr %[[HANDLE_PTR]], align 4 struct S { diff --git a/llvm/include/llvm/IR/IntrinsicsDirectX.td b/llvm/include/llvm/IR/IntrinsicsDirectX.td index 15209c5d229af..0f73084f88c5e 100644 --- a/llvm/include/llvm/IR/IntrinsicsDirectX.td +++ b/llvm/include/llvm/IR/IntrinsicsDirectX.td @@ -24,7 +24,7 @@ def int_dx_flattened_thread_id_in_group : Intrinsic<[llvm_i32_ty], [], [IntrNoMe def int_dx_resource_handlefrombinding : DefaultAttrsIntrinsic< [llvm_any_ty], - [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty], + [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty, llvm_ptr_ty], [IntrNoMem]>; // Create resource handle with implicit binding in given register space. @@ -33,7 +33,7 @@ def int_dx_resource_handlefrombinding def int_dx_resource_handlefromimplicitbinding : DefaultAttrsIntrinsic< [llvm_any_ty], - [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty], + [llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty, llvm_ptr_ty], [IntrNoMem]>; def int_dx_resource_getpointer diff --git a/llvm/lib/Target/DirectX/DXILOpLowering.cpp b/llvm/lib/Target/DirectX/DXILOpLowering.cpp index cfdd5247149c2..204cbef040eba 100644 --- a/llvm/lib/Target/DirectX/DXILOpLowering.cpp +++ b/llvm/lib/Target/DirectX/DXILOpLowering.cpp @@ -211,6 +211,21 @@ class OpLowerer { } } + void replaceHandleFromBindingCall(CallInst *CI, Value *Replacement) { + assert(CI->getCalledFunction()->getIntrinsicID() == + Intrinsic::dx_resource_handlefrombinding); + + removeResourceGlobals(CI); + + auto *NameGlobal = dyn_cast(CI->getArgOperand(5)); + + CI->replaceAllUsesWith(Replacement); + CI->eraseFromParent(); + + if (NameGlobal && NameGlobal->use_empty()) + NameGlobal->removeFromParent(); + } + [[nodiscard]] bool lowerToCreateHandle(Function &F) { IRBuilder<> &IRB = OpBuilder.getIRB(); Type *Int8Ty = IRB.getInt8Ty(); @@ -241,11 +256,7 @@ class OpLowerer { return E; Value *Cast = createTmpHandleCast(*OpCall, CI->getType()); - - removeResourceGlobals(CI); - - CI->replaceAllUsesWith(Cast); - CI->eraseFromParent(); + replaceHandleFromBindingCall(CI, Cast); return Error::success(); }); } @@ -296,12 +307,7 @@ class OpLowerer { return E; Value *Cast = createTmpHandleCast(*OpAnnotate, CI->getType()); - - removeResourceGlobals(CI); - - CI->replaceAllUsesWith(Cast); - CI->eraseFromParent(); - + replaceHandleFromBindingCall(CI, Cast); return Error::success(); }); } diff --git a/llvm/lib/Target/DirectX/DXILResourceImplicitBinding.cpp b/llvm/lib/Target/DirectX/DXILResourceImplicitBinding.cpp index 92454bea51e31..72d410b55c7e5 100644 --- a/llvm/lib/Target/DirectX/DXILResourceImplicitBinding.cpp +++ b/llvm/lib/Target/DirectX/DXILResourceImplicitBinding.cpp @@ -111,7 +111,8 @@ static bool assignBindings(Module &M, DXILResourceBindingInfo &DRBI, RegSlotOp, /* register slot */ IB.Call->getOperand(2), /* size */ IB.Call->getOperand(3), /* index */ - IB.Call->getOperand(4)}); /* non-uniform flag */ + IB.Call->getOperand(4), /* non-uniform flag */ + IB.Call->getOperand(5)}); /* name */ IB.Call->replaceAllUsesWith(NewCall); IB.Call->eraseFromParent(); Changed = true; diff --git a/llvm/test/CodeGen/DirectX/BufferLoad-sm61.ll b/llvm/test/CodeGen/DirectX/BufferLoad-sm61.ll index 501f15192d272..6f0ef29649761 100644 --- a/llvm/test/CodeGen/DirectX/BufferLoad-sm61.ll +++ b/llvm/test/CodeGen/DirectX/BufferLoad-sm61.ll @@ -7,7 +7,7 @@ target triple = "dxil-pc-shadermodel6.1-compute" define void @loadf32_struct(i32 %index) { %buffer = call target("dx.RawBuffer", float, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle %{{.*}}, i32 %index, i32 0) %load = call {float, i1} @@ -23,7 +23,7 @@ define void @loadf32_struct(i32 %index) { define void @loadv4f32_byte(i32 %offset) { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle %{{.*}}, i32 %offset, i32 0) %load = call {<4 x float>, i1} @@ -39,7 +39,7 @@ define void @loadv4f32_byte(i32 %offset) { define void @loadnested(i32 %index) { %buffer = call target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATAI32:%.*]] = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle %{{.*}}, i32 %index, i32 0) %loadi32 = call {i32, i1} @llvm.dx.resource.load.rawbuffer.i32( diff --git a/llvm/test/CodeGen/DirectX/BufferLoad.ll b/llvm/test/CodeGen/DirectX/BufferLoad.ll index 6d5146a9026ce..5678c3941a966 100644 --- a/llvm/test/CodeGen/DirectX/BufferLoad.ll +++ b/llvm/test/CodeGen/DirectX/BufferLoad.ll @@ -11,7 +11,7 @@ define void @loadv4f32() { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; The temporary casts should all have been cleaned up ; CHECK-NOT: %dx.resource.casthandle @@ -70,7 +70,7 @@ define void @index_dynamic(i32 %bufindex, i32 %elemindex) { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[LOAD:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 %bufindex, i32 undef) #[[#ATTR]] %load = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer( @@ -106,7 +106,7 @@ define void @loadf32() { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", float, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]] %load0 = call {float, i1} @llvm.dx.resource.load.typedbuffer( @@ -125,7 +125,7 @@ define void @loadv2f32() { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <2 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v2f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]] %data0 = call {<2 x float>, i1} @llvm.dx.resource.load.typedbuffer( @@ -139,7 +139,7 @@ define void @loadv4f32_checkbit() { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f32 @dx.op.bufferLoad.f32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]] %data0 = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer.f32( @@ -160,7 +160,7 @@ define void @loadv4i32() { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]] %data0 = call {<4 x i32>, i1} @llvm.dx.resource.load.typedbuffer( @@ -174,7 +174,7 @@ define void @loadv4f16() { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x half>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.f16 @dx.op.bufferLoad.f16(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]] %data0 = call {<4 x half>, i1} @llvm.dx.resource.load.typedbuffer( @@ -188,7 +188,7 @@ define void @loadv4i16() { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i16>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i16_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = call %dx.types.ResRet.i16 @dx.op.bufferLoad.i16(i32 68, %dx.types.Handle [[HANDLE]], i32 0, i32 undef) #[[#ATTR]] %data0 = call {<4 x i16>, i1} @llvm.dx.resource.load.typedbuffer( diff --git a/llvm/test/CodeGen/DirectX/BufferStore-errors.ll b/llvm/test/CodeGen/DirectX/BufferStore-errors.ll index 8d041b1ebfeaa..663de830502cb 100644 --- a/llvm/test/CodeGen/DirectX/BufferStore-errors.ll +++ b/llvm/test/CodeGen/DirectX/BufferStore-errors.ll @@ -9,7 +9,7 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @storetoomany(<5 x float> %data, i32 %index) "hlsl.export" { %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) call void @llvm.dx.resource.store.typedbuffer.tdx.TypedBuffer_v4f32_1_0_0t.v5f32( target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %buffer, diff --git a/llvm/test/CodeGen/DirectX/BufferStore-sm61.ll b/llvm/test/CodeGen/DirectX/BufferStore-sm61.ll index 1916cdf374455..dff28dbde82be 100644 --- a/llvm/test/CodeGen/DirectX/BufferStore-sm61.ll +++ b/llvm/test/CodeGen/DirectX/BufferStore-sm61.ll @@ -7,7 +7,7 @@ target triple = "dxil-pc-shadermodel6.1-compute" define void @storef32_struct(i32 %index, float %data) { %buffer = call target("dx.RawBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle %{{.*}}, i32 %index, i32 0, float %data, float undef, float undef, float undef, i8 1) call void @llvm.dx.resource.store.rawbuffer.f32( @@ -21,7 +21,7 @@ define void @storef32_struct(i32 %index, float %data) { define void @storef32_byte(i32 %offset, float %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: call void @dx.op.bufferStore.f32(i32 69, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, float %data, float undef, float undef, float undef, i8 1) call void @llvm.dx.resource.store.rawbuffer.f32( @@ -35,7 +35,7 @@ define void @storef32_byte(i32 %offset, float %data) { define void @storev4f32_struct(i32 %index, <4 x float> %data) { %buffer = call target("dx.RawBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = extractelement <4 x float> %data, i32 0 ; CHECK: [[DATA1:%.*]] = extractelement <4 x float> %data, i32 1 @@ -53,7 +53,7 @@ define void @storev4f32_struct(i32 %index, <4 x float> %data) { define void @storev4f32_byte(i32 %offset, <4 x float> %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = extractelement <4 x float> %data, i32 0 ; CHECK: [[DATA1:%.*]] = extractelement <4 x float> %data, i32 1 @@ -71,7 +71,7 @@ define void @storev4f32_byte(i32 %offset, <4 x float> %data) { define void @storeelements(i32 %index, <4 x float> %data0, <4 x i32> %data1) { %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x float> %data0, i32 0 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x float> %data0, i32 1 @@ -98,7 +98,7 @@ define void @storeelements(i32 %index, <4 x float> %data0, <4 x i32> %data1) { define void @storenested(i32 %index, i32 %data0, <4 x float> %data1, <3 x half> %data2) { %buffer = call target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: call void @dx.op.bufferStore.i32(i32 69, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i32 %data0, i32 undef, i32 undef, i32 undef, i8 1) call void @llvm.dx.resource.store.rawbuffer.i32( diff --git a/llvm/test/CodeGen/DirectX/BufferStore.ll b/llvm/test/CodeGen/DirectX/BufferStore.ll index 363a3c723bfd5..6c5bf0a6baa08 100644 --- a/llvm/test/CodeGen/DirectX/BufferStore.ll +++ b/llvm/test/CodeGen/DirectX/BufferStore.ll @@ -9,7 +9,7 @@ define void @storefloats(<4 x float> %data, i32 %index) { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; The temporary casts should all have been cleaned up ; CHECK-NOT: %dx.resource.casthandle @@ -33,7 +33,7 @@ define void @storeonefloat(float %data, i32 %index) { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; The temporary casts should all have been cleaned up ; CHECK-NOT: %dx.resource.casthandle @@ -53,7 +53,7 @@ define void @storetwofloat(<2 x float> %data, i32 %index) { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <2 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v2f32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; The temporary casts should all have been cleaned up ; CHECK-NOT: %dx.resource.casthandle @@ -75,7 +75,7 @@ define void @storeint(<4 x i32> %data, i32 %index) { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x i32> %data, i32 0 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x i32> %data, i32 1 @@ -96,7 +96,7 @@ define void @storehalf(<4 x half> %data, i32 %index) { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; The temporary casts should all have been cleaned up ; CHECK-NOT: %dx.resource.casthandle @@ -120,7 +120,7 @@ define void @storei16(<4 x i16> %data, i32 %index) { ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x i16>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4i16_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; The temporary casts should all have been cleaned up ; CHECK-NOT: %dx.resource.casthandle @@ -144,7 +144,7 @@ define void @store_scalarized_floats(float %data0, float %data1, float %data2, f ; CHECK: [[HANDLE:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; We shouldn't end up with any inserts/extracts. ; CHECK-NOT: insertelement diff --git a/llvm/test/CodeGen/DirectX/CBufferAccess/array-typedgep.ll b/llvm/test/CodeGen/DirectX/CBufferAccess/array-typedgep.ll index dbd01b323aa2a..bb0bcc5296c34 100644 --- a/llvm/test/CodeGen/DirectX/CBufferAccess/array-typedgep.ll +++ b/llvm/test/CodeGen/DirectX/CBufferAccess/array-typedgep.ll @@ -13,7 +13,7 @@ ; CHECK: define void @f define void @f(ptr %dst) { entry: - %CB.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 36, 0)) @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBs_36_0tt(i32 0, i32 0, i32 1, i32 0, i1 false) + %CB.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 36, 0)) @llvm.dx.resource.handlefrombinding.tdx.CBuffer_tdx.Layout_s___cblayout_CBs_36_0tt(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 36, 0)) %CB.cb_h, ptr @CB.cb, align 4 ; CHECK: [[CB:%.*]] = load target("dx.CBuffer", {{.*}})), ptr @CB.cb diff --git a/llvm/test/CodeGen/DirectX/CBufferAccess/arrays.ll b/llvm/test/CodeGen/DirectX/CBufferAccess/arrays.ll index 42d7943953b84..b4493bbd61f07 100644 --- a/llvm/test/CodeGen/DirectX/CBufferAccess/arrays.ll +++ b/llvm/test/CodeGen/DirectX/CBufferAccess/arrays.ll @@ -27,7 +27,7 @@ ; CHECK: define void @f define void @f(ptr %dst) { entry: - %CB.cb_h.i.i = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 708, 0, 48, 112, 176, 224, 608, 624, 656)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %CB.cb_h.i.i = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 708, 0, 48, 112, 176, 224, 608, 624, 656)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 708, 0, 48, 112, 176, 224, 608, 624, 656)) %CB.cb_h.i.i, ptr @CB.cb, align 4 ; CHECK: [[CB:%.*]] = load target("dx.CBuffer", {{.*}})), ptr @CB.cb diff --git a/llvm/test/CodeGen/DirectX/CBufferAccess/scalars.ll b/llvm/test/CodeGen/DirectX/CBufferAccess/scalars.ll index 125d6b66c0107..f062b3e859628 100644 --- a/llvm/test/CodeGen/DirectX/CBufferAccess/scalars.ll +++ b/llvm/test/CodeGen/DirectX/CBufferAccess/scalars.ll @@ -25,7 +25,7 @@ ; CHECK: define void @f define void @f(ptr %dst) { entry: - %CB.cb_h.i.i = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 32, 0, 4, 8, 12, 14, 16, 24)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %CB.cb_h.i.i = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 32, 0, 4, 8, 12, 14, 16, 24)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 32, 0, 4, 8, 12, 14, 16, 24)) %CB.cb_h.i.i, ptr @CB.cb, align 4 ; CHECK: [[CB:%.*]] = load target("dx.CBuffer", {{.*}})), ptr @CB.cb diff --git a/llvm/test/CodeGen/DirectX/CBufferAccess/vectors.ll b/llvm/test/CodeGen/DirectX/CBufferAccess/vectors.ll index 6addf7482ac37..f46c91f3ef5fb 100644 --- a/llvm/test/CodeGen/DirectX/CBufferAccess/vectors.ll +++ b/llvm/test/CodeGen/DirectX/CBufferAccess/vectors.ll @@ -23,7 +23,7 @@ ; CHECK: define void @f define void @f(ptr %dst) { entry: - %CB.cb_h.i.i = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 102, 0, 16, 40, 48, 80, 96)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %CB.cb_h.i.i = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 102, 0, 16, 40, 48, 80, 96)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 102, 0, 16, 40, 48, 80, 96)) %CB.cb_h.i.i, ptr @CB.cb, align 4 ; CHECK: [[CB:%.*]] = load target("dx.CBuffer", {{.*}})), ptr @CB.cb diff --git a/llvm/test/CodeGen/DirectX/CBufferLoadLegacy-errors.ll b/llvm/test/CodeGen/DirectX/CBufferLoadLegacy-errors.ll index 66dc1d2f36636..7fe6e038fa7e1 100644 --- a/llvm/test/CodeGen/DirectX/CBufferLoadLegacy-errors.ll +++ b/llvm/test/CodeGen/DirectX/CBufferLoadLegacy-errors.ll @@ -12,7 +12,7 @@ declare void @f16_user(half) ; CHECK-SAME: Type mismatch between intrinsic and DXIL op define void @four64() "hlsl.export" { %buffer = call target("dx.CBuffer", target("dx.Layout", {double}, 8, 0)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {double, double, double, double} @llvm.dx.resource.load.cbufferrow.4( target("dx.CBuffer", target("dx.Layout", {double}, 8, 0)) %buffer, @@ -29,7 +29,7 @@ define void @four64() "hlsl.export" { ; CHECK-SAME: Type mismatch between intrinsic and DXIL op define void @two32() "hlsl.export" { %buffer = call target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, float} @llvm.dx.resource.load.cbufferrow.2( target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) %buffer, diff --git a/llvm/test/CodeGen/DirectX/CBufferLoadLegacy.ll b/llvm/test/CodeGen/DirectX/CBufferLoadLegacy.ll index 12b02cfd27823..c2df5efb69edc 100644 --- a/llvm/test/CodeGen/DirectX/CBufferLoadLegacy.ll +++ b/llvm/test/CodeGen/DirectX/CBufferLoadLegacy.ll @@ -9,7 +9,7 @@ declare void @f16_user(half) ; CHECK-LABEL: define void @loadf32 define void @loadf32() { %buffer = call target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %{{.*}}, i32 0) %load = call {float, float, float, float} @llvm.dx.resource.load.cbufferrow.4( @@ -28,7 +28,7 @@ define void @loadf32() { define void @loadf64() { %buffer = call target("dx.CBuffer", target("dx.Layout", {double, double, double, double}, 64, 0, 8, 16, 24)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %{{.*}}, i32 1) %load = call {double, double} @llvm.dx.resource.load.cbufferrow.2( @@ -47,7 +47,7 @@ define void @loadf64() { define void @loadf16() { %buffer = call target("dx.CBuffer", target("dx.Layout", {half}, 2, 0)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %{{.*}}, i32 0) %load = call {half, half, half, half, half, half, half, half} @llvm.dx.resource.load.cbufferrow.8( diff --git a/llvm/test/CodeGen/DirectX/ContainerData/PSVResources-order.ll b/llvm/test/CodeGen/DirectX/ContainerData/PSVResources-order.ll index 734149eec598e..aad1f92e4a5a6 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/PSVResources-order.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/PSVResources-order.ll @@ -14,12 +14,12 @@ target triple = "dxil-unknown-shadermodel6.0-compute" define void @main() #0 { %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0t( - i32 2, i32 7, i32 1, i32 0, i1 false) + i32 2, i32 7, i32 1, i32 0, i1 false, ptr null) %srv0 = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( - i32 1, i32 8, i32 1, i32 0, i1 false) + i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) %cbuf = call target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) - @llvm.dx.resource.handlefrombinding(i32 3, i32 2, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 3, i32 2, i32 1, i32 0, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll b/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll index cea8ba2f067c1..8533ab2478db0 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/PSVResources.ll @@ -15,7 +15,7 @@ define void @main() #0 { ; CHECK: Flags: ; CHECK: UsedByAtomic64: false %cbuf = call target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) - @llvm.dx.resource.handlefrombinding(i32 3, i32 2, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 3, i32 2, i32 1, i32 0, i1 false, ptr null) ; ByteAddressBuffer Buf : register(t8, space1) ; CHECK: - Type: SRVRaw @@ -27,7 +27,7 @@ define void @main() #0 { ; CHECK: UsedByAtomic64: false %srv0 = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( - i32 1, i32 8, i32 1, i32 0, i1 false) + i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) ; struct S { float4 a; uint4 b; }; ; StructuredBuffer Buf : register(t2, space4) @@ -40,7 +40,7 @@ define void @main() #0 { ; CHECK: UsedByAtomic64: false %srv1 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( - i32 4, i32 2, i32 1, i32 0, i1 false) + i32 4, i32 2, i32 1, i32 0, i1 false, ptr null) ; Buffer Buf[24] : register(t3, space5) ; CHECK: - Type: SRVTyped @@ -52,7 +52,7 @@ define void @main() #0 { ; CHECK: UsedByAtomic64: false %srv2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0t( - i32 5, i32 3, i32 24, i32 0, i1 false) + i32 5, i32 3, i32 24, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u7, space2) ; CHECK: - Type: UAVTyped @@ -64,7 +64,7 @@ define void @main() #0 { ; CHECK: UsedByAtomic64: false %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0t( - i32 2, i32 7, i32 1, i32 0, i1 false) + i32 2, i32 7, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u5, space3) ; CHECK: - Type: UAVTyped @@ -76,7 +76,7 @@ define void @main() #0 { ; CHECK: UsedByAtomic64: false %uav1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0( - i32 3, i32 5, i32 1, i32 0, i1 false) + i32 3, i32 5, i32 1, i32 0, i1 false, ptr null) ; RWBuffer BufferArray[10] : register(u0, space4) ; CHECK: - Type: UAVTyped @@ -89,11 +89,11 @@ define void @main() #0 { ; RWBuffer Buf = BufferArray[0] %uav2_1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0( - i32 4, i32 0, i32 10, i32 0, i1 false) + i32 4, i32 0, i32 10, i32 0, i1 false, ptr null) ; RWBuffer Buf = BufferArray[5] %uav2_2 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0( - i32 4, i32 0, i32 10, i32 5, i1 false) + i32 4, i32 0, i32 10, i32 5, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/CreateHandle.ll b/llvm/test/CodeGen/DirectX/CreateHandle.ll index 048e57c091142..ce18f1e2b0c2f 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandle.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandle.ll @@ -18,14 +18,14 @@ define void @test_buffers() { ; RWBuffer Buf : register(u5, space3) %typed0 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 3, i32 5, i32 1, i32 0, i1 false) + i32 3, i32 5, i32 1, i32 0, i1 false, ptr null) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 1, i32 5, i1 false) #[[#ATTR:]] ; CHECK-NOT: @llvm.dx.cast.handle ; RWBuffer Buf : register(u7, space2) %typed1 = call target("dx.TypedBuffer", i32, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_1t( - i32 2, i32 7, i32 1, i32 0, i1 false) + i32 2, i32 7, i32 1, i32 0, i1 false, ptr null) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 0, i32 7, i1 false) #[[#ATTR]] ; Buffer Buf[24] : register(t3, space5) @@ -33,20 +33,20 @@ define void @test_buffers() { ; Note that the index below is 3 + 4 = 7 %typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0_0t( - i32 5, i32 3, i32 24, i32 4, i1 false) + i32 5, i32 3, i32 24, i32 4, i1 false, ptr null) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 3, i32 7, i1 false) #[[#ATTR]] ; struct S { float4 a; uint4 b; }; ; StructuredBuffer Buf : register(t2, space4) %struct0 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( - i32 4, i32 2, i32 1, i32 0, i1 true) + i32 4, i32 2, i32 1, i32 0, i1 true, ptr null) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 2, i32 2, i1 true) #[[#ATTR]] ; ByteAddressBuffer Buf : register(t8, space1) %byteaddr0 = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( - i32 1, i32 8, i32 1, i32 0, i1 false) + i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 1, i32 8, i1 false) #[[#ATTR]] ; Buffer Buf[] : register(t7) @@ -54,7 +54,7 @@ define void @test_buffers() { %typed3_ix = call i32 @some_val() %typed3 = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0t( - i32 0, i32 7, i32 -1, i32 %typed3_ix, i1 false) + i32 0, i32 7, i32 -1, i32 %typed3_ix, i1 false, ptr null) ; CHECK: %[[IX:.*]] = add i32 %typed3_ix, 7 ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 %[[IX]], i1 false) #[[#ATTR]] diff --git a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll index 089b6eaa563ca..7b07e6a7ebeab 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll @@ -19,14 +19,14 @@ define void @test_bindings() { ; RWBuffer Buf : register(u5, space3) %typed0 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 3, i32 5, i32 1, i32 0, i1 false) + i32 3, i32 5, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[BUF0:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 5, i32 5, i32 3, i8 1 }, i32 5, i1 false) #[[#ATTR:]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF0]], %dx.types.ResourceProperties { i32 4106, i32 1033 }) #[[#ATTR]] ; RWBuffer Buf : register(u7, space2) %typed1 = call target("dx.TypedBuffer", i32, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t( - i32 2, i32 7, i32 1, i32 0, i1 false) + i32 2, i32 7, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[BUF1:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 7, i32 7, i32 2, i8 1 }, i32 7, i1 false) #[[#ATTR]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF1]], %dx.types.ResourceProperties { i32 4106, i32 260 }) #[[#ATTR]] @@ -35,7 +35,7 @@ define void @test_bindings() { ; Note that the index below is 3 + 4 = 7 %typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0_0t( - i32 5, i32 3, i32 24, i32 4, i1 false) + i32 5, i32 3, i32 24, i32 4, i1 false, ptr null) ; CHECK: [[BUF2:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 3, i32 26, i32 5, i8 0 }, i32 7, i1 false) #[[#ATTR]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF2]], %dx.types.ResourceProperties { i32 10, i32 1029 }) #[[#ATTR]] @@ -43,14 +43,14 @@ define void @test_bindings() { ; StructuredBuffer Buf : register(t2, space4) %struct0 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0t( - i32 4, i32 2, i32 1, i32 0, i1 true) + i32 4, i32 2, i32 1, i32 0, i1 true, ptr null) ; CHECK: [[BUF3:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 2, i32 2, i32 4, i8 0 }, i32 2, i1 true) #[[#ATTR]] ; CHECK: = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF3]], %dx.types.ResourceProperties { i32 1036, i32 32 }) #[[#ATTR]] ; ByteAddressBuffer Buf : register(t8, space1) %byteaddr0 = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( - i32 1, i32 8, i32 1, i32 0, i1 false) + i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[BUF4:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 8, i32 8, i32 1, i8 0 }, i32 8, i1 false) #[[#ATTR]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF4]], %dx.types.ResourceProperties { i32 11, i32 0 }) #[[#ATTR]] @@ -59,14 +59,14 @@ define void @test_bindings() { %typed3_ix = call i32 @some_val() %typed3 = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0t( - i32 0, i32 7, i32 -1, i32 %typed3_ix, i1 false) + i32 0, i32 7, i32 -1, i32 %typed3_ix, i1 false, ptr null) ; CHECK: %[[IX:.*]] = add i32 %typed3_ix, 7 ; CHECK: [[BUF5:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 7, i32 -1, i32 0, i8 0 }, i32 %[[IX]], i1 false) #[[#ATTR]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF5]], %dx.types.ResourceProperties { i32 10, i32 1033 }) #[[#ATTR]] ; cbuffer cb0 : register(b0) { int4 i; float4 f; } %cb0 = call target("dx.CBuffer", target("dx.Layout", {<4 x i32>, <4 x float>}, 32, 0, 16)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[BUF6:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 0, i32 0, i32 0, i8 2 }, i32 0, i1 false) #[[#ATTR]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF6]], %dx.types.ResourceProperties { i32 13, i32 32 }) #[[#ATTR]] diff --git a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/alloca.ll b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/alloca.ll index f9abfbddeae57..9ff4b6fb9001d 100644 --- a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/alloca.ll +++ b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/alloca.ll @@ -8,7 +8,7 @@ define float @f() { entry: %buf = alloca target("dx.RawBuffer", <4 x float>, 1, 0), align 4 - %h = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %h = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", <4 x float>, 1, 0) %h, ptr %buf, align 4 %b = load target("dx.RawBuffer", <4 x float>, 1, 0), ptr %buf, align 4 diff --git a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/ambiguous.ll b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/ambiguous.ll index 62cd04e0032fb..e8cfa5ac5b433 100644 --- a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/ambiguous.ll +++ b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/ambiguous.ll @@ -7,9 +7,9 @@ define float @f() { entry: - %h1 = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %h1 = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", <4 x float>, 1, 0) %h1, ptr @Buf, align 4 - %h2 = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + %h2 = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", <4 x float>, 1, 0) %h2, ptr @Buf, align 4 %b = load target("dx.RawBuffer", <4 x float>, 1, 0), ptr @Buf, align 4 diff --git a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/buffer-O0.ll b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/buffer-O0.ll index 880fefd57e029..6199378e0a4fc 100644 --- a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/buffer-O0.ll +++ b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/buffer-O0.ll @@ -13,13 +13,13 @@ entry: %Index.addr.i2 = alloca i32, align 4 %this.addr.i = alloca ptr, align 4 %Index.addr.i = alloca i32, align 4 - ; CHECK: [[IN:%.*]] = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 0, i32 1, i32 0, i1 false) - %_ZL2In_h.i.i = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 0, i32 1, i32 0, i1 false) + ; CHECK: [[IN:%.*]] = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) + %_ZL2In_h.i.i = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", <4 x float>, 1, 0) %_ZL2In_h.i.i, ptr @_ZL2In, align 4 store ptr @_ZL2In, ptr %this.addr.i.i, align 4 %this1.i.i = load ptr, ptr %this.addr.i.i, align 4 - ; CHECK: [[OUT:%.*]] = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 1, i32 1, i32 0, i1 false) - %_ZL3Out_h.i.i = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 1, i32 1, i32 0, i1 false) + ; CHECK: [[OUT:%.*]] = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) + %_ZL3Out_h.i.i = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_1_0t(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", <4 x float>, 1, 0) %_ZL3Out_h.i.i, ptr @_ZL3Out, align 4 store ptr @_ZL3Out, ptr %this.addr.i.i.i, align 4 %this1.i.i.i = load ptr, ptr %this.addr.i.i.i, align 4 diff --git a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/cbuffer-access.ll b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/cbuffer-access.ll index 7790cd3ad2ec6..96880e899f79f 100644 --- a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/cbuffer-access.ll +++ b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/cbuffer-access.ll @@ -8,9 +8,9 @@ define void @main() local_unnamed_addr #1 { entry: ; CHECK: [[CB:%.*]] = tail call target({{.*}}) @llvm.dx.resource.handlefrombinding - %h = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 12, 0, 4, 8)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %h = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 12, 0, 4, 8)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 12, 0, 4, 8)) %h, ptr @CB.cb, align 4 - %_ZL3Out_h.i.i = tail call target("dx.RawBuffer", %struct.Scalars, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %_ZL3Out_h.i.i = tail call target("dx.RawBuffer", %struct.Scalars, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: load target({{.*}}), ptr @CB.cb %cb = load target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 12, 0, 4, 8)), ptr @CB.cb, align 4 ; CHECK: call { float, float, float, float } @llvm.dx.resource.load.cbufferrow.4.{{.*}}(target({{.*}}) [[CB]], i32 0) diff --git a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/undominated.ll b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/undominated.ll index 03406ca97c62f..6bfe28c3f16b2 100644 --- a/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/undominated.ll +++ b/llvm/test/CodeGen/DirectX/ForwardHandleAccesses/undominated.ll @@ -9,7 +9,7 @@ define void @f() { entry: %b = load target("dx.RawBuffer", <4 x float>, 1, 0), ptr @Buf, align 4 - %h1 = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %h1 = call target("dx.RawBuffer", <4 x float>, 1, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", <4 x float>, 1, 0) %h1, ptr @Buf, align 4 ret void diff --git a/llvm/test/CodeGen/DirectX/ImplicitBinding/arrays.ll b/llvm/test/CodeGen/DirectX/ImplicitBinding/arrays.ll index 7c656becef11f..13ab0352b2a40 100644 --- a/llvm/test/CodeGen/DirectX/ImplicitBinding/arrays.ll +++ b/llvm/test/CodeGen/DirectX/ImplicitBinding/arrays.ll @@ -12,34 +12,34 @@ define void @test_arrays() { ; RWBuffer A : register(u2); %bufA = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) ; no change to llvm.dx.resource.handlefrombinding ; CHECK: %bufA = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 2, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) ; RWBuffer E[2]; %bufE = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 30, i32 0, i32 5, i32 4, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 30, i32 0, i32 5, i32 4, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 7, i32 5, i32 4, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 7, i32 5, i32 4, i1 false, ptr null) ; RWBuffer B[4]; %bufB = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 10, i32 0, i32 4, i32 2, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 10, i32 0, i32 4, i32 2, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 3, i32 4, i32 2, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 3, i32 4, i32 2, i1 false, ptr null) ; RWBuffer C[2]; %bufC = call target("dx.TypedBuffer", i32, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 20, i32 0, i32 2, i32 1, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 20, i32 0, i32 2, i32 1, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 0, i32 2, i32 1, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 0, i32 2, i32 1, i1 false, ptr null) ; another access to resource array B to make sure it gets the same binding %bufB2 = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 10, i32 0, i32 4, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 10, i32 0, i32 4, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 3, i32 4, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 3, i32 4, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.handlefromimplicitbinding ret void diff --git a/llvm/test/CodeGen/DirectX/ImplicitBinding/multiple-spaces.ll b/llvm/test/CodeGen/DirectX/ImplicitBinding/multiple-spaces.ll index b22d7fbff2f0c..2403561f3e1c0 100644 --- a/llvm/test/CodeGen/DirectX/ImplicitBinding/multiple-spaces.ll +++ b/llvm/test/CodeGen/DirectX/ImplicitBinding/multiple-spaces.ll @@ -14,40 +14,40 @@ define void @test_many_spaces() { ; RWBuffer A : register(u5); %bufA = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ; no change to llvm.dx.resource.handlefrombinding ; CHECK: %bufA = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 5, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ; RWBuffer B[]; %bufB = call target("dx.TypedBuffer", i32, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 100, i32 0, i32 -1, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 100, i32 0, i32 -1, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 6, i32 -1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 6, i32 -1, i32 0, i1 false, ptr null) ; RWBuffer C[4] : register(space5); %bufC = call target("dx.TypedBuffer", i32, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 5, i32 4, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 5, i32 4, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 5, i32 0, i32 4, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 5, i32 0, i32 4, i32 0, i1 false, ptr null) ; RWBuffer D[] : register(space5); %bufD = call target("dx.TypedBuffer", i32, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 102, i32 5, i32 -1, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 102, i32 5, i32 -1, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", i32, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 5, i32 4, i32 -1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 5, i32 4, i32 -1, i32 0, i1 false, ptr null) ; RWBuffer E[3] : register(space10); // gets u0, space10 %bufE = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 103, i32 10, i32 4, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 103, i32 10, i32 4, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 10, i32 0, i32 4, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 10, i32 0, i32 4, i32 0, i1 false, ptr null) ; StructuredBuffer F : register(space3); // gets t0 in space3 %bufF = call target("dx.RawBuffer", i32, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 104, i32 3, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 104, i32 3, i32 1, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.RawBuffer", i32, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_0_0t(i32 3, i32 0, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i32_0_0t(i32 3, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.handlefromimplicitbinding ret void diff --git a/llvm/test/CodeGen/DirectX/ImplicitBinding/simple.ll b/llvm/test/CodeGen/DirectX/ImplicitBinding/simple.ll index 83a1077a71ca5..a05680fc6153d 100644 --- a/llvm/test/CodeGen/DirectX/ImplicitBinding/simple.ll +++ b/llvm/test/CodeGen/DirectX/ImplicitBinding/simple.ll @@ -6,22 +6,22 @@ define void @test_simple_binding() { ; StructuredBuffer A : register(t1); %bufA = call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) ; no change to llvm.dx.resource.handlefrombinding ; CHECK: %bufA = call target("dx.RawBuffer", float, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 1, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) ; StructuredBuffer B; // gets register(t0, space0) %bufB = call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 5, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 5, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.RawBuffer", float, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; StructuredBuffer C; // gets register(t2, space0) %bufC = call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 6, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 6, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.RawBuffer", float, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 2, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0t(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.handlefromimplicitbinding diff --git a/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays-error.ll b/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays-error.ll index af61941d9791f..0db47b22f8e6d 100644 --- a/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays-error.ll +++ b/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays-error.ll @@ -15,19 +15,19 @@ define void @test_many_spaces() { ; RWBuffer A : register(u1); %bufA = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) ; RWBuffer B[]; %bufB = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 100, i32 0, i32 -1, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 100, i32 0, i32 -1, i32 0, i1 false, ptr null) ; RWBuffer C : register(u5); %bufC = call target("dx.TypedBuffer", i32, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ; RWBuffer D[4]; %bufD = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 0, i32 4, i32 1, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 0, i32 4, i32 1, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays.ll b/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays.ll index 762cbc10b6e66..b6ab3fd5ecb02 100644 --- a/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays.ll +++ b/llvm/test/CodeGen/DirectX/ImplicitBinding/unbounded-arrays.ll @@ -12,29 +12,29 @@ define void @test_unbounded_arrays() { ; RWBuffer A : register(u1); %bufA = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) ; no change to llvm.dx.resource.handlefrombinding ; CHECK: %bufA = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 1, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) ; RWBuffer B[]; %bufB = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 100, i32 0, i32 -1, i32 0, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 100, i32 0, i32 -1, i32 0, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 6, i32 -1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 6, i32 -1, i32 0, i1 false, ptr null) ; RWBuffer C : register(u5); %bufC = call target("dx.TypedBuffer", i32, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ; no change to llvm.dx.resource.handlefrombinding ; CHECK: %bufC = call target("dx.TypedBuffer", i32, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 5, i32 1, i32 0, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_1_0_0t(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ; ; RWBuffer D[3]; %bufD = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 0, i32 3, i32 1, i1 false) + @llvm.dx.resource.handlefromimplicitbinding(i32 101, i32 0, i32 3, i32 1, i1 false, ptr null) ; CHECK: %{{.*}} = call target("dx.TypedBuffer", float, 1, 0, 0) -; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 2, i32 3, i32 1, i1 false) +; CHECK-SAME: @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0_0t(i32 0, i32 2, i32 3, i32 1, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.handlefromimplicitbinding ret void diff --git a/llvm/test/CodeGen/DirectX/Metadata/cbuffer-only.ll b/llvm/test/CodeGen/DirectX/Metadata/cbuffer-only.ll index c07e8d9a2b591..959150f4c2c6a 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/cbuffer-only.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/cbuffer-only.ll @@ -8,7 +8,7 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @cbuffer_is_only_binding() { %cbuf = call target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) - @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) ; CHECK: %cbuffer = type ret void diff --git a/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll index 3ded6f0a9293b..8eda78c1d1c42 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll @@ -31,7 +31,7 @@ define void @test() #0 { ; int2 d; ; } %CB1.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB1, 24, 0, 4, 8, 16)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB1, 24, 0, 4, 8, 16)) %CB1.cb_h, ptr @CB1.cb, align 4 ; cbuffer CB2 : register(b0) { @@ -45,7 +45,7 @@ define void @test() #0 { ;} %CB2.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB2, 36, 0, 8, 16, 20, 22, 24, 32)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB2, 36, 0, 8, 16, 20, 22, 24, 32)) %CB2.cb_h, ptr @CB2.cb, align 4 ; cbuffer CB3 : register(b5) { @@ -60,7 +60,7 @@ define void @test() #0 { ; half3 B8; ; } %CB3.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB3, 96, 0, 16, 28, 32, 56, 64, 80, 84, 90)) - @llvm.dx.resource.handlefrombinding(i32 15, i32 5, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 15, i32 5, i32 1, i32 0, i1 false, ptr null) store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB3, 96, 0, 16, 28, 32, 56, 64, 80, 84, 90)) %CB3.cb_h, ptr @CB3.cb, align 4 ret void diff --git a/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll b/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll index 6ebe4b5eb23a5..f4dbea6cffbed 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll @@ -7,27 +7,27 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @test() { ; Buffer %float4 = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: %TypedBuffer = type { <4 x float> } ; Buffer %int = call target("dx.TypedBuffer", i32, 0, 0, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) ; CHECK: %TypedBuffer.0 = type { i32 } ; Buffer %uint3 = call target("dx.TypedBuffer", <3 x i32>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) ; CHECK: %TypedBuffer.1 = type { <3 x i32> } ; StructuredBuffer %struct0 = call target("dx.RawBuffer", %struct.S, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 10, i32 1, i32 0, i1 true) + @llvm.dx.resource.handlefrombinding(i32 0, i32 10, i32 1, i32 0, i1 true, ptr null) ; CHECK: %StructuredBuffer = type { %struct.S } ; ByteAddressBuffer %byteaddr = call target("dx.RawBuffer", i8, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 20, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 20, i32 1, i32 0, i1 false, ptr null) ; CHECK: %ByteAddressBuffer = type { i32 } ret void diff --git a/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll index 63ead534f1276..3b01b87a0533b 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll @@ -37,37 +37,37 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @test() #0 { ; Buffer Buf : register(t0) %Zero_h = call target("dx.TypedBuffer", <4 x half>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <4 x half>, 0, 0, 0) %Zero_h, ptr @Zero, align 4 ; Buffer Buf : register(t1) %One_h = call target("dx.TypedBuffer", <2 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <2 x float>, 0, 0, 0) %One_h, ptr @One, align 4 ; Buffer Two : register(t2); %Two_h = call target("dx.TypedBuffer", double, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", double, 0, 0, 0) %Two_h, ptr @Two, align 4 ; Buffer Three : register(t3); %Three_h = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <4 x i32>, 0, 0, 1) %Three_h, ptr @Three, align 4 ; ByteAddressBuffer Four : register(t4) %Four_h = call target("dx.RawBuffer", i8, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", i8, 0, 0) %Four_h, ptr @Four, align 4 ; StructuredBuffer Five : register(t6); %Five_h = call target("dx.RawBuffer", i16, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", i16, 0, 0) %Five_h, ptr @Five, align 4 ; Buffer Six : register(t10, space2); %Six_h = call target("dx.TypedBuffer", i64, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", i64, 0, 0, 0) %Six_h, ptr @Six, align 4 ; Buffer Array[100] : register(t4, space3); @@ -75,9 +75,9 @@ define void @test() #0 { ; Buffer B1 = Array[42]; ; resource array accesses should produce one metadata entry %Array_30_h = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false, ptr null) %Array_42_h = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll index e2f7cffb50f3c..0cbc7ec5a10a0 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll @@ -46,52 +46,52 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @test() #0 { ; RWBuffer Zero : register(u0) %Zero_h = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %Zero_h, ptr @Zero, align 4 ; RWBuffer One : register(u1) %One_h = call target("dx.TypedBuffer", <2 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <2 x float>, 1, 0, 0) %One_h, ptr @One, align 4 ; RWBuffer Two : register(u2); %Two_h = call target("dx.TypedBuffer", double, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", double, 1, 0, 0) %Two_h, ptr @Two, align 4 ; RWBuffer Three : register(u3); %Three_h = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <4 x i32>, 1, 0, 1) %Three_h, ptr @Three, align 4 ; ByteAddressBuffer Four : register(u5) %Four_h = call target("dx.RawBuffer", i8, 1, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", i8, 1, 0) %Four_h, ptr @Four, align 4 ; RWStructuredBuffer Five : register(u6); %Five_h = call target("dx.RawBuffer", i16, 1, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", i16, 1, 0) %Five_h, ptr @Five, align 4 ; RasterizerOrderedBuffer Six : register(u7); %Six_h = call target("dx.TypedBuffer", <4 x i32>, 1, 1, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 7, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 7, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <4 x i32>, 1, 1, 1) %Six_h, ptr @Six, align 4 ; RasterizerOrderedStructuredBuffer Seven : register(u3, space10); %Seven_h = call target("dx.RawBuffer", <4 x i32>, 1, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 8, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 8, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", <4 x i32>, 1, 1) %Seven_h, ptr @Seven, align 4 ; RasterizerOrderedByteAddressBuffer Eight : register(u9); %Eight_h = call target("dx.RawBuffer", i8, 1, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 9, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 9, i32 1, i32 0, i1 false, ptr null) store target("dx.RawBuffer", i8, 1, 1) %Eight_h, ptr @Eight, align 4 ; RWBuffer Nine : register(u2); %Nine_h = call target("dx.TypedBuffer", i64, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", i64, 1, 0, 0) %Nine_h, ptr @Nine, align 4 ; RWBuffer Array[100] : register(u4, space3); @@ -99,9 +99,9 @@ define void @test() #0 { ; RWBuffer B1 = Array[42]; ; resource array accesses should produce one metadata entry %Array_30_h = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false, ptr null) %Array_42_h = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/RawBufferLoad-error64.ll b/llvm/test/CodeGen/DirectX/RawBufferLoad-error64.ll index b8a6649baf689..d8b6311c8ff2e 100644 --- a/llvm/test/CodeGen/DirectX/RawBufferLoad-error64.ll +++ b/llvm/test/CodeGen/DirectX/RawBufferLoad-error64.ll @@ -12,7 +12,7 @@ declare void @v4f64_user(<4 x double>) define void @loadv4f64_byte(i32 %offset) "hlsl.export" { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {<4 x double>, i1} @llvm.dx.resource.load.rawbuffer.v4i64( target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 %offset, i32 0) diff --git a/llvm/test/CodeGen/DirectX/RawBufferLoad.ll b/llvm/test/CodeGen/DirectX/RawBufferLoad.ll index a79392433de5d..869a5b1e3b964 100644 --- a/llvm/test/CodeGen/DirectX/RawBufferLoad.ll +++ b/llvm/test/CodeGen/DirectX/RawBufferLoad.ll @@ -13,7 +13,7 @@ declare void @v4f64_user(<4 x double>) define void @loadf32_struct(i32 %index) { %buffer = call target("dx.RawBuffer", float, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 1, i32 4) %load = call {float, i1} @@ -34,7 +34,7 @@ define void @loadf32_struct(i32 %index) { define void @loadf32_byte(i32 %offset) { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 1, i32 4) %load = call {float, i1} @@ -55,7 +55,7 @@ define void @loadf32_byte(i32 %offset) { define void @loadv4f32_struct(i32 %index) { %buffer = call target("dx.RawBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 15, i32 4) %load = call {<4 x float>, i1} @@ -83,7 +83,7 @@ define void @loadv4f32_struct(i32 %index) { define void @loadv4f32_byte(i32 %offset) { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 15, i32 4) %load = call {<4 x float>, i1} @@ -111,7 +111,7 @@ define void @loadv4f32_byte(i32 %offset) { define void @loadelements(i32 %index) { %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATAF32:%.*]] = call %dx.types.ResRet.f32 @dx.op.rawBufferLoad.f32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 15, i32 4) %loadf32 = call {<4 x float>, i1} @@ -158,7 +158,7 @@ define void @loadelements(i32 %index) { define void @loadnested(i32 %index) { %buffer = call target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATAI32:%.*]] = call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32(i32 139, %dx.types.Handle %{{.*}}, i32 %index, i32 0, i8 1, i32 4) %loadi32 = call {i32, i1} @llvm.dx.resource.load.rawbuffer.i32( @@ -210,7 +210,7 @@ define void @loadnested(i32 %index) { define void @loadv4f64_byte(i32 %offset) { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA:%.*]] = call %dx.types.ResRet.f64 @dx.op.rawBufferLoad.f64(i32 139, %dx.types.Handle %{{.*}}, i32 %offset, i32 0, i8 15, i32 8) %load = call {<4 x double>, i1} @llvm.dx.resource.load.rawbuffer.v4i64( diff --git a/llvm/test/CodeGen/DirectX/RawBufferStore-error64.ll b/llvm/test/CodeGen/DirectX/RawBufferStore-error64.ll index a883a0bbc29fd..895c4c3b9f5fe 100644 --- a/llvm/test/CodeGen/DirectX/RawBufferStore-error64.ll +++ b/llvm/test/CodeGen/DirectX/RawBufferStore-error64.ll @@ -10,7 +10,7 @@ target triple = "dxil-pc-shadermodel6.2-compute" define void @storev4f64_byte(i32 %offset, <4 x double> %data) "hlsl.export" { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) call void @llvm.dx.resource.store.rawbuffer.v4i64( target("dx.RawBuffer", i8, 1, 0, 0) %buffer, diff --git a/llvm/test/CodeGen/DirectX/RawBufferStore.ll b/llvm/test/CodeGen/DirectX/RawBufferStore.ll index 96824d5ee5a4a..3d03418cf2138 100644 --- a/llvm/test/CodeGen/DirectX/RawBufferStore.ll +++ b/llvm/test/CodeGen/DirectX/RawBufferStore.ll @@ -6,7 +6,7 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @storef32_struct(i32 %index, float %data) { %buffer = call target("dx.RawBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle %buffer_annot, i32 %index, i32 0, float %data, float undef, float undef, float undef, i8 1, i32 4) call void @llvm.dx.resource.store.rawbuffer.f32( @@ -20,7 +20,7 @@ define void @storef32_struct(i32 %index, float %data) { define void @storef32_byte(i32 %offset, float %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle %buffer_annot, i32 %offset, i32 0, float %data, float undef, float undef, float undef, i8 1, i32 4) call void @llvm.dx.resource.store.rawbuffer.f32( @@ -34,7 +34,7 @@ define void @storef32_byte(i32 %offset, float %data) { define void @storev4f32_struct(i32 %index, <4 x float> %data) { %buffer = call target("dx.RawBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = extractelement <4 x float> %data, i32 0 ; CHECK: [[DATA1:%.*]] = extractelement <4 x float> %data, i32 1 @@ -52,7 +52,7 @@ define void @storev4f32_struct(i32 %index, <4 x float> %data) { define void @storev4f32_byte(i32 %offset, <4 x float> %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = extractelement <4 x float> %data, i32 0 ; CHECK: [[DATA1:%.*]] = extractelement <4 x float> %data, i32 1 @@ -70,7 +70,7 @@ define void @storev4f32_byte(i32 %offset, <4 x float> %data) { define void @storeelements(i32 %index, <4 x float> %data0, <4 x i32> %data1) { %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0_0:%.*]] = extractelement <4 x float> %data0, i32 0 ; CHECK: [[DATA0_1:%.*]] = extractelement <4 x float> %data0, i32 1 @@ -97,7 +97,7 @@ define void @storeelements(i32 %index, <4 x float> %data0, <4 x i32> %data1) { define void @storenested(i32 %index, i32 %data0, <4 x float> %data1, <3 x half> %data2) { %buffer = call target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %buffer_annot, i32 %index, i32 0, i32 %data0, i32 undef, i32 undef, i32 undef, i8 1, i32 4) call void @llvm.dx.resource.store.rawbuffer.i32( @@ -129,7 +129,7 @@ define void @storenested(i32 %index, i32 %data0, <4 x float> %data1, <3 x half> define void @storev4f64_byte(i32 %offset, <4 x double> %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: [[DATA0:%.*]] = extractelement <4 x double> %data, i32 0 ; CHECK: [[DATA1:%.*]] = extractelement <4 x double> %data, i32 1 diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/load_rawbuffer.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/load_rawbuffer.ll index 5d2e4041c3ea0..7ea9795f00b3c 100644 --- a/llvm/test/CodeGen/DirectX/ResourceAccess/load_rawbuffer.ll +++ b/llvm/test/CodeGen/DirectX/ResourceAccess/load_rawbuffer.ll @@ -13,7 +13,7 @@ declare void @v4f64_user(<4 x double>) define void @loadf32_struct(i32 %index) { %buffer = call target("dx.RawBuffer", float, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -32,7 +32,7 @@ define void @loadf32_struct(i32 %index) { define void @loadf32_byte(i32 %offset) { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -51,7 +51,7 @@ define void @loadf32_byte(i32 %offset) { define void @loadv4f32_struct(i32 %index) { %buffer = call target("dx.RawBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -70,7 +70,7 @@ define void @loadv4f32_struct(i32 %index) { define void @loadv4f32_byte(i32 %offset) { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -89,7 +89,7 @@ define void @loadv4f32_byte(i32 %offset) { define void @loadelements(i32 %index) { %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_sl_v4f32v4i32s_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -116,7 +116,7 @@ define void @loadelements(i32 %index) { define void @loadnested(i32 %index) { %buffer = call target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -151,7 +151,7 @@ define void @loadnested(i32 %index) { define void @loadv4f64_byte(i32 %offset) { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/load_typedbuffer.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/load_typedbuffer.ll index b51b9ae4b4a11..2a557c73205cb 100644 --- a/llvm/test/CodeGen/DirectX/ResourceAccess/load_typedbuffer.ll +++ b/llvm/test/CodeGen/DirectX/ResourceAccess/load_typedbuffer.ll @@ -10,7 +10,7 @@ declare void @use_float1(<1 x float>) define void @load_float4(i32 %index, i32 %elemindex) { %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -40,7 +40,7 @@ define void @load_float4(i32 %index, i32 %elemindex) { ; CHECK-LABEL: define void @load_float( define void @load_float(i32 %index) { %buffer = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -65,7 +65,7 @@ define void @load_float(i32 %index) { ; CHECK-LABEL: define void @load_float1( define void @load_float1(i32 %index) { %buffer = call target("dx.TypedBuffer", <1 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/store_rawbuffer.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/store_rawbuffer.ll index b19f9d04a2dff..ed41d8ba24246 100644 --- a/llvm/test/CodeGen/DirectX/ResourceAccess/store_rawbuffer.ll +++ b/llvm/test/CodeGen/DirectX/ResourceAccess/store_rawbuffer.ll @@ -5,7 +5,7 @@ target triple = "dxil-pc-shadermodel6.6-compute" ; CHECK-LABEL: define void @storef32_struct define void @storef32_struct(i32 %index, float %data) { %buffer = call target("dx.RawBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -20,7 +20,7 @@ define void @storef32_struct(i32 %index, float %data) { ; CHECK-LABEL: define void @storef32_byte define void @storef32_byte(i32 %offset, float %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -35,7 +35,7 @@ define void @storef32_byte(i32 %offset, float %data) { ; CHECK-LABEL: define void @storev4f32_struct define void @storev4f32_struct(i32 %index, <4 x float> %data) { %buffer = call target("dx.RawBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -50,7 +50,7 @@ define void @storev4f32_struct(i32 %index, <4 x float> %data) { ; CHECK-LABEL: define void @storev4f32_byte define void @storev4f32_byte(i32 %offset, <4 x float> %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -65,7 +65,7 @@ define void @storev4f32_byte(i32 %offset, <4 x float> %data) { ; CHECK-LABEL: define void @storeelements define void @storeelements(i32 %index, <4 x float> %dataf32, <4 x i32> %datai32) { %buffer = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -86,7 +86,7 @@ define void @storeelements(i32 %index, <4 x float> %dataf32, <4 x i32> %datai32) define void @storenested(i32 %index, i32 %datai32, <4 x float> %dataf32, <3 x half> %dataf16) { %buffer = call target("dx.RawBuffer", {i32, {<4 x float>, <3 x half>}}, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -111,7 +111,7 @@ define void @storenested(i32 %index, i32 %datai32, <4 x float> %dataf32, <3 x ha ; CHECK-LABEL: define void @storev4f64_byte define void @storev4f64_byte(i32 %offset, <4 x double> %data) { %buffer = call target("dx.RawBuffer", i8, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( diff --git a/llvm/test/CodeGen/DirectX/ResourceAccess/store_typedbuffer.ll b/llvm/test/CodeGen/DirectX/ResourceAccess/store_typedbuffer.ll index 0b7882ac722e8..54aa25477ea8e 100644 --- a/llvm/test/CodeGen/DirectX/ResourceAccess/store_typedbuffer.ll +++ b/llvm/test/CodeGen/DirectX/ResourceAccess/store_typedbuffer.ll @@ -6,7 +6,7 @@ target triple = "dxil-pc-shadermodel6.6-compute" define void @store_float4(<4 x float> %data, i32 %index, i32 %elemindex) { %buffer = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -47,7 +47,7 @@ define void @store_float4(<4 x float> %data, i32 %index, i32 %elemindex) { define void @store_half4(<4 x half> %data, i32 %index) { %buffer = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f16_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( @@ -80,7 +80,7 @@ define void @store_half4(<4 x half> %data, i32 %index) { define void @store_double2(<2 x double> %data, i32 %index) { %buffer = call target("dx.TypedBuffer", <2 x double>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v2f64_1_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NOT: @llvm.dx.resource.getpointer %ptr = call ptr @llvm.dx.resource.getpointer( diff --git a/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll b/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll index 50c5ff92024b0..8bec56e2a2fa9 100644 --- a/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll +++ b/llvm/test/CodeGen/DirectX/ResourceGlobalElimination.ll @@ -21,9 +21,9 @@ define void @main() local_unnamed_addr #0 { entry: ; DXOP: [[In_h_i:%.*]] = call %dx.types.Handle @dx.op.createHandle ; DXOP: [[Out_h_i:%.*]] = call %dx.types.Handle @dx.op.createHandle - %In_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false) + %In_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %In_h.i, ptr @In, align 4 - %Out_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 4, i32 1, i32 1, i32 0, i1 false) + %Out_h.i = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0t(i32 4, i32 1, i32 1, i32 0, i1 false, ptr null) store target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %Out_h.i, ptr @Out, align 4 ; CSE: call i32 @llvm.dx.flattened.thread.id.in.group() %0 = call i32 @llvm.dx.flattened.thread.id.in.group() diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.5.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.5.ll index 6079071919dbc..dd5f098acf2d0 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.5.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.5.ll @@ -18,12 +18,12 @@ define void @test() "hlsl.export" { ; RWBuffer Buf : register(u0, space0) %buf0 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf[8] : register(u1, space0) %buf1 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 1, i32 8, i32 0, i1 false) + i32 0, i32 1, i32 8, i32 0, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.6.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.6.ll index 4f1a1e7b3da53..6e965d9d92ac1 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.6.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs-array-valver1.6.ll @@ -19,12 +19,12 @@ define void @test() "hlsl.export" { ; RWBuffer Buf : register(u0, space0) %buf0 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf[8] : register(u1, space0) %buf1 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 1, i32 8, i32 0, i1 false) + i32 0, i32 1, i32 8, i32 0, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs.ll index e0d4ac737704e..0f8674d8f17eb 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/max-64-uavs.ll @@ -18,39 +18,39 @@ define void @test() "hlsl.export" { ; RWBuffer Buf : register(u0, space0) %buf0 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u1, space0) %buf1 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 1, i32 1, i32 0, i1 false) + i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u2, space0) %buf2 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 2, i32 1, i32 0, i1 false) + i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u3, space0) %buf3 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 3, i32 1, i32 0, i1 false) + i32 0, i32 3, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u4, space0) %buf4 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 4, i32 1, i32 0, i1 false) + i32 0, i32 4, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u5, space0) %buf5 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 5, i32 1, i32 0, i1 false) + i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u6, space0) %buf6 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 6, i32 1, i32 0, i1 false) + i32 0, i32 6, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u7, space0) %buf7 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 7, i32 1, i32 0, i1 false) + i32 0, i32 7, i32 1, i32 0, i1 false, ptr null) ; RWBuffer Buf : register(u8, space0) %buf8 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 8, i32 1, i32 0, i1 false) + i32 0, i32 8, i32 1, i32 0, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/raw-and-structured-buffers.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/raw-and-structured-buffers.ll index 03112b60c8811..9680193e90cdc 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/raw-and-structured-buffers.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/raw-and-structured-buffers.ll @@ -14,7 +14,7 @@ target triple = "dxil-pc-shadermodel6.7-library" ; CHECK: Function rawbuf : 0x00000010 define float @rawbuf() "hlsl.export" { %buffer = call target("dx.RawBuffer", i8, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.rawbuffer.f32( target("dx.RawBuffer", i8, 0, 0, 0) %buffer, i32 0, i32 0) %data = extractvalue {float, i1} %load, 0 @@ -24,7 +24,7 @@ define float @rawbuf() "hlsl.export" { ; CHECK: Function structbuf : 0x00000010 define float @structbuf() "hlsl.export" { %buffer = call target("dx.RawBuffer", float, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.rawbuffer.f32( target("dx.RawBuffer", float, 0, 0, 0) %buffer, i32 0, i32 0) %data = extractvalue {float, i1} %load, 0 @@ -34,7 +34,7 @@ define float @structbuf() "hlsl.export" { ; CHECK: Function typedbuf : 0x00000000 define float @typedbuf(<4 x float> %val) "hlsl.export" { %buffer = call target("dx.TypedBuffer", float, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 0, 0, 0) %buffer, i32 0) %data = extractvalue {float, i1} %load, 0 diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll index c934af62f4c9b..1bac7ead04b40 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll @@ -17,7 +17,7 @@ target triple = "dxil-pc-shadermodel6.8-library" ; CHECK: Function loadUAV : 0x20000000 define float @loadUAV() #0 { %res = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) %val = extractvalue {float, i1} %load, 0 @@ -27,7 +27,7 @@ define float @loadUAV() #0 { ; CHECK: Function loadSRV : 0x00000010 define float @loadSRV() #0 { %res = tail call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) %val = extractvalue { float, i1 } %load, 0 diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll index 8884b3d681cbe..115585de5ee02 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll @@ -17,7 +17,7 @@ target triple = "dxil-pc-shadermodel6.8-library" ; CHECK: Function loadUAV : 0x00000000 define float @loadUAV() #0 { %res = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) %val = extractvalue {float, i1} %load, 0 @@ -27,7 +27,7 @@ define float @loadUAV() #0 { ; CHECK: Function loadSRV : 0x00000010 define float @loadSRV() #0 { %res = tail call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) %val = extractvalue { float, i1 } %load, 0 diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.6.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.6.ll index fe0a801209eba..97494aefffbcf 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.6.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.6.ll @@ -17,7 +17,7 @@ target triple = "dxil-pc-shadermodel6.6-library" ; CHECK: Function loadUAV : 0x00000000 define float @loadUAV() #0 { %res = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) %val = extractvalue {float, i1} %load, 0 @@ -27,7 +27,7 @@ define float @loadUAV() #0 { ; CHECK: Function loadSRV : 0x00000010 define float @loadSRV() #0 { %res = tail call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) %val = extractvalue { float, i1 } %load, 0 diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.7.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.7.ll index c0ea6b4c1e8f3..1a5cba4084fb1 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.7.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-sm6.7.ll @@ -22,7 +22,7 @@ target triple = "dxil-pc-shadermodel6.7-library" ; CHECK: Function loadUAV : 0x200010000 define float @loadUAV() #0 { %res = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) %val = extractvalue {float, i1} %load, 0 @@ -32,7 +32,7 @@ define float @loadUAV() #0 { ; CHECK: Function loadSRV : 0x200010010 define float @loadSRV() #0 { %res = tail call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) %val = extractvalue { float, i1 } %load, 0 diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-valver1.8.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-valver1.8.ll index 142c0a7cb3f48..242faa26c82f1 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-valver1.8.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-valver1.8.ll @@ -18,7 +18,7 @@ target triple = "dxil-pc-shadermodel6.7-library" ; CHECK: Function loadUAV : 0x20000000 define float @loadUAV() #0 { %res = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) %val = extractvalue {float, i1} %load, 0 @@ -28,7 +28,7 @@ define float @loadUAV() #0 { ; CHECK: Function loadSRV : 0x00000010 define float @loadSRV() #0 { %res = tail call target("dx.RawBuffer", float, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) %val = extractvalue { float, i1 } %load, 0 diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll index e9fed4ccbb37c..2c18d0b24326a 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll @@ -16,7 +16,7 @@ target triple = "dxil-pc-shadermodel6.7-library" ; CHECK: Function multicomponent : 0x00002000 define <4 x float> @multicomponent() #0 { %res = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {<4 x float>, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %res, i32 0) %val = extractvalue {<4 x float>, i1} %load, 0 @@ -26,7 +26,7 @@ define <4 x float> @multicomponent() #0 { ; CHECK: Function onecomponent : 0x00000000 define float @onecomponent() #0 { %res = call target("dx.TypedBuffer", float, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) %val = extractvalue {float, i1} %load, 0 @@ -36,7 +36,7 @@ define float @onecomponent() #0 { ; CHECK: Function noload : 0x00000000 define void @noload(<4 x float> %val) #0 { %res = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) call void @llvm.dx.resource.store.typedbuffer( target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %res, i32 0, <4 x float> %val) diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.7.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.7.ll index bd1de58732183..dc9d2cf776291 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.7.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.7.ll @@ -17,7 +17,7 @@ define void @test() "hlsl.export" { ; RWBuffer Buf : register(u0, space0) %buf0 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.8.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.8.ll index 47da35b6c9d89..2248b9f6d4e99 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.8.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-lib-valver1.8.ll @@ -16,7 +16,7 @@ define void @test() "hlsl.export" { ; RWBuffer Buf : register(u0, space0) %buf0 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-vs.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-vs.ll index bdb07b41d1559..60ecc8fe3d1f3 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-vs.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/uavs-at-every-stage-vs.ll @@ -18,7 +18,7 @@ define void @VSMain() { ; RWBuffer Buf : register(u0, space0) %buf0 = call target("dx.TypedBuffer", float, 1, 0, 1) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_f32_1_0t( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ret void } diff --git a/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll b/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll index d938cb193ef69..c73a31dcc1139 100644 --- a/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll +++ b/llvm/test/CodeGen/DirectX/bufferUpdateCounter.ll @@ -8,7 +8,7 @@ define void @update_counter_decrement_vector() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] ; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1){{$}} @@ -21,7 +21,7 @@ define void @update_counter_increment_vector() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %buffer = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_0_0_0( - i32 0, i32 0, i32 1, i32 0, i1 false) + i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] ; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 1){{$}} %1 = call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 0, 0, 0) %buffer, i8 1) @@ -33,7 +33,7 @@ define void @update_counter_decrement_scalar() { ; CHECK: [[BIND:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %buffer = call target("dx.RawBuffer", i8, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.RawBuffer_i8_0_0t( - i32 1, i32 8, i32 1, i32 0, i1 false) + i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) ; CHECK-NEXT: [[BUFFANOT:%.*]] = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BIND]] ; CHECK-NEXT: [[REG:%.*]] = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle [[BUFFANOT]], i8 -1){{$}} %1 = call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", i8, 0, 0) %buffer, i8 -1) diff --git a/llvm/test/CodeGen/DirectX/resource_counter_error.ll b/llvm/test/CodeGen/DirectX/resource_counter_error.ll index 1fc0332c60552..f3dae481af247 100644 --- a/llvm/test/CodeGen/DirectX/resource_counter_error.ll +++ b/llvm/test/CodeGen/DirectX/resource_counter_error.ll @@ -3,7 +3,7 @@ define void @inc_and_dec() { entry: - %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false) + %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 1) ret void From eacedc95f9508f0a5f6c1e9a167d5a2d781c9a28 Mon Sep 17 00:00:00 2001 From: Helena Kotas Date: Thu, 15 May 2025 19:36:00 -0700 Subject: [PATCH 3/7] add test to make sure strings are removed; fix buffer-frombinding.ll test --- .../DXILResource/buffer-frombinding.ll | 20 +++++++++---------- llvm/test/CodeGen/DirectX/CreateHandle.ll | 11 ++++++++-- .../DirectX/CreateHandleFromBinding.ll | 11 ++++++++-- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/llvm/test/Analysis/DXILResource/buffer-frombinding.ll b/llvm/test/Analysis/DXILResource/buffer-frombinding.ll index 378b1ff120885..efacff71ee127 100644 --- a/llvm/test/Analysis/DXILResource/buffer-frombinding.ll +++ b/llvm/test/Analysis/DXILResource/buffer-frombinding.ll @@ -5,7 +5,7 @@ define void @test_typedbuffer() { ; ByteAddressBuffer Buf : register(t8, space1) %srv0 = call target("dx.RawBuffer", void, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) ; CHECK: Resource [[SRV0:[0-9]+]]: ; CHECK: Binding: ; CHECK: Record ID: 0 @@ -18,7 +18,7 @@ define void @test_typedbuffer() { ; struct S { float4 a; uint4 b; }; ; StructuredBuffer Buf : register(t2, space4) %srv1 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 4, i32 2, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 4, i32 2, i32 1, i32 0, i1 false, ptr null) ; CHECK: Resource [[SRV1:[0-9]+]]: ; CHECK: Binding: ; CHECK: Record ID: 1 @@ -32,7 +32,7 @@ define void @test_typedbuffer() { ; Buffer Buf[24] : register(t3, space5) %srv2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 5, i32 3, i32 24, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 5, i32 3, i32 24, i32 0, i1 false, ptr null) ; CHECK: Resource [[SRV2:[0-9]+]]: ; CHECK: Binding: ; CHECK: Record ID: 2 @@ -46,7 +46,7 @@ define void @test_typedbuffer() { ; RWBuffer Buf : register(u7, space2) %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1) - @llvm.dx.resource.handlefrombinding(i32 2, i32 7, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 2, i32 7, i32 1, i32 0, i1 false, ptr null) ; CHECK: Resource [[UAV0:[0-9]+]]: ; CHECK: Binding: ; CHECK: Record ID: 0 @@ -63,7 +63,7 @@ define void @test_typedbuffer() { ; RWBuffer Buf : register(u5, space3) %uav1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 5, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 3, i32 5, i32 1, i32 0, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav1, i8 -1) ; CHECK: Resource [[UAV1:[0-9]+]]: ; CHECK: Binding: @@ -82,10 +82,10 @@ define void @test_typedbuffer() { ; RWBuffer BufferArray[10] : register(u0, space4) ; RWBuffer Buf = BufferArray[0] %uav2_1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 0, i1 false, ptr null) ; RWBuffer Buf = BufferArray[5] %uav2_2 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 5, i1 false) + @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 5, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav2_2, i8 1) ; CHECK: Resource [[UAV2:[0-9]+]]: ; CHECK: Binding: @@ -103,7 +103,7 @@ define void @test_typedbuffer() { ; RWBuffer Buf : register(u0, space5) %uav3 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 -1) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 1) ; CHECK: Resource [[UAV3:[0-9]+]]: @@ -121,7 +121,7 @@ define void @test_typedbuffer() { ; CHECK: Element Count: 4 %cb0 = call target("dx.CBuffer", {float}) - @llvm.dx.resource.handlefrombinding(i32 1, i32 0, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 1, i32 0, i32 1, i32 0, i1 false, ptr null) ; CHECK: Resource [[CB0:[0-9]+]]: ; CHECK: Binding: ; CHECK: Record ID: 0 @@ -133,7 +133,7 @@ define void @test_typedbuffer() { ; CHECK: CBuffer size: 4 %cb1 = call target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) - @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false) + @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) ; CHECK: Resource [[CB1:[0-9]+]]: ; CHECK: Binding: ; CHECK: Record ID: 1 diff --git a/llvm/test/CodeGen/DirectX/CreateHandle.ll b/llvm/test/CodeGen/DirectX/CreateHandle.ll index ce18f1e2b0c2f..c471fb07c26af 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandle.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandle.ll @@ -12,13 +12,20 @@ target triple = "dxil-pc-shadermodel6.0-compute" +@BufA.str = private unnamed_addr constant [5 x i8] c"BufA\00", align 1 +@BufB.str = private unnamed_addr constant [5 x i8] c"BufB\00", align 1 + +; make sure the string constants are removed from the module +; CHECK-NOT: private unnamed_addr constant [5 x i8] c"BufA\00", align 1 +; CHECK-NOT: private unnamed_addr constant [5 x i8] c"BufB\00", align 1 + declare i32 @some_val(); define void @test_buffers() { ; RWBuffer Buf : register(u5, space3) %typed0 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 3, i32 5, i32 1, i32 0, i1 false, ptr null) + i32 3, i32 5, i32 1, i32 0, i1 false, ptr @BufA.str) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 1, i32 1, i32 5, i1 false) #[[#ATTR:]] ; CHECK-NOT: @llvm.dx.cast.handle @@ -33,7 +40,7 @@ define void @test_buffers() { ; Note that the index below is 3 + 4 = 7 %typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0_0t( - i32 5, i32 3, i32 24, i32 4, i1 false, ptr null) + i32 5, i32 3, i32 24, i32 4, i1 false, ptr @BufB.str) ; CHECK: call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 3, i32 7, i1 false) #[[#ATTR]] ; struct S { float4 a; uint4 b; }; diff --git a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll index 7b07e6a7ebeab..4af5d41897512 100644 --- a/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll +++ b/llvm/test/CodeGen/DirectX/CreateHandleFromBinding.ll @@ -13,13 +13,20 @@ target triple = "dxil-pc-shadermodel6.6-compute" +@BufA.str = private unnamed_addr constant [5 x i8] c"BufA\00", align 1 +@BufB.str = private unnamed_addr constant [5 x i8] c"BufB\00", align 1 + +; make sure the string constants are removed from the module +; CHECK-NOT: private unnamed_addr constant [5 x i8] c"BufA\00", align 1 +; CHECK-NOT: private unnamed_addr constant [5 x i8] c"BufB\00", align 1 + declare i32 @some_val(); define void @test_bindings() { ; RWBuffer Buf : register(u5, space3) %typed0 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_v4f32_1_0_0( - i32 3, i32 5, i32 1, i32 0, i1 false, ptr null) + i32 3, i32 5, i32 1, i32 0, i1 false, ptr @BufA.str) ; CHECK: [[BUF0:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 5, i32 5, i32 3, i8 1 }, i32 5, i1 false) #[[#ATTR:]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF0]], %dx.types.ResourceProperties { i32 4106, i32 1033 }) #[[#ATTR]] @@ -35,7 +42,7 @@ define void @test_bindings() { ; Note that the index below is 3 + 4 = 7 %typed2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) @llvm.dx.resource.handlefrombinding.tdx.TypedBuffer_i32_0_0_0t( - i32 5, i32 3, i32 24, i32 4, i1 false, ptr null) + i32 5, i32 3, i32 24, i32 4, i1 false, ptr @BufB.str) ; CHECK: [[BUF2:%.*]] = call %dx.types.Handle @dx.op.createHandleFromBinding(i32 217, %dx.types.ResBind { i32 3, i32 26, i32 5, i8 0 }, i32 7, i1 false) #[[#ATTR]] ; CHECK: call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle [[BUF2]], %dx.types.ResourceProperties { i32 10, i32 1029 }) #[[#ATTR]] From 61c89451e042399fa1ff91bb6deef4351f27b1f4 Mon Sep 17 00:00:00 2001 From: Helena Kotas Date: Thu, 15 May 2025 20:17:37 -0700 Subject: [PATCH 4/7] update DirectXTests --- .../DirectX/ResourceBindingAnalysisTests.cpp | 42 +++++++++---------- .../DirectX/UniqueResourceFromUseTests.cpp | 12 +++--- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp b/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp index 9be4cc3045195..6cd0d9f4fc5e7 100644 --- a/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp +++ b/llvm/unittests/Target/DirectX/ResourceBindingAnalysisTests.cpp @@ -64,7 +64,7 @@ TEST_F(ResourceBindingAnalysisTest, TestTrivialCase) { StringRef Assembly = R"( define void @main() { entry: - %handle = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) + %handle = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ret void } )"; @@ -107,16 +107,16 @@ TEST_F(ResourceBindingAnalysisTest, TestManyBindings) { %__cblayout_CB = type <{ i32 }> define void @main() { entry: - %handleCB = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 4, 0)) @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false) - %handleA = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 20, i32 10, i32 5, i32 0, i1 false) - %handleB = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) - %handleC = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) - %handleD = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 5, i32 4, i1 false) - %handleE = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 2, i32 0, i1 false) - %handleS1 = call target("dx.Sampler", 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 5, i32 1, i32 0, i1 false) - %handleS2 = call target("dx.Sampler", 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 4, i32 1, i32 0, i1 false) + %handleCB = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 4, 0)) @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false, ptr null) + %handleA = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 20, i32 10, i32 5, i32 0, i1 false, ptr null) + %handleB = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) + %handleC = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) + %handleD = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 5, i32 4, i1 false, ptr null) + %handleE = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 2, i32 0, i1 false, ptr null) + %handleS1 = call target("dx.Sampler", 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 5, i32 1, i32 0, i1 false, ptr null) + %handleS2 = call target("dx.Sampler", 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 4, i32 1, i32 0, i1 false, ptr null) ; duplicate binding for the same resource - %handleD2 = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 5, i32 4, i1 false) + %handleD2 = call target("dx.RawBuffer", i32, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 5, i32 4, i1 false, ptr null) ret void } )"; @@ -170,10 +170,10 @@ TEST_F(ResourceBindingAnalysisTest, TestUnboundedAndOverlap) { %__cblayout_CB = type <{ i32 }> define void @main() { entry: - %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 -1, i32 10, i1 false) - %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 3, i32 0, i1 false) - %handleC = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 0, i32 -1, i32 100, i1 false) - %handleD = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 4, i32 1, i32 0, i1 false) + %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 -1, i32 10, i1 false, ptr null) + %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 3, i32 0, i1 false, ptr null) + %handleC = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 0, i32 -1, i32 100, i1 false, ptr null) + %handleD = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 4, i32 1, i32 0, i1 false, ptr null) ret void } )"; @@ -201,8 +201,8 @@ TEST_F(ResourceBindingAnalysisTest, TestExactOverlap) { %__cblayout_CB = type <{ i32 }> define void @main() { entry: - %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) - %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false) + %handleA = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) + %handleB = call target("dx.RawBuffer", float, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) ret void } )"; @@ -235,9 +235,9 @@ TEST_F(ResourceBindingAnalysisTest, TestEndOfRange) { %__cblayout_CB = type <{ i32 }> define void @main() { entry: - %handleA = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 -1, i32 1, i32 0, i1 false) - %handleB = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 -10, i32 10, i32 50, i1 false) - %handleC = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 2147483647, i32 10, i32 100, i1 false) + %handleA = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 0, i32 -1, i32 1, i32 0, i1 false, ptr null) + %handleB = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 -10, i32 10, i32 50, i1 false, ptr null) + %handleC = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 2, i32 2147483647, i32 10, i32 100, i1 false, ptr null) ret void } )"; @@ -267,8 +267,8 @@ TEST_F(ResourceBindingAnalysisTest, TestImplicitFlag) { StringRef Assembly = R"( define void @main() { entry: - %handleA = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 100, i32 5, i32 1, i32 0, i1 false) - %handleB = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefromimplicitbinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %handleA = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefrombinding(i32 100, i32 5, i32 1, i32 0, i1 false, ptr null) + %handleB = call target("dx.TypedBuffer", float, 1, 0, 0) @llvm.dx.resource.handlefromimplicitbinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) ret void } )"; diff --git a/llvm/unittests/Target/DirectX/UniqueResourceFromUseTests.cpp b/llvm/unittests/Target/DirectX/UniqueResourceFromUseTests.cpp index 249e1045b847f..160a91579b202 100644 --- a/llvm/unittests/Target/DirectX/UniqueResourceFromUseTests.cpp +++ b/llvm/unittests/Target/DirectX/UniqueResourceFromUseTests.cpp @@ -59,7 +59,7 @@ TEST_F(UniqueResourceFromUseTest, TestResourceCounterDecrement) { StringRef Assembly = R"( define void @main() { entry: - %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false) + %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1) @@ -89,7 +89,7 @@ TEST_F(UniqueResourceFromUseTest, TestResourceCounterIncrement) { StringRef Assembly = R"( define void @main() { entry: - %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false) + %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 1) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 1) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 1) @@ -119,7 +119,7 @@ TEST_F(UniqueResourceFromUseTest, TestResourceCounterUnknown) { StringRef Assembly = R"( define void @main() { entry: - %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false) + %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false, ptr null) ret void } )"; @@ -146,8 +146,8 @@ TEST_F(UniqueResourceFromUseTest, TestResourceCounterMultiple) { StringRef Assembly = R"( define void @main() { entry: - %handle1 = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false) - %handle2 = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 4, i32 3, i32 2, i32 1, i1 false) + %handle1 = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false, ptr null) + %handle2 = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 4, i32 3, i32 2, i32 1, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle1, i8 -1) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle2, i8 1) ret void @@ -182,7 +182,7 @@ TEST_F(UniqueResourceFromUseTest, TestResourceCounterInvalid) { StringRef Assembly = R"( define void @main() { entry: - %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false) + %handle = call target("dx.RawBuffer", float, 1, 0) @llvm.dx.resource.handlefrombinding(i32 1, i32 2, i32 3, i32 4, i1 false, ptr null) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 -1) call i32 @llvm.dx.resource.updatecounter(target("dx.RawBuffer", float, 1, 0) %handle, i8 1) ret void From a73cdb9288a0f325d4c03a58daf6803e8d8d2ddf Mon Sep 17 00:00:00 2001 From: Helena Kotas Date: Mon, 19 May 2025 14:55:18 -0700 Subject: [PATCH 5/7] [DirectX] Gather resource names in resource analysis --- llvm/include/llvm/Analysis/DXILResource.h | 17 +++-- llvm/lib/Analysis/DXILResource.cpp | 35 ++++++++- .../DXILResource/buffer-frombinding.ll | 39 +++++++--- llvm/unittests/Analysis/DXILResourceTest.cpp | 73 ++++++++----------- 4 files changed, 101 insertions(+), 63 deletions(-) diff --git a/llvm/include/llvm/Analysis/DXILResource.h b/llvm/include/llvm/Analysis/DXILResource.h index b6efd82bb308e..a274e2294561e 100644 --- a/llvm/include/llvm/Analysis/DXILResource.h +++ b/llvm/include/llvm/Analysis/DXILResource.h @@ -16,9 +16,7 @@ #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/PassManager.h" #include "llvm/Pass.h" -#include "llvm/Support/Alignment.h" #include "llvm/Support/DXILABI.h" -#include #include namespace llvm { @@ -32,6 +30,10 @@ class DXILResourceTypeMap; namespace dxil { +// Returns the resource name from dx_resource_handlefrombinding or +// dx_resource_handlefromimplicitbinding call +StringRef getResourceNameFromBindingCall(CallInst *CI); + /// The dx.RawBuffer target extension type /// /// `target("dx.RawBuffer", Type, IsWriteable, IsROV)` @@ -358,6 +360,7 @@ class ResourceInfo { private: ResourceBinding Binding; TargetExtType *HandleTy; + StringRef Name; GlobalVariable *Symbol = nullptr; public: @@ -365,10 +368,10 @@ class ResourceInfo { ResourceCounterDirection CounterDirection = ResourceCounterDirection::Unknown; ResourceInfo(uint32_t RecordID, uint32_t Space, uint32_t LowerBound, - uint32_t Size, TargetExtType *HandleTy, + uint32_t Size, TargetExtType *HandleTy, StringRef Name = "", GlobalVariable *Symbol = nullptr) : Binding{RecordID, Space, LowerBound, Size}, HandleTy(HandleTy), - Symbol(Symbol) {} + Name(Name), Symbol(Symbol) {} void setBindingID(unsigned ID) { Binding.RecordID = ID; } @@ -378,10 +381,12 @@ class ResourceInfo { const ResourceBinding &getBinding() const { return Binding; } TargetExtType *getHandleTy() const { return HandleTy; } - StringRef getName() const { return Symbol ? Symbol->getName() : ""; } + const StringRef getName() const { + return Name.empty() ? (Symbol ? Symbol->getName() : "") : Name; + } bool hasSymbol() const { return Symbol; } - GlobalVariable *createSymbol(Module &M, StructType *Ty, StringRef Name = ""); + GlobalVariable *createSymbol(Module &M, StructType *Ty); MDTuple *getAsMetadata(Module &M, dxil::ResourceTypeInfo &RTI) const; std::pair diff --git a/llvm/lib/Analysis/DXILResource.cpp b/llvm/lib/Analysis/DXILResource.cpp index 36b3901246285..8cc9316dfb667 100644 --- a/llvm/lib/Analysis/DXILResource.cpp +++ b/llvm/lib/Analysis/DXILResource.cpp @@ -21,7 +21,6 @@ #include "llvm/IR/Module.h" #include "llvm/InitializePasses.h" #include "llvm/Support/FormatVariadic.h" -#include #include #include @@ -531,8 +530,7 @@ void ResourceTypeInfo::print(raw_ostream &OS, const DataLayout &DL) const { } } -GlobalVariable *ResourceInfo::createSymbol(Module &M, StructType *Ty, - StringRef Name) { +GlobalVariable *ResourceInfo::createSymbol(Module &M, StructType *Ty) { assert(!Symbol && "Symbol has already been created"); Symbol = new GlobalVariable(M, Ty, /*isConstant=*/true, GlobalValue::ExternalLinkage, @@ -659,6 +657,9 @@ ResourceInfo::getAnnotateProps(Module &M, dxil::ResourceTypeInfo &RTI) const { void ResourceInfo::print(raw_ostream &OS, dxil::ResourceTypeInfo &RTI, const DataLayout &DL) const { + if (!Name.empty()) + OS << " Name: " << Name << "\n"; + if (Symbol) { OS << " Symbol: "; Symbol->printAsOperand(OS); @@ -706,6 +707,29 @@ static bool isUpdateCounterIntrinsic(Function &F) { return F.getIntrinsicID() == Intrinsic::dx_resource_updatecounter; } +StringRef dxil::getResourceNameFromBindingCall(CallInst *CI) { + Value *Op = nullptr; + switch (CI->getCalledFunction()->getIntrinsicID()) { + default: + return ""; + case Intrinsic::dx_resource_handlefrombinding: + case Intrinsic::dx_resource_handlefromimplicitbinding: + Op = CI->getArgOperand(5); + break; + } + StringRef Name; + if (auto *GV = dyn_cast(Op)) { + auto *CA = dyn_cast(GV->getInitializer()); + if (CA && CA->isString()) { + Name = CA->getAsString(); + // strip trailing 0 + if (Name.ends_with('\0')) + Name = Name.drop_back(1); + } + } + return Name; +} + void DXILResourceMap::populateResourceInfos(Module &M, DXILResourceTypeMap &DRTM) { SmallVector> CIToInfos; @@ -731,8 +755,11 @@ void DXILResourceMap::populateResourceInfos(Module &M, cast(CI->getArgOperand(1))->getZExtValue(); uint32_t Size = cast(CI->getArgOperand(2))->getZExtValue(); + StringRef Name = getResourceNameFromBindingCall(CI); + ResourceInfo RI = - ResourceInfo{/*RecordID=*/0, Space, LowerBound, Size, HandleTy}; + ResourceInfo{/*RecordID=*/0, Space, LowerBound, + Size, HandleTy, Name}; CIToInfos.emplace_back(CI, RI, RTI); } diff --git a/llvm/test/Analysis/DXILResource/buffer-frombinding.ll b/llvm/test/Analysis/DXILResource/buffer-frombinding.ll index efacff71ee127..6c8476617e693 100644 --- a/llvm/test/Analysis/DXILResource/buffer-frombinding.ll +++ b/llvm/test/Analysis/DXILResource/buffer-frombinding.ll @@ -2,11 +2,22 @@ @G = external constant <4 x float>, align 4 +@Zero.str = private unnamed_addr constant [5 x i8] c"Zero\00", align 1 +@One.str = private unnamed_addr constant [4 x i8] c"One\00", align 1 +@Two.str = private unnamed_addr constant [4 x i8] c"Two\00", align 1 +@Three.str = private unnamed_addr constant [6 x i8] c"Three\00", align 1 +@Four.str = private unnamed_addr constant [5 x i8] c"Four\00", align 1 +@Array.str = private unnamed_addr constant [6 x i8] c"Array\00", align 1 +@Five.str = private unnamed_addr constant [5 x i8] c"Five\00", align 1 +@CB.str = private unnamed_addr constant [3 x i8] c"CB\00", align 1 +@Constants.str = private unnamed_addr constant [10 x i8] c"Constants\00", align 1 + define void @test_typedbuffer() { ; ByteAddressBuffer Buf : register(t8, space1) %srv0 = call target("dx.RawBuffer", void, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false, ptr @Zero.str) ; CHECK: Resource [[SRV0:[0-9]+]]: + ; CHECK: Name: Zero ; CHECK: Binding: ; CHECK: Record ID: 0 ; CHECK: Space: 1 @@ -18,8 +29,9 @@ define void @test_typedbuffer() { ; struct S { float4 a; uint4 b; }; ; StructuredBuffer Buf : register(t2, space4) %srv1 = call target("dx.RawBuffer", {<4 x float>, <4 x i32>}, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 4, i32 2, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 4, i32 2, i32 1, i32 0, i1 false, ptr @One.str) ; CHECK: Resource [[SRV1:[0-9]+]]: + ; CHECK: Name: One ; CHECK: Binding: ; CHECK: Record ID: 1 ; CHECK: Space: 4 @@ -32,8 +44,9 @@ define void @test_typedbuffer() { ; Buffer Buf[24] : register(t3, space5) %srv2 = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 5, i32 3, i32 24, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 5, i32 3, i32 24, i32 0, i1 false, ptr @Two.str) ; CHECK: Resource [[SRV2:[0-9]+]]: + ; CHECK: Name: Two ; CHECK: Binding: ; CHECK: Record ID: 2 ; CHECK: Space: 5 @@ -46,8 +59,9 @@ define void @test_typedbuffer() { ; RWBuffer Buf : register(u7, space2) %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1) - @llvm.dx.resource.handlefrombinding(i32 2, i32 7, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 2, i32 7, i32 1, i32 0, i1 false, ptr @Three.str) ; CHECK: Resource [[UAV0:[0-9]+]]: + ; CHECK: Name: Three ; CHECK: Binding: ; CHECK: Record ID: 0 ; CHECK: Space: 2 @@ -63,9 +77,10 @@ define void @test_typedbuffer() { ; RWBuffer Buf : register(u5, space3) %uav1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 5, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 3, i32 5, i32 1, i32 0, i1 false, ptr @Four.str) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav1, i8 -1) ; CHECK: Resource [[UAV1:[0-9]+]]: + ; CHECK: Name: Four ; CHECK: Binding: ; CHECK: Record ID: 1 ; CHECK: Space: 3 @@ -82,12 +97,13 @@ define void @test_typedbuffer() { ; RWBuffer BufferArray[10] : register(u0, space4) ; RWBuffer Buf = BufferArray[0] %uav2_1 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 0, i1 false, ptr @Array.str) ; RWBuffer Buf = BufferArray[5] %uav2_2 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 5, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 4, i32 0, i32 10, i32 5, i1 false, ptr @Array.str) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav2_2, i8 1) ; CHECK: Resource [[UAV2:[0-9]+]]: + ; CHECK: Name: Array ; CHECK: Binding: ; CHECK: Record ID: 2 ; CHECK: Space: 4 @@ -103,10 +119,11 @@ define void @test_typedbuffer() { ; RWBuffer Buf : register(u0, space5) %uav3 = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 5, i32 0, i32 1, i32 0, i1 false, ptr @Five.str) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 -1) call i32 @llvm.dx.resource.updatecounter(target("dx.TypedBuffer", <4 x float>, 1, 0, 0) %uav3, i8 1) ; CHECK: Resource [[UAV3:[0-9]+]]: + ; CHECK: Name: Five ; CHECK: Binding: ; CHECK: Record ID: 3 ; CHECK: Space: 5 @@ -121,8 +138,9 @@ define void @test_typedbuffer() { ; CHECK: Element Count: 4 %cb0 = call target("dx.CBuffer", {float}) - @llvm.dx.resource.handlefrombinding(i32 1, i32 0, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 1, i32 0, i32 1, i32 0, i1 false, ptr @CB.str) ; CHECK: Resource [[CB0:[0-9]+]]: + ; CHECK: Name: CB ; CHECK: Binding: ; CHECK: Record ID: 0 ; CHECK: Space: 1 @@ -133,8 +151,9 @@ define void @test_typedbuffer() { ; CHECK: CBuffer size: 4 %cb1 = call target("dx.CBuffer", target("dx.Layout", {float}, 4, 0)) - @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 1, i32 8, i32 1, i32 0, i1 false, ptr @Constants.str) ; CHECK: Resource [[CB1:[0-9]+]]: + ; CHECK: Name: Constants ; CHECK: Binding: ; CHECK: Record ID: 1 ; CHECK: Space: 1 diff --git a/llvm/unittests/Analysis/DXILResourceTest.cpp b/llvm/unittests/Analysis/DXILResourceTest.cpp index 669f849bbaa97..f6d6ddf9cbb2d 100644 --- a/llvm/unittests/Analysis/DXILResourceTest.cpp +++ b/llvm/unittests/Analysis/DXILResourceTest.cpp @@ -101,9 +101,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "Buffer"); + RTI.getHandleTy(), "Buffer"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000000bU, 0U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "Buffer", 0, 0, 1, 11, 0, nullptr)); @@ -119,9 +118,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/1, /*Space=*/2, /*LowerBound=*/3, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "BufferOut"); + RTI.getHandleTy(), "BufferOut"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000100bU, 0U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(1, GV, "BufferOut", 2, 3, 1, 11, false, false, false, @@ -146,9 +144,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "Buffer0"); + RTI.getHandleTy(), "Buffer0"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000030cU, 0x00000010U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "Buffer0", 0, 0, 1, 12, 0, TestMD.get(1, 16))); @@ -166,9 +163,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/1, /*Space=*/0, /*LowerBound=*/1, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "Buffer1"); + RTI.getHandleTy(), "Buffer1"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000000cU, 0x0000000cU); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(1, GV, "Buffer1", 0, 1, 1, 12, 0, TestMD.get(1, 12))); @@ -188,9 +184,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/2, /*Space=*/0, /*LowerBound=*/2, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "ColorMapTexture"); + RTI.getHandleTy(), "ColorMapTexture"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x00000002U, 0x00000409U); EXPECT_MDEQ( RI.getAsMetadata(M, RTI), @@ -213,9 +208,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "DepthBuffer"); + RTI.getHandleTy(), "DepthBuffer"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x00000003U, 0x00080109U); EXPECT_MDEQ( RI.getAsMetadata(M, RTI), @@ -235,9 +229,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "feedbackMinMip"); + RTI.getHandleTy(), "feedbackMinMip"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x00001011U, 0U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "feedbackMinMip", 0, 0, 1, 17, false, false, @@ -257,9 +250,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "feedbackMipRegion"); + RTI.getHandleTy(), "feedbackMipRegion"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x00001012U, 0x00000001U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "feedbackMipRegion", 0, 0, 1, 18, false, @@ -280,10 +272,9 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/2, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); + RTI.getHandleTy(), "OutputTexture"); RI.GloballyCoherent = true; - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "OutputTexture"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x00005002U, 0x00000204U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "OutputTexture", 2, 0, 1, 2, true, false, @@ -308,8 +299,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct(), "ROB"); + RTI.getHandleTy(), "ROB"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000300aU, 0x00000409U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "ROB", 0, 0, 1, 10, false, false, true, @@ -334,10 +325,9 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/2, /*Size=*/1, - RTI.getHandleTy()); + RTI.getHandleTy(), "g_OutputBuffer"); RI.CounterDirection = ResourceCounterDirection::Increment; - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "g_OutputBuffer"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000920cU, 0x00000014U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "g_OutputBuffer", 0, 2, 1, 12, false, true, @@ -364,9 +354,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "g_rw_t2dmsa"); + RTI.getHandleTy(), "g_rw_t2dmsa"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x00001008U, 0x00080105U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "g_rw_t2dmsa", 0, 0, 1, 8, false, false, @@ -388,8 +377,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct(), ""); + RTI.getHandleTy(), ""); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000000dU, 0x00000020U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "", 0, 0, 1, 32, nullptr)); @@ -406,9 +395,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "ColorMapSampler"); + RTI.getHandleTy(), "ColorMapSampler"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000000eU, 0U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "ColorMapSampler", 0, 0, 1, 0, nullptr)); @@ -424,9 +412,8 @@ TEST(DXILResource, AnnotationsAndMetadata) { ResourceInfo RI( /*RecordID=*/0, /*Space=*/0, /*LowerBound=*/0, /*Size=*/1, - RTI.getHandleTy()); - GlobalVariable *GV = - RI.createSymbol(M, RTI.createElementStruct(), "CmpSampler"); + RTI.getHandleTy(), "CmpSampler"); + GlobalVariable *GV = RI.createSymbol(M, RTI.createElementStruct()); EXPECT_PROPS_EQ(RI.getAnnotateProps(M, RTI), 0x0000800eU, 0U); EXPECT_MDEQ(RI.getAsMetadata(M, RTI), TestMD.get(0, GV, "CmpSampler", 0, 0, 1, 1, nullptr)); From 0dc74a35fe2c774d8d3de847fe4272363b38ff85 Mon Sep 17 00:00:00 2001 From: Helena Kotas Date: Mon, 19 May 2025 15:18:09 -0700 Subject: [PATCH 6/7] [DirectX] Use resource names in DXIL metadata pass --- llvm/lib/Analysis/DXILResource.cpp | 2 +- .../DirectX/Metadata/cbuffer_metadata.ll | 38 ++--- .../DirectX/Metadata/resource-symbols.ll | 11 +- .../CodeGen/DirectX/Metadata/srv_metadata.ll | 105 +++++++------- .../CodeGen/DirectX/Metadata/uav_metadata.ll | 133 +++++++++--------- 5 files changed, 150 insertions(+), 139 deletions(-) diff --git a/llvm/lib/Analysis/DXILResource.cpp b/llvm/lib/Analysis/DXILResource.cpp index 8cc9316dfb667..f642603306713 100644 --- a/llvm/lib/Analysis/DXILResource.cpp +++ b/llvm/lib/Analysis/DXILResource.cpp @@ -559,7 +559,7 @@ MDTuple *ResourceInfo::getAsMetadata(Module &M, MDVals.push_back(getIntMD(Binding.RecordID)); assert(Symbol && "Cannot yet create useful resource metadata without symbol"); MDVals.push_back(ValueAsMetadata::get(Symbol)); - MDVals.push_back(MDString::get(Ctx, Symbol->getName())); + MDVals.push_back(MDString::get(Ctx, Name)); MDVals.push_back(getIntMD(Binding.Space)); MDVals.push_back(getIntMD(Binding.LowerBound)); MDVals.push_back(getIntMD(Binding.Size)); diff --git a/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll index 8eda78c1d1c42..7f878c9be63f2 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/cbuffer_metadata.ll @@ -7,20 +7,23 @@ target triple = "dxil-pc-shadermodel6.6-compute" %__cblayout_CB1 = type <{ float, i32, double, <2 x i32> }> @CB1.cb = global target("dx.CBuffer", target("dx.Layout", %__cblayout_CB1, 24, 0, 4, 8, 16)) poison +@CB1.str = private unnamed_addr constant [4 x i8] c"CB1\00", align 1 %__cblayout_CB2 = type <{ float, double, float, half, i16, i64, i32 }> @CB2.cb = global target("dx.CBuffer", target("dx.Layout", %__cblayout_CB2, 36, 0, 8, 16, 20, 22, 24, 32)) poison +@CB2.str = private unnamed_addr constant [4 x i8] c"CB2\00", align 1 -%__cblayout_CB3 = type <{ double, <3 x float>, float, <3 x double>, half, <2 x double>, float, <3 x half>, <3 x half> }> -@CB3.cb = global target("dx.CBuffer", target("dx.Layout", %__cblayout_CB3, 96, 0, 16, 28, 32, 56, 64, 80, 84, 90)) poison +%__cblayout_MyConstants = type <{ double, <3 x float>, float, <3 x double>, half, <2 x double>, float, <3 x half>, <3 x half> }> +@MyConstants.cb = global target("dx.CBuffer", target("dx.Layout", %__cblayout_MyConstants, 96, 0, 16, 28, 32, 56, 64, 80, 84, 90)) poison +@MyConstants.str = private unnamed_addr constant [12 x i8] c"MyConstants\00", align 1 ; PRINT:; Resource Bindings: ; PRINT-NEXT:; ; PRINT-NEXT:; Name Type Format Dim ID HLSL Bind Count ; PRINT-NEXT:; ------------------------------ ---------- ------- ----------- ------- -------------- ------ -; PRINT-NEXT:; cbuffer NA NA CB0 cb0 1 -; PRINT-NEXT:; cbuffer NA NA CB1 cb1 1 -; PRINT-NEXT:; cbuffer NA NA CB2 cb5,space15 1 +; PRINT-NEXT:; CB1 cbuffer NA NA CB0 cb0 1 +; PRINT-NEXT:; CB2 cbuffer NA NA CB1 cb1 1 +; PRINT-NEXT:; MyConstants cbuffer NA NA CB2 cb5,space15 1 define void @test() #0 { @@ -31,9 +34,7 @@ define void @test() #0 { ; int2 d; ; } %CB1.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB1, 24, 0, 4, 8, 16)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) - store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB1, 24, 0, 4, 8, 16)) %CB1.cb_h, ptr @CB1.cb, align 4 - + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr @CB1.str) ; cbuffer CB2 : register(b0) { ; float a; ; double b; @@ -45,9 +46,7 @@ define void @test() #0 { ;} %CB2.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB2, 36, 0, 8, 16, 20, 22, 24, 32)) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) - store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB2, 36, 0, 8, 16, 20, 22, 24, 32)) %CB2.cb_h, ptr @CB2.cb, align 4 - + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr @CB2.str) ; cbuffer CB3 : register(b5) { ; double B0; ; float3 B1; @@ -59,19 +58,22 @@ define void @test() #0 { ; half3 B7; ; half3 B8; ; } - %CB3.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB3, 96, 0, 16, 28, 32, 56, 64, 80, 84, 90)) - @llvm.dx.resource.handlefrombinding(i32 15, i32 5, i32 1, i32 0, i1 false, ptr null) - store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB3, 96, 0, 16, 28, 32, 56, 64, 80, 84, 90)) %CB3.cb_h, ptr @CB3.cb, align 4 + %CB3.cb_h = call target("dx.CBuffer", target("dx.Layout", %__cblayout_MyConstants, 96, 0, 16, 28, 32, 56, 64, 80, 84, 90)) + @llvm.dx.resource.handlefrombinding(i32 15, i32 5, i32 1, i32 0, i1 false, ptr @MyConstants.str) ret void } attributes #0 = { noinline nounwind "hlsl.shader"="compute" } +; CHECK: @CB1 = external constant %cbuffer +; CHECK: @CB2 = external constant %cbuffer.0 +; CHECK: @MyConstants = external constant %cbuffer.1 + ; CHECK: !dx.resources = !{[[ResList:[!][0-9]+]]} ; CHECK: [[ResList]] = !{null, null, [[CBList:[!][0-9]+]], null} -; CHECK: [[CBList]] = !{![[CB1:[0-9]+]], ![[CB2:[0-9]+]], ![[CB3:[0-9]+]]} -; CHECK: ![[CB1]] = !{i32 0, ptr @0, !"", i32 0, i32 0, i32 1, i32 24, null} -; CHECK: ![[CB2]] = !{i32 1, ptr @1, !"", i32 0, i32 1, i32 1, i32 36, null} -; CHECK: ![[CB3]] = !{i32 2, ptr @2, !"", i32 15, i32 5, i32 1, i32 96, null} +; CHECK: [[CBList]] = !{![[CB1:[0-9]+]], ![[CB2:[0-9]+]], ![[MYCONSTANTS:[0-9]+]]} +; CHECK: ![[CB1]] = !{i32 0, ptr @CB1, !"CB1", i32 0, i32 0, i32 1, i32 24, null} +; CHECK: ![[CB2]] = !{i32 1, ptr @CB2, !"CB2", i32 0, i32 1, i32 1, i32 36, null} +; CHECK: ![[MYCONSTANTS]] = !{i32 2, ptr @MyConstants, !"MyConstants", i32 15, i32 5, i32 1, i32 96, null} diff --git a/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll b/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll index f4dbea6cffbed..f2edcb37513e9 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/resource-symbols.ll @@ -2,12 +2,15 @@ target triple = "dxil-pc-shadermodel6.6-compute" +@A.str = private unnamed_addr constant [2 x i8] c"A\00", align 1 +@SB.str = private unnamed_addr constant [3 x i8] c"SB\00", align 1 + %struct.S = type { <4 x float>, <4 x i32> } define void @test() { ; Buffer %float4 = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr @A.str) ; CHECK: %TypedBuffer = type { <4 x float> } ; Buffer @@ -22,7 +25,7 @@ define void @test() { ; StructuredBuffer %struct0 = call target("dx.RawBuffer", %struct.S, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 10, i32 1, i32 0, i1 true, ptr null) + @llvm.dx.resource.handlefrombinding(i32 0, i32 10, i32 1, i32 0, i1 true, ptr @SB.str) ; CHECK: %StructuredBuffer = type { %struct.S } ; ByteAddressBuffer @@ -39,10 +42,10 @@ define void @test() { ; CHECK-NEXT: @[[S0:.*]] = external constant %StructuredBuffer ; CHECK-NEXT: @[[B0:.*]] = external constant %ByteAddressBuffer -; CHECK: !{i32 0, ptr @[[T0]], !"" +; CHECK: !{i32 0, ptr @[[T0]], !"A" ; CHECK: !{i32 1, ptr @[[T1]], !"" ; CHECK: !{i32 2, ptr @[[T2]], !"" -; CHECK: !{i32 3, ptr @[[S0]], !"" +; CHECK: !{i32 3, ptr @[[S0]], !"SB" ; CHECK: !{i32 4, ptr @[[B0]], !"" attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) } diff --git a/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll index 3b01b87a0533b..4740dc4497595 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll @@ -5,103 +5,108 @@ target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64" target triple = "dxil-pc-shadermodel6.6-compute" -%"class.hlsl::Buffer" = type { target("dx.TypedBuffer", <4 x half>, 0, 0, 0) } -%"class.hlsl::Buffer.1" = type { target("dx.TypedBuffer", <2 x float>, 0, 0, 0) } -%"class.hlsl::Buffer.2" = type { target("dx.TypedBuffer", double, 0, 0, 0) } -%"class.hlsl::Buffer.3" = type { target("dx.TypedBuffer", i32, 0, 0, 1) } -%"class.hlsl::ByteAddressBuffer" = type { target("dx.RawBuffer", i8, 0, 0) } -%"class.hlsl::StructuredBuffer" = type { target("dx.RawBuffer", i16, 0, 0) } -%"class.hlsl::Buffer.4" = type { target("dx.TypedBuffer", i64, 0, 0, 0) } - -@Zero = internal global %"class.hlsl::Buffer" poison, align 4 -@One = internal global %"class.hlsl::Buffer.1" poison, align 4 -@Two = internal global %"class.hlsl::Buffer.2" poison, align 4 -@Three = internal global %"class.hlsl::Buffer.3" poison, align 4 -@Four = internal global %"class.hlsl::ByteAddressBuffer" poison, align 4 -@Five = internal global %"class.hlsl::StructuredBuffer" poison, align 4 -@Six = internal global %"class.hlsl::Buffer.4" poison, align 4 +@Zero.str = private unnamed_addr constant [5 x i8] c"Zero\00", align 1 +@One.str = private unnamed_addr constant [4 x i8] c"One\00", align 1 +@Two.str = private unnamed_addr constant [4 x i8] c"Two\00", align 1 +@Three.str = private unnamed_addr constant [6 x i8] c"Three\00", align 1 +@Four.str = private unnamed_addr constant [5 x i8] c"Four\00", align 1 +@Five.str = private unnamed_addr constant [5 x i8] c"Five\00", align 1 +@Six.str = private unnamed_addr constant [4 x i8] c"Six\00", align 1 +@Seven.str = private unnamed_addr constant [6 x i8] c"Seven\00", align 1 +@Array.str = private unnamed_addr constant [6 x i8] c"Array\00", align 1 ; PRINT:; Resource Bindings: ; PRINT-NEXT:; ; PRINT-NEXT:; Name Type Format Dim ID HLSL Bind Count ; PRINT-NEXT:; ------------------------------ ---------- ------- ----------- ------- -------------- ------ -; PRINT-NEXT:; texture f16 buf T0 t0 1 -; PRINT-NEXT:; texture f32 buf T1 t1 1 -; PRINT-NEXT:; texture f64 buf T2 t2 1 -; PRINT-NEXT:; texture i32 buf T3 t3 1 -; PRINT-NEXT:; texture byte r/o T4 t5 1 -; PRINT-NEXT:; texture struct r/o T5 t6 1 -; PRINT-NEXT:; texture u64 buf T6 t10,space2 1 -; PRINT-NEXT:; texture f32 buf T7 t4,space3 100 +; PRINT-NEXT:; Zero texture f16 buf T0 t0 1 +; PRINT-NEXT:; One texture f32 buf T1 t1 1 +; PRINT-NEXT:; Two texture f64 buf T2 t2 1 +; PRINT-NEXT:; Three texture i32 buf T3 t3 1 +; PRINT-NEXT:; Four texture byte r/o T4 t5 1 +; PRINT-NEXT:; Five texture struct r/o T5 t6 1 +; PRINT-NEXT:; Six texture u64 buf T6 t10,space2 1 +; PRINT-NEXT:; Array texture f32 buf T7 t4,space3 100 +; PRINT-NEXT:; Seven texture u64 buf T8 t20,space5 1 +; define void @test() #0 { - ; Buffer Buf : register(t0) + ; Buffer Zero : register(t0) %Zero_h = call target("dx.TypedBuffer", <4 x half>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", <4 x half>, 0, 0, 0) %Zero_h, ptr @Zero, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr @Zero.str) - ; Buffer Buf : register(t1) + ; Buffer One : register(t1) %One_h = call target("dx.TypedBuffer", <2 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", <2 x float>, 0, 0, 0) %One_h, ptr @One, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr @One.str) ; Buffer Two : register(t2); %Two_h = call target("dx.TypedBuffer", double, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", double, 0, 0, 0) %Two_h, ptr @Two, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr @Two.str) ; Buffer Three : register(t3); %Three_h = call target("dx.TypedBuffer", <4 x i32>, 0, 0, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", <4 x i32>, 0, 0, 1) %Three_h, ptr @Three, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false, ptr @Three.str) ; ByteAddressBuffer Four : register(t4) %Four_h = call target("dx.RawBuffer", i8, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) - store target("dx.RawBuffer", i8, 0, 0) %Four_h, ptr @Four, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr @Four.str) ; StructuredBuffer Five : register(t6); %Five_h = call target("dx.RawBuffer", i16, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false, ptr null) - store target("dx.RawBuffer", i16, 0, 0) %Five_h, ptr @Five, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false, ptr @Five.str) ; Buffer Six : register(t10, space2); %Six_h = call target("dx.TypedBuffer", i64, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", i64, 0, 0, 0) %Six_h, ptr @Six, align 4 + @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false, ptr @Six.str) + + ; Same buffer type as Six - should have the same type in metadata + ; Buffer Seven : register(t10, space2); + %Seven_h = call target("dx.TypedBuffer", i64, 0, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 5, i32 20, i32 1, i32 0, i1 false, ptr @Seven.str) ; Buffer Array[100] : register(t4, space3); ; Buffer B1 = Array[30]; ; Buffer B1 = Array[42]; ; resource array accesses should produce one metadata entry %Array_30_h = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false, ptr @Array.str) %Array_42_h = call target("dx.TypedBuffer", <4 x float>, 0, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false, ptr @Array.str) ret void } attributes #0 = { noinline nounwind "hlsl.shader"="compute" } +; CHECK: @Zero = external constant %TypedBuffer +; CHECK: @One = external constant %TypedBuffer.0 +; CHECK: @Two = external constant %TypedBuffer.1 +; CHECK: @Three = external constant %TypedBuffer.2 +; CHECK: @Four = external constant %ByteAddressBuffer +; CHECK: @Five = external constant %StructuredBuffer +; CHECK: @Six = external constant %TypedBuffer.3 +; CHECK: @Array = external constant %TypedBuffer.4 +; CHECK: @Seven = external constant %TypedBuffer.5 + ; CHECK: !dx.resources = !{[[ResList:[!][0-9]+]]} ; CHECK: [[ResList]] = !{[[SRVList:[!][0-9]+]], null, null, null} ; CHECK: [[SRVList]] = !{![[Zero:[0-9]+]], ![[One:[0-9]+]], ![[Two:[0-9]+]], ; CHECK-SAME: ![[Three:[0-9]+]], ![[Four:[0-9]+]], ![[Five:[0-9]+]], -; CHECK-SAME: ![[Six:[0-9]+]], ![[Array:[0-9]+]]} +; CHECK-SAME: ![[Six:[0-9]+]], ![[Array:[0-9]+]], ![[Seven:[0-9]+]]} -; CHECK: ![[Zero]] = !{i32 0, ptr @0, !"", i32 0, i32 0, i32 1, i32 10, i32 0, ![[Half:[0-9]+]]} +; CHECK: ![[Zero]] = !{i32 0, ptr @Zero, !"Zero", i32 0, i32 0, i32 1, i32 10, i32 0, ![[Half:[0-9]+]]} ; CHECK: ![[Half]] = !{i32 0, i32 8} -; CHECK: ![[One]] = !{i32 1, ptr @1, !"", i32 0, i32 1, i32 1, i32 10, i32 0, ![[Float:[0-9]+]]} +; CHECK: ![[One]] = !{i32 1, ptr @One, !"One", i32 0, i32 1, i32 1, i32 10, i32 0, ![[Float:[0-9]+]]} ; CHECK: ![[Float]] = !{i32 0, i32 9} -; CHECK: ![[Two]] = !{i32 2, ptr @2, !"", i32 0, i32 2, i32 1, i32 10, i32 0, ![[Double:[0-9]+]]} +; CHECK: ![[Two]] = !{i32 2, ptr @Two, !"Two", i32 0, i32 2, i32 1, i32 10, i32 0, ![[Double:[0-9]+]]} ; CHECK: ![[Double]] = !{i32 0, i32 10} -; CHECK: ![[Three]] = !{i32 3, ptr @3, !"", i32 0, i32 3, i32 1, i32 10, i32 0, ![[I32:[0-9]+]]} +; CHECK: ![[Three]] = !{i32 3, ptr @Three, !"Three", i32 0, i32 3, i32 1, i32 10, i32 0, ![[I32:[0-9]+]]} ; CHECK: ![[I32]] = !{i32 0, i32 4} -; CHECK: ![[Four]] = !{i32 4, ptr @4, !"", i32 0, i32 5, i32 1, i32 11, i32 0, null} -; CHECK: ![[Five]] = !{i32 5, ptr @5, !"", i32 0, i32 6, i32 1, i32 12, i32 0, ![[FiveStride:[0-9]+]]} +; CHECK: ![[Four]] = !{i32 4, ptr @Four, !"Four", i32 0, i32 5, i32 1, i32 11, i32 0, null} +; CHECK: ![[Five]] = !{i32 5, ptr @Five, !"Five", i32 0, i32 6, i32 1, i32 12, i32 0, ![[FiveStride:[0-9]+]]} ; CHECK: ![[FiveStride]] = !{i32 1, i32 2} -; CHECK: ![[Six]] = !{i32 6, ptr @6, !"", i32 2, i32 10, i32 1, i32 10, i32 0, ![[U64:[0-9]+]]} +; CHECK: ![[Six]] = !{i32 6, ptr @Six, !"Six", i32 2, i32 10, i32 1, i32 10, i32 0, ![[U64:[0-9]+]]} ; CHECK: ![[U64]] = !{i32 0, i32 7} -; CHECK: ![[Array]] = !{i32 7, ptr @7, !"", i32 3, i32 4, i32 100, i32 10, i32 0, ![[Float]]} +; CHECK: ![[Array]] = !{i32 7, ptr @Array, !"Array", i32 3, i32 4, i32 100, i32 10, i32 0, ![[Float]]} +; CHECK: ![[Seven]] = !{i32 8, ptr @Seven, !"Seven", i32 5, i32 20, i32 1, i32 10, i32 0, ![[U64]]} diff --git a/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll index 0cbc7ec5a10a0..8958d6a220d87 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll @@ -5,132 +5,133 @@ target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64" target triple = "dxil-pc-shadermodel6.6-compute" -%"class.hlsl::RWBuffer" = type { target("dx.TypedBuffer", <4 x half>, 1, 0, 0) } -%"class.hlsl::RWBuffer.1" = type { target("dx.TypedBuffer", <2 x float>, 1, 0, 0) } -%"class.hlsl::RWBuffer.2" = type { target("dx.TypedBuffer", double, 1, 0, 0) } -%"class.hlsl::RWBuffer.3" = type { target("dx.TypedBuffer", i32, 1, 0, 1) } -%"class.hlsl::RWByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 0) } -%"class.hlsl::RWStructuredBuffer" = type { target("dx.RawBuffer", i16, 1, 0) } -%"class.hlsl::RasterizerOrderedBuffer" = type { target("dx.TypedBuffer", <4 x i32>, 1, 1, 1) } -%"class.hlsl::RasterizerOrderedStructuredBuffer" = type { target("dx.RawBuffer", <4 x i32>, 1, 1) } -%"class.hlsl::RasterizerOrderedByteAddressBuffer" = type { target("dx.RawBuffer", i8, 1, 1) } -%"class.hlsl::RWBuffer.4" = type { target("dx.TypedBuffer", i64, 1, 0, 0) } - -@Zero = internal global %"class.hlsl::RWBuffer" poison, align 4 -@One = internal global %"class.hlsl::RWBuffer.1" poison, align 4 -@Two = internal global %"class.hlsl::RWBuffer.2" poison, align 4 -@Three = internal global %"class.hlsl::RWBuffer.3" poison, align 4 -@Four = internal global %"class.hlsl::RWByteAddressBuffer" poison, align 4 -@Five = internal global %"class.hlsl::RWStructuredBuffer" poison, align 4 -@Six = internal global %"class.hlsl::RasterizerOrderedBuffer" poison, align 4 -@Seven = internal global %"class.hlsl::RasterizerOrderedStructuredBuffer" poison, align 4 -@Eight = internal global %"class.hlsl::RasterizerOrderedByteAddressBuffer" poison, align 4 -@Nine = internal global %"class.hlsl::RWBuffer.4" poison, align 4 +@Zero.str = private unnamed_addr constant [5 x i8] c"Zero\00", align 1 +@One.str = private unnamed_addr constant [4 x i8] c"One\00", align 1 +@Two.str = private unnamed_addr constant [4 x i8] c"Two\00", align 1 +@Three.str = private unnamed_addr constant [6 x i8] c"Three\00", align 1 +@Four.str = private unnamed_addr constant [5 x i8] c"Four\00", align 1 +@Five.str = private unnamed_addr constant [5 x i8] c"Five\00", align 1 +@Six.str = private unnamed_addr constant [4 x i8] c"Six\00", align 1 +@Seven.str = private unnamed_addr constant [6 x i8] c"Seven\00", align 1 +@Eight.str = private unnamed_addr constant [6 x i8] c"Eight\00", align 1 +@Nine.str = private unnamed_addr constant [5 x i8] c"Nine\00", align 1 +@Ten.str = private unnamed_addr constant [4 x i8] c"Ten\00", align 1 +@Array.str = private unnamed_addr constant [6 x i8] c"Array\00", align 1 ; PRINT:; Resource Bindings: ; PRINT-NEXT:; ; PRINT-NEXT:; Name Type Format Dim ID HLSL Bind Count ; PRINT-NEXT:; ------------------------------ ---------- ------- ----------- ------- -------------- ------ -; PRINT-NEXT:; UAV f16 buf U0 u0 1 -; PRINT-NEXT:; UAV f32 buf U1 u1 1 -; PRINT-NEXT:; UAV f64 buf U2 u2 1 -; PRINT-NEXT:; UAV i32 buf U3 u3 1 -; 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 f32 buf U10 u4,space3 100 +; PRINT-NEXT:; Zero UAV f16 buf U0 u0 1 +; PRINT-NEXT:; One UAV f32 buf U1 u1 1 +; PRINT-NEXT:; Two UAV f64 buf U2 u2 1 +; PRINT-NEXT:; Three UAV i32 buf U3 u3 1 +; PRINT-NEXT:; Four UAV byte r/w U4 u5 1 +; PRINT-NEXT:; Five UAV struct r/w U5 u6 1 +; PRINT-NEXT:; Six UAV i32 buf U6 u7 1 +; PRINT-NEXT:; Seven UAV struct r/w U7 u8 1 +; PRINT-NEXT:; Eight UAV byte r/w U8 u9 1 +; PRINT-NEXT:; Nine UAV u64 buf U9 u10,space2 1 +; PRINT-NEXT:; Array UAV f32 buf U10 u4,space3 100 +; PRINT-NEXT:; Ten UAV u64 buf U11 u22,space5 1 define void @test() #0 { ; RWBuffer Zero : register(u0) %Zero_h = call target("dx.TypedBuffer", <4 x half>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", <4 x half>, 1, 0, 0) %Zero_h, ptr @Zero, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr @Zero.str) ; RWBuffer One : register(u1) %One_h = call target("dx.TypedBuffer", <2 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", <2 x float>, 1, 0, 0) %One_h, ptr @One, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 1, i32 1, i32 0, i1 false, ptr @One.str) ; RWBuffer Two : register(u2); %Two_h = call target("dx.TypedBuffer", double, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", double, 1, 0, 0) %Two_h, ptr @Two, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 2, i32 1, i32 0, i1 false, ptr @Two.str) ; RWBuffer Three : register(u3); %Three_h = call target("dx.TypedBuffer", <4 x i32>, 1, 0, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", <4 x i32>, 1, 0, 1) %Three_h, ptr @Three, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 3, i32 1, i32 0, i1 false, ptr @Three.str) ; ByteAddressBuffer Four : register(u5) %Four_h = call target("dx.RawBuffer", i8, 1, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr null) - store target("dx.RawBuffer", i8, 1, 0) %Four_h, ptr @Four, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 5, i32 1, i32 0, i1 false, ptr @Four.str) ; RWStructuredBuffer Five : register(u6); %Five_h = call target("dx.RawBuffer", i16, 1, 0) - @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false, ptr null) - store target("dx.RawBuffer", i16, 1, 0) %Five_h, ptr @Five, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 6, i32 1, i32 0, i1 false, ptr @Five.str) ; RasterizerOrderedBuffer Six : register(u7); %Six_h = call target("dx.TypedBuffer", <4 x i32>, 1, 1, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 7, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", <4 x i32>, 1, 1, 1) %Six_h, ptr @Six, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 7, i32 1, i32 0, i1 false, ptr @Six.str) ; RasterizerOrderedStructuredBuffer Seven : register(u3, space10); %Seven_h = call target("dx.RawBuffer", <4 x i32>, 1, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 8, i32 1, i32 0, i1 false, ptr null) - store target("dx.RawBuffer", <4 x i32>, 1, 1) %Seven_h, ptr @Seven, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 8, i32 1, i32 0, i1 false, ptr @Seven.str) ; RasterizerOrderedByteAddressBuffer Eight : register(u9); %Eight_h = call target("dx.RawBuffer", i8, 1, 1) - @llvm.dx.resource.handlefrombinding(i32 0, i32 9, i32 1, i32 0, i1 false, ptr null) - store target("dx.RawBuffer", i8, 1, 1) %Eight_h, ptr @Eight, align 4 + @llvm.dx.resource.handlefrombinding(i32 0, i32 9, i32 1, i32 0, i1 false, ptr @Eight.str) ; RWBuffer Nine : register(u2); %Nine_h = call target("dx.TypedBuffer", i64, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false, ptr null) - store target("dx.TypedBuffer", i64, 1, 0, 0) %Nine_h, ptr @Nine, align 4 + @llvm.dx.resource.handlefrombinding(i32 2, i32 10, i32 1, i32 0, i1 false, ptr @Nine.str) ; RWBuffer Array[100] : register(u4, space3); ; RWBuffer B1 = Array[30]; ; RWBuffer B1 = Array[42]; ; resource array accesses should produce one metadata entry %Array_30_h = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 30, i1 false, ptr @Array.str) %Array_42_h = call target("dx.TypedBuffer", <4 x float>, 1, 0, 0) - @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false, ptr null) + @llvm.dx.resource.handlefrombinding(i32 3, i32 4, i32 100, i32 42, i1 false, ptr @Array.str) + + ; Same buffer type as Nine + ; RWBuffer Ten : register(u2); + %Ten_h = call target("dx.TypedBuffer", i64, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 5, i32 22, i32 1, i32 0, i1 false, ptr @Ten.str) ret void } attributes #0 = { noinline nounwind "hlsl.shader"="compute" } +; CHECK: @Zero = external constant %RWTypedBuffer +; CHECK: @One = external constant %RWTypedBuffer.0 +; CHECK: @Two = external constant %RWTypedBuffer.1 +; CHECK: @Three = external constant %RWTypedBuffer.2 +; CHECK: @Four = external constant %RWByteAddressBuffer +; CHECK: @Five = external constant %RWStructuredBuffer +; CHECK: @Six = external constant %RasterizerOrderedTypedBuffer +; CHECK: @Seven = external constant %RasterizerOrderedStructuredBuffer +; CHECK: @Eight = external constant %RasterizerOrderedByteAddressBuffer +; CHECK: @Nine = external constant %RWTypedBuffer.3 +; CHECK: @Array = external constant %RWTypedBuffer.4 +; CHECK: @Ten = external constant %RWTypedBuffer.5 + ; CHECK: !dx.resources = !{[[ResList:[!][0-9]+]]} ; CHECK: [[ResList]] = !{null, [[UAVList:[!][0-9]+]], null, null} ; CHECK: [[UAVList]] = !{![[Zero:[0-9]+]], ![[One:[0-9]+]], ![[Two:[0-9]+]], ; CHECK-SAME: ![[Three:[0-9]+]], ![[Four:[0-9]+]], ![[Five:[0-9]+]], ; CHECK-SAME: ![[Six:[0-9]+]], ![[Seven:[0-9]+]], ![[Eight:[0-9]+]], -; CHECK-SAME: ![[Nine:[0-9]+]], ![[Array:[0-9]+]]} +; CHECK-SAME: ![[Nine:[0-9]+]], ![[Array:[0-9]+]], ![[Ten:[0-9]+]]} -; CHECK: ![[Zero]] = !{i32 0, ptr @0, !"", i32 0, i32 0, i32 1, i32 10, i1 false, i1 false, i1 false, ![[Half:[0-9]+]]} +; CHECK: ![[Zero]] = !{i32 0, ptr @Zero, !"Zero", i32 0, i32 0, i32 1, i32 10, i1 false, i1 false, i1 false, ![[Half:[0-9]+]]} ; CHECK: ![[Half]] = !{i32 0, i32 8} -; CHECK: ![[One]] = !{i32 1, ptr @1, !"", i32 0, i32 1, i32 1, i32 10, i1 false, i1 false, i1 false, ![[Float:[0-9]+]]} +; CHECK: ![[One]] = !{i32 1, ptr @One, !"One", i32 0, i32 1, i32 1, i32 10, i1 false, i1 false, i1 false, ![[Float:[0-9]+]]} ; CHECK: ![[Float]] = !{i32 0, i32 9} -; CHECK: ![[Two]] = !{i32 2, ptr @2, !"", i32 0, i32 2, i32 1, i32 10, i1 false, i1 false, i1 false, ![[Double:[0-9]+]]} +; CHECK: ![[Two]] = !{i32 2, ptr @Two, !"Two", i32 0, i32 2, i32 1, i32 10, i1 false, i1 false, i1 false, ![[Double:[0-9]+]]} ; CHECK: ![[Double]] = !{i32 0, i32 10} -; CHECK: ![[Three]] = !{i32 3, ptr @3, !"", i32 0, i32 3, i32 1, i32 10, i1 false, i1 false, i1 false, ![[I32:[0-9]+]]} +; CHECK: ![[Three]] = !{i32 3, ptr @Three, !"Three", i32 0, i32 3, i32 1, i32 10, i1 false, i1 false, i1 false, ![[I32:[0-9]+]]} ; CHECK: ![[I32]] = !{i32 0, i32 4} -; CHECK: ![[Four]] = !{i32 4, ptr @4, !"", i32 0, i32 5, i32 1, i32 11, i1 false, i1 false, i1 false, null} -; CHECK: ![[Five]] = !{i32 5, ptr @5, !"", i32 0, i32 6, i32 1, i32 12, i1 false, i1 false, i1 false, ![[FiveStride:[0-9]+]]} +; CHECK: ![[Four]] = !{i32 4, ptr @Four, !"Four", i32 0, i32 5, i32 1, i32 11, i1 false, i1 false, i1 false, null} +; CHECK: ![[Five]] = !{i32 5, ptr @Five, !"Five", i32 0, i32 6, i32 1, i32 12, i1 false, i1 false, i1 false, ![[FiveStride:[0-9]+]]} ; CHECK: ![[FiveStride]] = !{i32 1, i32 2} -; CHECK: ![[Six]] = !{i32 6, ptr @6, !"", i32 0, i32 7, i32 1, i32 10, i1 false, i1 false, i1 true, ![[I32]]} -; CHECK: ![[Seven]] = !{i32 7, ptr @7, !"", i32 0, i32 8, i32 1, i32 12, i1 false, i1 false, i1 true, ![[SevenStride:[0-9]+]]} +; CHECK: ![[Six]] = !{i32 6, ptr @Six, !"Six", i32 0, i32 7, i32 1, i32 10, i1 false, i1 false, i1 true, ![[I32]]} +; CHECK: ![[Seven]] = !{i32 7, ptr @Seven, !"Seven", i32 0, i32 8, i32 1, i32 12, i1 false, i1 false, i1 true, ![[SevenStride:[0-9]+]]} ; CHECK: ![[SevenStride]] = !{i32 1, i32 16} -; CHECK: ![[Eight]] = !{i32 8, ptr @8, !"", i32 0, i32 9, i32 1, i32 11, i1 false, i1 false, i1 true, null} -; CHECK: ![[Nine]] = !{i32 9, ptr @9, !"", i32 2, i32 10, i32 1, i32 10, i1 false, i1 false, i1 false, ![[U64:[0-9]+]]} +; CHECK: ![[Eight]] = !{i32 8, ptr @Eight, !"Eight", i32 0, i32 9, i32 1, i32 11, i1 false, i1 false, i1 true, null} +; CHECK: ![[Nine]] = !{i32 9, ptr @Nine, !"Nine", i32 2, i32 10, i32 1, i32 10, i1 false, i1 false, i1 false, ![[U64:[0-9]+]]} ; CHECK: ![[U64]] = !{i32 0, i32 7} -; CHECK: ![[Array]] = !{i32 10, ptr @10, !"", i32 3, i32 4, i32 100, i32 10, i1 false, i1 false, i1 false, ![[Float]]} +; CHECK: ![[Array]] = !{i32 10, ptr @Array, !"Array", i32 3, i32 4, i32 100, i32 10, i1 false, i1 false, i1 false, ![[Float]]} +; CHECK: ![[Ten]] = !{i32 11, ptr @Ten, !"Ten", i32 5, i32 22, i32 1, i32 10, i1 false, i1 false, i1 false, ![[U64:[0-9]+]]} From a2ab9ede858de6ed6d6caf97946df758c73b6fa2 Mon Sep 17 00:00:00 2001 From: Helena Kotas Date: Tue, 20 May 2025 13:53:32 -0700 Subject: [PATCH 7/7] Add resource shape type definitions to the test baseline --- llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll | 10 ++++++++++ llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll | 13 +++++++++++++ 2 files changed, 23 insertions(+) diff --git a/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll index 4740dc4497595..725bc97ae39d4 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/srv_metadata.ll @@ -78,6 +78,16 @@ define void @test() #0 { attributes #0 = { noinline nounwind "hlsl.shader"="compute" } +; CHECK: %TypedBuffer = type { <4 x half> } +; CHECK: %TypedBuffer.0 = type { <2 x float> } +; CHECK: %TypedBuffer.1 = type { double } +; CHECK: %TypedBuffer.2 = type { <4 x i32> } +; CHECK: %ByteAddressBuffer = type { i32 } +; CHECK: %StructuredBuffer = type { i16 } +; CHECK: %TypedBuffer.3 = type { i64 } +; CHECK: %TypedBuffer.4 = type { <4 x float> } +; CHECK: %TypedBuffer.5 = type { i64 } + ; CHECK: @Zero = external constant %TypedBuffer ; CHECK: @One = external constant %TypedBuffer.0 ; CHECK: @Two = external constant %TypedBuffer.1 diff --git a/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll b/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll index 8958d6a220d87..bc589ef1752b6 100644 --- a/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll +++ b/llvm/test/CodeGen/DirectX/Metadata/uav_metadata.ll @@ -95,6 +95,19 @@ define void @test() #0 { attributes #0 = { noinline nounwind "hlsl.shader"="compute" } +; CHECK: %RWTypedBuffer = type { <4 x half> } +; CHECK: %RWTypedBuffer.0 = type { <2 x float> } +; CHECK: %RWTypedBuffer.1 = type { double } +; CHECK: %RWTypedBuffer.2 = type { <4 x i32> } +; CHECK: %RWByteAddressBuffer = type { i32 } +; CHECK: %RWStructuredBuffer = type { i16 } +; CHECK: %RasterizerOrderedTypedBuffer = type { <4 x i32> } +; CHECK: %RasterizerOrderedStructuredBuffer = type { <4 x i32> } +; CHECK: %RasterizerOrderedByteAddressBuffer = type { i32 } +; CHECK: %RWTypedBuffer.3 = type { i64 } +; CHECK: %RWTypedBuffer.4 = type { <4 x float> } +; CHECK: %RWTypedBuffer.5 = type { i64 } + ; CHECK: @Zero = external constant %RWTypedBuffer ; CHECK: @One = external constant %RWTypedBuffer.0 ; CHECK: @Two = external constant %RWTypedBuffer.1