Skip to content

Commit 516bd63

Browse files
committed
code review feedback - make the check that an intrinsic has a name argument more generic; update string ctors
1 parent 759750e commit 516bd63

File tree

3 files changed

+68
-40
lines changed

3 files changed

+68
-40
lines changed

clang/lib/CodeGen/CGHLSLBuiltins.cpp

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -300,19 +300,18 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
300300
Value *NonUniform =
301301
llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false);
302302

303-
Intrinsic::ID IID =
303+
auto [IntrinsicID, HasNameArg] =
304304
CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic();
305-
// SPIR-V intrinsic does not have include the resource name
306-
if (IID == Intrinsic::spv_resource_handlefrombinding)
307-
return Builder.CreateIntrinsic(
308-
HandleTy, IID,
309-
ArrayRef<Value *>{SpaceOp, RegisterOp, RangeOp, IndexOp, NonUniform});
310-
311-
Value *NameOp = EmitScalarExpr(E->getArg(5));
312-
return Builder.CreateIntrinsic(HandleTy, IID,
313-
ArrayRef<Value *>{SpaceOp, RegisterOp,
314-
RangeOp, IndexOp,
315-
NonUniform, NameOp});
305+
if (HasNameArg) {
306+
Value *NameOp = EmitScalarExpr(E->getArg(5));
307+
return Builder.CreateIntrinsic(HandleTy, IntrinsicID,
308+
ArrayRef<Value *>{SpaceOp, RegisterOp,
309+
RangeOp, IndexOp,
310+
NonUniform, NameOp});
311+
}
312+
return Builder.CreateIntrinsic(
313+
HandleTy, IntrinsicID,
314+
ArrayRef<Value *>{SpaceOp, RegisterOp, RangeOp, IndexOp, NonUniform});
316315
}
317316
case Builtin::BI__builtin_hlsl_resource_handlefromimplicitbinding: {
318317
llvm::Type *HandleTy = CGM.getTypes().ConvertType(E->getType());
@@ -325,19 +324,18 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
325324
Value *NonUniform =
326325
llvm::ConstantInt::get(llvm::Type::getInt1Ty(getLLVMContext()), false);
327326

328-
Intrinsic::ID IID =
327+
auto [IntrinsicID, HasNameArg] =
329328
CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
330-
// SPIR-V intrinsic does not include the resource name
331-
if (IID == Intrinsic::spv_resource_handlefromimplicitbinding)
332-
return Builder.CreateIntrinsic(
333-
HandleTy, IID,
334-
ArrayRef<Value *>{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform});
335-
336-
Value *NameOp = EmitScalarExpr(E->getArg(5));
337-
return Builder.CreateIntrinsic(HandleTy, IID,
338-
ArrayRef<Value *>{OrderID, SpaceOp, RangeOp,
339-
IndexOp, NonUniform,
340-
NameOp});
329+
if (HasNameArg) {
330+
Value *NameOp = EmitScalarExpr(E->getArg(5));
331+
return Builder.CreateIntrinsic(HandleTy, IntrinsicID,
332+
ArrayRef<Value *>{OrderID, SpaceOp,
333+
RangeOp, IndexOp,
334+
NonUniform, NameOp});
335+
}
336+
return Builder.CreateIntrinsic(
337+
HandleTy, IntrinsicID,
338+
ArrayRef<Value *>{OrderID, SpaceOp, RangeOp, IndexOp, NonUniform});
341339
}
342340
case Builtin::BI__builtin_hlsl_all: {
343341
Value *Op0 = EmitScalarExpr(E->getArg(0));

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "llvm/Support/Alignment.h"
3535
#include "llvm/Support/ErrorHandling.h"
3636
#include "llvm/Support/FormatVariadic.h"
37+
#include <utility>
3738

3839
using namespace clang;
3940
using namespace CodeGen;
@@ -235,6 +236,35 @@ static void fillPackoffsetLayout(const HLSLBufferDecl *BufDecl,
235236
}
236237
}
237238

