diff options
Diffstat (limited to 'llvm/lib/Target/DirectX/DXILFlattenArrays.cpp')
| -rw-r--r-- | llvm/lib/Target/DirectX/DXILFlattenArrays.cpp | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp index 6077af997212..53fc1c713a8c 100644 --- a/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp +++ b/llvm/lib/Target/DirectX/DXILFlattenArrays.cpp @@ -162,11 +162,18 @@ bool DXILFlattenArraysVisitor::visitLoadInst(LoadInst &LI) { Value *CurrOpperand = LI.getOperand(I); ConstantExpr *CE = dyn_cast<ConstantExpr>(CurrOpperand); if (CE && CE->getOpcode() == Instruction::GetElementPtr) { - convertUsersOfConstantsToInstructions(CE, - /*RestrictToFunc=*/nullptr, - /*RemoveDeadConstants=*/false, - /*IncludeSelf=*/true); - return false; + GetElementPtrInst *OldGEP = + cast<GetElementPtrInst>(CE->getAsInstruction()); + OldGEP->insertBefore(&LI); + + IRBuilder<> Builder(&LI); + LoadInst *NewLoad = + Builder.CreateLoad(LI.getType(), OldGEP, LI.getName()); + NewLoad->setAlignment(LI.getAlign()); + LI.replaceAllUsesWith(NewLoad); + LI.eraseFromParent(); + visitGetElementPtrInst(*OldGEP); + return true; } } return false; @@ -178,11 +185,17 @@ bool DXILFlattenArraysVisitor::visitStoreInst(StoreInst &SI) { Value *CurrOpperand = SI.getOperand(I); ConstantExpr *CE = dyn_cast<ConstantExpr>(CurrOpperand); if (CE && CE->getOpcode() == Instruction::GetElementPtr) { - convertUsersOfConstantsToInstructions(CE, - /*RestrictToFunc=*/nullptr, - /*RemoveDeadConstants=*/false, - /*IncludeSelf=*/true); - return false; + GetElementPtrInst *OldGEP = + cast<GetElementPtrInst>(CE->getAsInstruction()); + OldGEP->insertBefore(&SI); + + IRBuilder<> Builder(&SI); + StoreInst *NewStore = Builder.CreateStore(SI.getValueOperand(), OldGEP); + NewStore->setAlignment(SI.getAlign()); + SI.replaceAllUsesWith(NewStore); + SI.eraseFromParent(); + visitGetElementPtrInst(*OldGEP); + return true; } } return false; @@ -315,10 +328,17 @@ bool DXILFlattenArraysVisitor::visit(Function &F) { static void collectElements(Constant *Init, SmallVectorImpl<Constant *> &Elements) { // Base case: If Init is not an array, add it directly to the vector. - if (!isa<ArrayType>(Init->getType())) { + auto *ArrayTy = dyn_cast<ArrayType>(Init->getType()); + if (!ArrayTy) { Elements.push_back(Init); return; } + unsigned ArrSize = ArrayTy->getNumElements(); + if (isa<ConstantAggregateZero>(Init)) { + for (unsigned I = 0; I < ArrSize; ++I) + Elements.push_back(Constant::getNullValue(ArrayTy->getElementType())); + return; + } // Recursive case: Process each element in the array. if (auto *ArrayConstant = dyn_cast<ConstantArray>(Init)) { |
