diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp index 8f1d0181ee5b..296becb31e8f 100644 --- a/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp +++ b/llvm/lib/Transforms/Scalar/LowerMatrixIntrinsics.cpp @@ -1339,16 +1339,21 @@ public: // Copy load operand to new alloca. Builder.SetInsertPoint(Copy, Copy->begin()); - AllocaInst *NewLd = - Builder.CreateAlloca(Load->getType(), Load->getPointerAddressSpace()); - Builder.CreateMemCpy(NewLd, NewLd->getAlign(), - Load->getPointerOperand(), Load->getAlign(), - LoadLoc.Size.getValue()); + auto *VT = cast<FixedVectorType>(Load->getType()); + // Use an array type for the alloca, to avoid potentially huge alignment + // requirements for large vector types. + auto *ArrayTy = ArrayType::get(VT->getElementType(), VT->getNumElements()); + AllocaInst *Alloca = + Builder.CreateAlloca(ArrayTy, Load->getPointerAddressSpace()); + Value *BC = Builder.CreateBitCast(Alloca, VT->getPointerTo()); + + Builder.CreateMemCpy(BC, Alloca->getAlign(), Load->getPointerOperand(), + Load->getAlign(), LoadLoc.Size.getValue()); Builder.SetInsertPoint(Fusion, Fusion->begin()); PHINode *PHI = Builder.CreatePHI(Load->getPointerOperandType(), 3); PHI->addIncoming(Load->getPointerOperand(), Check0); PHI->addIncoming(Load->getPointerOperand(), Check1); - PHI->addIncoming(NewLd, Copy); + PHI->addIncoming(BC, Copy); // Adjust DT. DTUpdates.push_back({DT->Insert, Check0, Check1}); |
