-
Notifications
You must be signed in to change notification settings - Fork 14.3k
Reapply "[DXIL][Analysis] Make alignment on StructuredBuffer optional" #101113
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Unfortunately storing a `MaybeAlign` in ResourceInfo deletes our move constructor in compilers that haven't implemented [P0602R4], like GCC 7. Since we only ever use the alignment in ways where alignment 1 and unset are ambiguous anyway, we'll just store the integer AlignLog2 value that we'll eventually use directly. [P0602R4]: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0602r4.html This reverts commit c22171f, reapplying a94edb6.
@llvm/pr-subscribers-backend-directx Author: Justin Bogner (bogner) ChangesUnfortunately storing a This reverts commit c22171f, reapplying a94edb6. Full diff: https://github.com/llvm/llvm-project/pull/101113.diff 3 Files Affected:
diff --git a/llvm/include/llvm/Analysis/DXILResource.h b/llvm/include/llvm/Analysis/DXILResource.h
index 2ca0ad9a75319..ed9fade3f14f3 100644
--- a/llvm/include/llvm/Analysis/DXILResource.h
+++ b/llvm/include/llvm/Analysis/DXILResource.h
@@ -47,10 +47,14 @@ class ResourceInfo {
struct StructInfo {
uint32_t Stride;
- Align Alignment;
+ // Note: we store an integer here rather than using `MaybeAlign` because in
+ // GCC 7 MaybeAlign isn't trivial so having one in this union would delete
+ // our move constructor.
+ // See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0602r4.html
+ uint32_t AlignLog2;
bool operator==(const StructInfo &RHS) const {
- return std::tie(Stride, Alignment) == std::tie(RHS.Stride, RHS.Alignment);
+ return std::tie(Stride, AlignLog2) == std::tie(RHS.Stride, RHS.AlignLog2);
}
bool operator!=(const StructInfo &RHS) const { return !(*this == RHS); }
};
@@ -138,10 +142,10 @@ class ResourceInfo {
CBufferSize = Size;
}
void setSampler(dxil::SamplerType Ty) { SamplerTy = Ty; }
- void setStruct(uint32_t Stride, Align Alignment) {
+ void setStruct(uint32_t Stride, MaybeAlign Alignment) {
assert(isStruct() && "Not a Struct");
Struct.Stride = Stride;
- Struct.Alignment = Alignment;
+ Struct.AlignLog2 = Alignment ? Log2(*Alignment) : 0;
}
void setTyped(dxil::ElementType ElementTy, uint32_t ElementCount) {
assert(isTyped() && "Not Typed");
@@ -164,7 +168,7 @@ class ResourceInfo {
dxil::ResourceKind Kind);
static ResourceInfo RawBuffer(Value *Symbol, StringRef Name);
static ResourceInfo StructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride, Align Alignment);
+ uint32_t Stride, MaybeAlign Alignment);
static ResourceInfo Texture2DMS(Value *Symbol, StringRef Name,
dxil::ElementType ElementTy,
uint32_t ElementCount, uint32_t SampleCount);
@@ -180,9 +184,9 @@ class ResourceInfo {
static ResourceInfo RWRawBuffer(Value *Symbol, StringRef Name,
bool GloballyCoherent, bool IsROV);
static ResourceInfo RWStructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride,
- Align Alignment, bool GloballyCoherent,
- bool IsROV, bool HasCounter);
+ uint32_t Stride, MaybeAlign Alignment,
+ bool GloballyCoherent, bool IsROV,
+ bool HasCounter);
static ResourceInfo RWTexture2DMS(Value *Symbol, StringRef Name,
dxil::ElementType ElementTy,
uint32_t ElementCount, uint32_t SampleCount,
diff --git a/llvm/lib/Analysis/DXILResource.cpp b/llvm/lib/Analysis/DXILResource.cpp
index 1443fef8fc165..5e8350fd2d251 100644
--- a/llvm/lib/Analysis/DXILResource.cpp
+++ b/llvm/lib/Analysis/DXILResource.cpp
@@ -79,7 +79,8 @@ ResourceInfo ResourceInfo::RawBuffer(Value *Symbol, StringRef Name) {
}
ResourceInfo ResourceInfo::StructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride, Align Alignment) {
+ uint32_t Stride,
+ MaybeAlign Alignment) {
ResourceInfo RI(ResourceClass::SRV, ResourceKind::StructuredBuffer, Symbol,
Name);
RI.setStruct(Stride, Alignment);
@@ -127,7 +128,8 @@ ResourceInfo ResourceInfo::RWRawBuffer(Value *Symbol, StringRef Name,
}
ResourceInfo ResourceInfo::RWStructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride, Align Alignment,
+ uint32_t Stride,
+ MaybeAlign Alignment,
bool GloballyCoherent, bool IsROV,
bool HasCounter) {
ResourceInfo RI(ResourceClass::UAV, ResourceKind::StructuredBuffer, Symbol,
@@ -284,7 +286,7 @@ MDTuple *ResourceInfo::getAsMetadata(LLVMContext &Ctx) const {
std::pair<uint32_t, uint32_t> ResourceInfo::getAnnotateProps() const {
uint32_t ResourceKind = llvm::to_underlying(Kind);
- uint32_t AlignLog2 = isStruct() ? Log2(Struct.Alignment) : 0;
+ uint32_t AlignLog2 = isStruct() ? Struct.AlignLog2 : 0;
bool IsUAV = isUAV();
bool IsROV = IsUAV && UAVFlags.IsROV;
bool IsGloballyCoherent = IsUAV && UAVFlags.GloballyCoherent;
diff --git a/llvm/unittests/Analysis/DXILResourceTest.cpp b/llvm/unittests/Analysis/DXILResourceTest.cpp
index 554cbd0d8ded7..7bbb417097882 100644
--- a/llvm/unittests/Analysis/DXILResourceTest.cpp
+++ b/llvm/unittests/Analysis/DXILResourceTest.cpp
@@ -151,6 +151,19 @@ TEST(DXILResource, AnnotationsAndMetadata) {
EXPECT_MDEQ(
MD, TestMD.get(0, Symbol, "Buffer0", 0, 0, 1, 12, 0, TestMD.get(1, 16)));
+ // StructuredBuffer<float3> Buffer1 : register(t1);
+ Symbol = UndefValue::get(StructType::create(
+ Context, {Floatx3Ty}, "class.StructuredBuffer<vector<float, 3> >"));
+ Resource = ResourceInfo::StructuredBuffer(Symbol, "Buffer1",
+ /*Stride=*/12, {});
+ Resource.bind(1, 0, 1, 1);
+ Props = Resource.getAnnotateProps();
+ EXPECT_EQ(Props.first, 0x0000000cU);
+ EXPECT_EQ(Props.second, 0x0000000cU);
+ MD = Resource.getAsMetadata(Context);
+ EXPECT_MDEQ(
+ MD, TestMD.get(1, Symbol, "Buffer1", 0, 1, 1, 12, 0, TestMD.get(1, 12)));
+
// Texture2D<float4> ColorMapTexture : register(t2);
Symbol = UndefValue::get(StructType::create(
Context, {Floatx4Ty}, "class.Texture2D<vector<float, 4> >"));
|
@llvm/pr-subscribers-llvm-analysis Author: Justin Bogner (bogner) ChangesUnfortunately storing a This reverts commit c22171f, reapplying a94edb6. Full diff: https://github.com/llvm/llvm-project/pull/101113.diff 3 Files Affected:
diff --git a/llvm/include/llvm/Analysis/DXILResource.h b/llvm/include/llvm/Analysis/DXILResource.h
index 2ca0ad9a75319..ed9fade3f14f3 100644
--- a/llvm/include/llvm/Analysis/DXILResource.h
+++ b/llvm/include/llvm/Analysis/DXILResource.h
@@ -47,10 +47,14 @@ class ResourceInfo {
struct StructInfo {
uint32_t Stride;
- Align Alignment;
+ // Note: we store an integer here rather than using `MaybeAlign` because in
+ // GCC 7 MaybeAlign isn't trivial so having one in this union would delete
+ // our move constructor.
+ // See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0602r4.html
+ uint32_t AlignLog2;
bool operator==(const StructInfo &RHS) const {
- return std::tie(Stride, Alignment) == std::tie(RHS.Stride, RHS.Alignment);
+ return std::tie(Stride, AlignLog2) == std::tie(RHS.Stride, RHS.AlignLog2);
}
bool operator!=(const StructInfo &RHS) const { return !(*this == RHS); }
};
@@ -138,10 +142,10 @@ class ResourceInfo {
CBufferSize = Size;
}
void setSampler(dxil::SamplerType Ty) { SamplerTy = Ty; }
- void setStruct(uint32_t Stride, Align Alignment) {
+ void setStruct(uint32_t Stride, MaybeAlign Alignment) {
assert(isStruct() && "Not a Struct");
Struct.Stride = Stride;
- Struct.Alignment = Alignment;
+ Struct.AlignLog2 = Alignment ? Log2(*Alignment) : 0;
}
void setTyped(dxil::ElementType ElementTy, uint32_t ElementCount) {
assert(isTyped() && "Not Typed");
@@ -164,7 +168,7 @@ class ResourceInfo {
dxil::ResourceKind Kind);
static ResourceInfo RawBuffer(Value *Symbol, StringRef Name);
static ResourceInfo StructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride, Align Alignment);
+ uint32_t Stride, MaybeAlign Alignment);
static ResourceInfo Texture2DMS(Value *Symbol, StringRef Name,
dxil::ElementType ElementTy,
uint32_t ElementCount, uint32_t SampleCount);
@@ -180,9 +184,9 @@ class ResourceInfo {
static ResourceInfo RWRawBuffer(Value *Symbol, StringRef Name,
bool GloballyCoherent, bool IsROV);
static ResourceInfo RWStructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride,
- Align Alignment, bool GloballyCoherent,
- bool IsROV, bool HasCounter);
+ uint32_t Stride, MaybeAlign Alignment,
+ bool GloballyCoherent, bool IsROV,
+ bool HasCounter);
static ResourceInfo RWTexture2DMS(Value *Symbol, StringRef Name,
dxil::ElementType ElementTy,
uint32_t ElementCount, uint32_t SampleCount,
diff --git a/llvm/lib/Analysis/DXILResource.cpp b/llvm/lib/Analysis/DXILResource.cpp
index 1443fef8fc165..5e8350fd2d251 100644
--- a/llvm/lib/Analysis/DXILResource.cpp
+++ b/llvm/lib/Analysis/DXILResource.cpp
@@ -79,7 +79,8 @@ ResourceInfo ResourceInfo::RawBuffer(Value *Symbol, StringRef Name) {
}
ResourceInfo ResourceInfo::StructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride, Align Alignment) {
+ uint32_t Stride,
+ MaybeAlign Alignment) {
ResourceInfo RI(ResourceClass::SRV, ResourceKind::StructuredBuffer, Symbol,
Name);
RI.setStruct(Stride, Alignment);
@@ -127,7 +128,8 @@ ResourceInfo ResourceInfo::RWRawBuffer(Value *Symbol, StringRef Name,
}
ResourceInfo ResourceInfo::RWStructuredBuffer(Value *Symbol, StringRef Name,
- uint32_t Stride, Align Alignment,
+ uint32_t Stride,
+ MaybeAlign Alignment,
bool GloballyCoherent, bool IsROV,
bool HasCounter) {
ResourceInfo RI(ResourceClass::UAV, ResourceKind::StructuredBuffer, Symbol,
@@ -284,7 +286,7 @@ MDTuple *ResourceInfo::getAsMetadata(LLVMContext &Ctx) const {
std::pair<uint32_t, uint32_t> ResourceInfo::getAnnotateProps() const {
uint32_t ResourceKind = llvm::to_underlying(Kind);
- uint32_t AlignLog2 = isStruct() ? Log2(Struct.Alignment) : 0;
+ uint32_t AlignLog2 = isStruct() ? Struct.AlignLog2 : 0;
bool IsUAV = isUAV();
bool IsROV = IsUAV && UAVFlags.IsROV;
bool IsGloballyCoherent = IsUAV && UAVFlags.GloballyCoherent;
diff --git a/llvm/unittests/Analysis/DXILResourceTest.cpp b/llvm/unittests/Analysis/DXILResourceTest.cpp
index 554cbd0d8ded7..7bbb417097882 100644
--- a/llvm/unittests/Analysis/DXILResourceTest.cpp
+++ b/llvm/unittests/Analysis/DXILResourceTest.cpp
@@ -151,6 +151,19 @@ TEST(DXILResource, AnnotationsAndMetadata) {
EXPECT_MDEQ(
MD, TestMD.get(0, Symbol, "Buffer0", 0, 0, 1, 12, 0, TestMD.get(1, 16)));
+ // StructuredBuffer<float3> Buffer1 : register(t1);
+ Symbol = UndefValue::get(StructType::create(
+ Context, {Floatx3Ty}, "class.StructuredBuffer<vector<float, 3> >"));
+ Resource = ResourceInfo::StructuredBuffer(Symbol, "Buffer1",
+ /*Stride=*/12, {});
+ Resource.bind(1, 0, 1, 1);
+ Props = Resource.getAnnotateProps();
+ EXPECT_EQ(Props.first, 0x0000000cU);
+ EXPECT_EQ(Props.second, 0x0000000cU);
+ MD = Resource.getAsMetadata(Context);
+ EXPECT_MDEQ(
+ MD, TestMD.get(1, Symbol, "Buffer1", 0, 1, 1, 12, 0, TestMD.get(1, 12)));
+
// Texture2D<float4> ColorMapTexture : register(t2);
Symbol = UndefValue::get(StructType::create(
Context, {Floatx4Ty}, "class.Texture2D<vector<float, 4> >"));
|
Unfortunately storing a
MaybeAlign
in ResourceInfo deletes our move constructor in compilers that haven't implemented P0602R4, like GCC 7. Since we only ever use the alignment in ways where alignment 1 and unset are ambiguous anyway, we'll just store the integer AlignLog2 value that we'll eventually use directly.This reverts commit c22171f, reapplying a94edb6.