From 9ec8fc4bc8840d646eeba0fbdc1390bf2fd0b2b6 Mon Sep 17 00:00:00 2001 From: Deric Cheung Date: Thu, 24 Jul 2025 18:10:02 +0000 Subject: [PATCH 1/3] Do not flatten GEP chains for unsupported types --- llvm/lib/Target/DirectX/DXILFlattenArrays.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp index f0e2e786dfaf4..b7f81c4b3e357 100644 --- a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp +++ b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp @@ -263,8 +263,13 @@ bool DXILFlattenArraysVisitor::visitGetElementPtrInst(GetElementPtrInst &GEP) { // merge the byte offsets. Otherwise, this GEP is itself the root of a GEP // chain and we need to deterine the root array type if (auto *PtrOpGEP = dyn_cast(PtrOperand)) { - assert(GEPChainInfoMap.contains(PtrOpGEP) && - "Expected parent GEP to be visited before this GEP"); + + // If the parent GEP was not processed, then we do not want to process its + // descendants. This can happen if the GEP chain is for an unsupported type + // such as structs -- we do not flatten structs. + if (!GEPChainInfoMap.contains(PtrOpGEP)) + return false; + GEPInfo &PGEPInfo = GEPChainInfoMap[PtrOpGEP]; Info.RootFlattenedArrayType = PGEPInfo.RootFlattenedArrayType; Info.RootPointerOperand = PGEPInfo.RootPointerOperand; From 733ae8ee1ed49c5211ddd9d6474d90d6bb157e23 Mon Sep 17 00:00:00 2001 From: Deric Cheung Date: Thu, 24 Jul 2025 18:19:24 +0000 Subject: [PATCH 2/3] Add a test to ensure there are no errors --- llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll b/llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll index 40d222cdf2f8f..e6d4c1ee936a9 100644 --- a/llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll +++ b/llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll @@ -8,10 +8,12 @@ define void @test_no_transform_of_struct() { ; CHECK-NEXT: [[ENTRY:.*:]] ; CHECK-NEXT: [[OUTPUTSIZESLOCAL_I:%.*]] = alloca [[STRUCT_RAWSTRUCT8D:%.*]], align 4 ; CHECK-NEXT: [[ARRAYINIT_ELEMENT13_I76:%.*]] = getelementptr inbounds nuw [1 x %struct.RawStruct8D], ptr [[OUTPUTSIZESLOCAL_I]], i32 0, i32 0 +; CHECK-NEXT: [[ARRAYINIT_ELEMENT13_I76_I1:%.*]] = getelementptr inbounds nuw [8 x i32], ptr [[ARRAYINIT_ELEMENT13_I76]], i32 0, i32 1 ; CHECK-NEXT: ret void ; entry: %outputSizesLocal.i = alloca %struct.RawStruct8D, align 4 %arrayinit.element13.i76 = getelementptr inbounds nuw [1 x %struct.RawStruct8D], ptr %outputSizesLocal.i, i32 0, i32 0 + %arrayinit.element13.i76.i1 = getelementptr inbounds nuw [8 x i32], ptr %arrayinit.element13.i76, i32 0, i32 1 ret void } From 9250cad8d2fd5d6f90effd42b934dfbdfee6eb44 Mon Sep 17 00:00:00 2001 From: "Deric C." Date: Thu, 24 Jul 2025 12:03:25 -0700 Subject: [PATCH 3/3] Clarify comment about not processing structs or GEPs for structs --- llvm/lib/Target/DirectX/DXILFlattenArrays.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp index b7f81c4b3e357..7e1436e05a34a 100644 --- a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp +++ b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp @@ -266,7 +266,7 @@ bool DXILFlattenArraysVisitor::visitGetElementPtrInst(GetElementPtrInst &GEP) { // If the parent GEP was not processed, then we do not want to process its // descendants. This can happen if the GEP chain is for an unsupported type - // such as structs -- we do not flatten structs. + // such as a struct -- we do not flatten structs nor GEP chains for structs if (!GEPChainInfoMap.contains(PtrOpGEP)) return false;