239+
std::pair<llvm::Intrinsic::ID, bool>
240+
CGHLSLRuntime::getCreateHandleFromBindingIntrinsic() {
241+
switch (getArch()) {
242+
case llvm::Triple::dxil:
243+
return std::pair(llvm::Intrinsic::dx_resource_handlefrombinding, true);
244+
case llvm::Triple::spirv:
245+
return std::pair(llvm::Intrinsic::spv_resource_handlefrombinding, false);
246+
default:
247+
llvm_unreachable("Intrinsic resource_handlefrombinding not supported by "
248+
"target architecture");
249+
}
250+
}
251+
252+
std::pair<llvm::Intrinsic::ID, bool>
253+
CGHLSLRuntime::getCreateHandleFromImplicitBindingIntrinsic() {
254+
switch (getArch()) {
255+
case llvm::Triple::dxil:
256+
return std::pair(llvm::Intrinsic::dx_resource_handlefromimplicitbinding,
257+
true);
258+
case llvm::Triple::spirv:
259+
return std::pair(llvm::Intrinsic::spv_resource_handlefromimplicitbinding,
260+
false);
261+
default:
262+
llvm_unreachable(
263+
"Intrinsic resource_handlefromimplicitbinding not supported by "
264+
"target architecture");
265+
}
266+
}
267+
238268
// Codegen for HLSLBufferDecl
239269
void CGHLSLRuntime::addBuffer(const HLSLBufferDecl *BufDecl) {
240270

@@ -564,35 +594,35 @@ void CGHLSLRuntime::initializeBufferFromBinding(const HLSLBufferDecl *BufDecl,
564594
llvm::ConstantInt::get(CGM.IntTy, RBA ? RBA->getSpaceNumber() : 0);
565595
Value *Name = nullptr;
566596

567-
// DXIL intrinsic includes resource name
568-
if (getArch() == Triple::dxil) {
569-
std::string Str = std::string(BufDecl->getName());
570-
std::string GlobalName = Str + ".str";
597+
auto [IntrinsicID, HasNameArg] =
598+
RBA->hasRegisterSlot()
599+
? CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic()
600+
: CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
601+
602+
if (HasNameArg) {
603+
std::string Str(BufDecl->getName());
604+
std::string GlobalName(Str + ".str");
571605
Name = CGM.GetAddrOfConstantCString(Str, GlobalName.c_str()).getPointer();
572606
}
573607

574608
// buffer with explicit binding
575609
if (RBA->hasRegisterSlot()) {
576610
auto *RegSlot = llvm::ConstantInt::get(CGM.IntTy, RBA->getSlotNumber());
577-
Intrinsic::ID Intr =
578-
CGM.getHLSLRuntime().getCreateHandleFromBindingIntrinsic();
579611
if (Name)
580-
initializeBuffer(CGM, GV, Intr,
612+
initializeBuffer(CGM, GV, IntrinsicID,
581613
{Space, RegSlot, RangeSize, Index, NonUniform, Name});
582614
else
583-
initializeBuffer(CGM, GV, Intr,
615+
initializeBuffer(CGM, GV, IntrinsicID,
584616
{Space, RegSlot, RangeSize, Index, NonUniform});
585617
} else {
586618
// buffer with implicit binding
587619
auto *OrderID =
588620
llvm::ConstantInt::get(CGM.IntTy, RBA->getImplicitBindingOrderID());
589-
Intrinsic::ID Intr =
590-
CGM.getHLSLRuntime().getCreateHandleFromImplicitBindingIntrinsic();
591621
if (Name)
592-
initializeBuffer(CGM, GV, Intr,
622+
initializeBuffer(CGM, GV, IntrinsicID,
593623
{OrderID, Space, RangeSize, Index, NonUniform, Name});
594624
else
595-
initializeBuffer(CGM, GV, Intr,
625+
initializeBuffer(CGM, GV, IntrinsicID,
596626
{OrderID, Space, RangeSize, Index, NonUniform});
597627
}
598628
}

clang/lib/CodeGen/CGHLSLRuntime.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,6 @@ class CGHLSLRuntime {
117117

118118
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateResourceGetPointer,
119119
resource_getpointer)
120-
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromBinding,
121-
resource_handlefrombinding)
122-
GENERATE_HLSL_INTRINSIC_FUNCTION(CreateHandleFromImplicitBinding,
123-
resource_handlefromimplicitbinding)
124120
GENERATE_HLSL_INTRINSIC_FUNCTION(BufferUpdateCounter, resource_updatecounter)
125121
GENERATE_HLSL_INTRINSIC_FUNCTION(GroupMemoryBarrierWithGroupSync,
126122
group_memory_barrier_with_group_sync)
@@ -129,6 +125,10 @@ class CGHLSLRuntime {
129125
// End of reserved area for HLSL intrinsic getters.
130126
//===----------------------------------------------------------------------===//
131127

128+
std::pair<llvm::Intrinsic::ID, bool> getCreateHandleFromBindingIntrinsic();
129+
std::pair<llvm::Intrinsic::ID, bool>
130+
getCreateHandleFromImplicitBindingIntrinsic();
131+
132132
protected:
133133
CodeGenModule &CGM;
134134

0 commit comments

Comments
 (0)