diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp index 8572a442e784..3721564890dd 100644 --- a/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp +++ b/llvm/lib/Transforms/Scalar/LoopIdiomRecognize.cpp @@ -24,12 +24,6 @@ // memcmp, strlen, etc. // Future floating point idioms to recognize in -ffast-math mode: // fpowi -// Future integer operation idioms to recognize: -// ctpop -// -// Beware that isel's default lowering for ctpop is highly inefficient for -// i64 and larger types when i64 is legal and the value has few bits set. It -// would be good to enhance isel to emit a loop for ctpop in this case. // // This could recognize common matrix multiplies and dot product idioms and // replace them with calls to BLAS (if linked in??). @@ -948,9 +942,13 @@ mayLoopAccessLocation(Value *Ptr, ModRefInfo Access, Loop *L, // to be exactly the size of the memset, which is (BECount+1)*StoreSize const SCEVConstant *BECst = dyn_cast<SCEVConstant>(BECount); const SCEVConstant *ConstSize = dyn_cast<SCEVConstant>(StoreSizeSCEV); - if (BECst && ConstSize) - AccessSize = LocationSize::precise((BECst->getValue()->getZExtValue() + 1) * - ConstSize->getValue()->getZExtValue()); + if (BECst && ConstSize) { + std::optional<uint64_t> BEInt = BECst->getAPInt().tryZExtValue(); + std::optional<uint64_t> SizeInt = ConstSize->getAPInt().tryZExtValue(); + // FIXME: Should this check for overflow? + if (BEInt && SizeInt) + AccessSize = LocationSize::precise((*BEInt + 1) * *SizeInt); + } // TODO: For this to be really effective, we have to dive into the pointer // operand in the store. Store to &A[i] of 100 will always return may alias @@ -1023,7 +1021,7 @@ bool LoopIdiomRecognize::processLoopStridedStore( SCEVExpander Expander(*SE, *DL, "loop-idiom"); SCEVExpanderCleaner ExpCleaner(Expander); - Type *DestInt8PtrTy = Builder.getInt8PtrTy(DestAS); + Type *DestInt8PtrTy = Builder.getPtrTy(DestAS); Type *IntIdxTy = DL->getIndexType(DestPtr->getType()); bool Changed = false; @@ -1107,7 +1105,7 @@ bool LoopIdiomRecognize::processLoopStridedStore( PatternValue, ".memset_pattern"); GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); // Ok to merge these. GV->setAlignment(Align(16)); - Value *PatternPtr = ConstantExpr::getBitCast(GV, Int8PtrTy); + Value *PatternPtr = GV; NewCall = Builder.CreateCall(MSP, {BasePtr, PatternPtr, NumBytes}); // Set the TBAA info if present. @@ -1284,7 +1282,7 @@ bool LoopIdiomRecognize::processLoopStoreOfLoopLoad( // feeds the stores. Check for an alias by generating the base address and // checking everything. Value *StoreBasePtr = Expander.expandCodeFor( - StrStart, Builder.getInt8PtrTy(StrAS), Preheader->getTerminator()); + StrStart, Builder.getPtrTy(StrAS), Preheader->getTerminator()); // From here on out, conservatively report to the pass manager that we've // changed the IR, even if we later clean up these added instructions. There @@ -1336,8 +1334,8 @@ bool LoopIdiomRecognize::processLoopStoreOfLoopLoad( // For a memcpy, we have to make sure that the input array is not being // mutated by the loop. - Value *LoadBasePtr = Expander.expandCodeFor( - LdStart, Builder.getInt8PtrTy(LdAS), Preheader->getTerminator()); + Value *LoadBasePtr = Expander.expandCodeFor(LdStart, Builder.getPtrTy(LdAS), + Preheader->getTerminator()); // If the store is a memcpy instruction, we must check if it will write to // the load memory locations. So remove it from the ignored stores. @@ -2026,7 +2024,8 @@ void LoopIdiomRecognize::transformLoopToCountable( auto *LbBr = cast<BranchInst>(Body->getTerminator()); ICmpInst *LbCond = cast<ICmpInst>(LbBr->getCondition()); - PHINode *TcPhi = PHINode::Create(CountTy, 2, "tcphi", &Body->front()); + PHINode *TcPhi = PHINode::Create(CountTy, 2, "tcphi"); + TcPhi->insertBefore(Body->begin()); Builder.SetInsertPoint(LbCond); Instruction *TcDec = cast<Instruction>(Builder.CreateSub( @@ -2132,7 +2131,8 @@ void LoopIdiomRecognize::transformLoopToPopcount(BasicBlock *PreCondBB, ICmpInst *LbCond = cast<ICmpInst>(LbBr->getCondition()); Type *Ty = TripCnt->getType(); - PHINode *TcPhi = PHINode::Create(Ty, 2, "tcphi", &Body->front()); + PHINode *TcPhi = PHINode::Create(Ty, 2, "tcphi"); + TcPhi->insertBefore(Body->begin()); Builder.SetInsertPoint(LbCond); Instruction *TcDec = cast<Instruction>( @@ -2411,7 +2411,7 @@ bool LoopIdiomRecognize::recognizeShiftUntilBitTest() { // it's use count. Instruction *InsertPt = nullptr; if (auto *BitPosI = dyn_cast<Instruction>(BitPos)) - InsertPt = BitPosI->getInsertionPointAfterDef(); + InsertPt = &**BitPosI->getInsertionPointAfterDef(); else InsertPt = &*DT->getRoot()->getFirstNonPHIOrDbgOrAlloca(); if (!InsertPt) @@ -2493,7 +2493,7 @@ bool LoopIdiomRecognize::recognizeShiftUntilBitTest() { // Step 4: Rewrite the loop into a countable form, with canonical IV. // The new canonical induction variable. - Builder.SetInsertPoint(&LoopHeaderBB->front()); + Builder.SetInsertPoint(LoopHeaderBB, LoopHeaderBB->begin()); auto *IV = Builder.CreatePHI(Ty, 2, CurLoop->getName() + ".iv"); // The induction itself. @@ -2817,11 +2817,11 @@ bool LoopIdiomRecognize::recognizeShiftUntilZero() { // Step 3: Rewrite the loop into a countable form, with canonical IV. // The new canonical induction variable. - Builder.SetInsertPoint(&LoopHeaderBB->front()); + Builder.SetInsertPoint(LoopHeaderBB, LoopHeaderBB->begin()); auto *CIV = Builder.CreatePHI(Ty, 2, CurLoop->getName() + ".iv"); // The induction itself. - Builder.SetInsertPoint(LoopHeaderBB->getFirstNonPHI()); + Builder.SetInsertPoint(LoopHeaderBB, LoopHeaderBB->getFirstNonPHIIt()); auto *CIVNext = Builder.CreateAdd(CIV, ConstantInt::get(Ty, 1), CIV->getName() + ".next", /*HasNUW=*/true, /*HasNSW=*/Bitwidth != 2); |
