diff --git a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp index 0a9b2bb99f7eb..71eb1349314ea 100644 --- a/llvm/lib/Target/DirectX/DXILDataScalarization.cpp +++ b/llvm/lib/Target/DirectX/DXILDataScalarization.cpp @@ -308,9 +308,8 @@ bool DataScalarizerVisitor::visitGetElementPtrInst(GetElementPtrInst &GEPI) { NeedsTransform = true; } else if (AllocaInst *Alloca = dyn_cast(PtrOperand)) { Type *AllocatedType = Alloca->getAllocatedType(); - // OrigGEPType might just be a pointer lets make sure - // to add the allocated type so we have a size - if (AllocatedType != OrigGEPType) { + // Only transform if the allocated type is an array + if (AllocatedType != OrigGEPType && isa(AllocatedType)) { NewGEPType = AllocatedType; NeedsTransform = true; } diff --git a/llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll b/llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll new file mode 100644 index 0000000000000..40d222cdf2f8f --- /dev/null +++ b/llvm/test/CodeGen/DirectX/issue-145408-gep-struct-fix.ll @@ -0,0 +1,17 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt -S -dxil-data-scalarization -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s + +%struct.RawStruct8D = type { [8 x i32] } + +define void @test_no_transform_of_struct() { +; CHECK-LABEL: 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: 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 + ret void +}