Home | History | Annotate | Download | only in InstCombine

Lines Matching defs:PN

26 Instruction *InstCombiner::FoldPHIArgBinOpIntoPHI(PHINode &PN) {
27 Instruction *FirstInst = cast<Instruction>(PN.getIncomingValue(0));
46 for (unsigned i = 1; i != PN.getNumIncomingValues(); ++i) {
47 Instruction *I = dyn_cast<Instruction>(PN.getIncomingValue(i));
85 NewLHS = PHINode::Create(LHSType, PN.getNumIncomingValues(),
86 FirstInst->getOperand(0)->getName() + ".pn");
87 NewLHS->addIncoming(InLHS, PN.getIncomingBlock(0));
88 InsertNewInstBefore(NewLHS, PN);
93 NewRHS = PHINode::Create(RHSType, PN.getNumIncomingValues(),
94 FirstInst->getOperand(1)->getName() + ".pn");
95 NewRHS->addIncoming(InRHS, PN.getIncomingBlock(0));
96 InsertNewInstBefore(NewRHS, PN);
102 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
103 Instruction *InInst = cast<Instruction>(PN.getIncomingValue(i));
106 NewLHS->addIncoming(NewInLHS, PN.getIncomingBlock(i));
110 NewRHS->addIncoming(NewInRHS, PN.getIncomingBlock(i));
132 Instruction *InstCombiner::FoldPHIArgGEPIntoPHI(PHINode &PN) {
133 GetElementPtrInst *FirstInst =cast<GetElementPtrInst>(PN.getIncomingValue(0));
149 for (unsigned i = 1; i != PN.getNumIncomingValues(); ++i) {
150 GetElementPtrInst *GEP= dyn_cast<GetElementPtrInst>(PN.getIncomingValue(i));
210 FirstOp->getName()+".pn");
211 InsertNewInstBefore(NewPN, PN);
213 NewPN->addIncoming(FirstOp, PN.getIncomingBlock(0));
222 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
223 GetElementPtrInst *InGEP =cast<GetElementPtrInst>(PN.getIncomingValue(i));
224 BasicBlock *InBB = PN.getIncomingBlock(i);
287 Instruction *InstCombiner::FoldPHIArgLoadIntoPHI(PHINode &PN) {
288 LoadInst *FirstLI = cast<LoadInst>(PN.getIncomingValue(0));
306 if (FirstLI->getParent() != PN.getIncomingBlock(0) ||
318 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
319 LoadInst *LI = dyn_cast<LoadInst>(PN.getIncomingValue(i));
326 LI->getParent() != PN.getIncomingBlock(i) ||
349 PN.getNumIncomingValues(),
350 PN.getName()+".in");
353 NewPN->addIncoming(InVal, PN.getIncomingBlock(0));
356 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
357 Value *NewInVal = cast<LoadInst>(PN.getIncomingValue(i))->getOperand(0);
360 NewPN->addIncoming(NewInVal, PN.getIncomingBlock(i));
370 InsertNewInstBefore(NewPN, PN);
378 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
379 cast<LoadInst>(PN.getIncomingValue(i))->setVolatile(false);
391 Instruction *InstCombiner::FoldPHIArgOpIntoPHI(PHINode &PN) {
392 Instruction *FirstInst = cast<Instruction>(PN.getIncomingValue(0));
395 return FoldPHIArgGEPIntoPHI(PN);
397 return FoldPHIArgLoadIntoPHI(PN);
412 if (PN.getType()->isIntegerTy() && CastSrcTy->isIntegerTy()) {
413 if (!ShouldChangeType(PN.getType(), CastSrcTy))
421 return FoldPHIArgBinOpIntoPHI(PN);
435 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
436 Instruction *I = dyn_cast<Instruction>(PN.getIncomingValue(i));
457 PN.getNumIncomingValues(),
458 PN.getName()+".in");
461 NewPN->addIncoming(InVal, PN.getIncomingBlock(0));
464 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
465 Value *NewInVal = cast<Instruction>(PN.getIncomingValue(i))->getOperand(0);
468 NewPN->addIncoming(NewInVal, PN.getIncomingBlock(i));
478 InsertNewInstBefore(NewPN, PN);
485 PN.getType());
508 static bool DeadPHICycle(PHINode *PN,
510 if (PN->use_empty()) return true;
511 if (!PN->hasOneUse()) return false;
514 if (!PotentiallyDeadPHIs.insert(PN))
521 if (PHINode *PU = dyn_cast<PHINode>(PN->user_back()))
530 static bool PHIsEqualValue(PHINode *PN, Value *NonPhiInVal,
533 if (!ValueEqualPHIs.insert(PN))
542 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
543 Value *Op = PN->getIncomingValue(i);
561 PHIUsageRecord(unsigned pn, unsigned Sh, Instruction *User)
562 : PHIId(pn), Shift(Sh), Inst(User) {}
575 PHINode *PN; // The PHI that was lowered.
579 LoweredPHIRecord(PHINode *pn, unsigned Sh, Type *Ty)
580 : PN(pn), Shift(Sh), Width(Ty->getPrimitiveSizeInBits()) {}
583 LoweredPHIRecord(PHINode *pn, unsigned Sh)
584 : PN(pn), Shift(Sh), Width(0) {}
598 return DenseMapInfo<PHINode*>::getHashValue(Val.PN) ^ (Val.Shift>>3) ^
603 return LHS.PN == RHS.PN && LHS.Shift == RHS.Shift &&
634 PHINode *PN = PHIsToSlice[PHIId];
640 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
641 InvokeInst *II = dyn_cast<InvokeInst>(PN->getIncomingValue(i));
643 if (II->getParent() != PN->getIncomingBlock(i))
652 for (User *U : PN->users()) {
702 PHINode *PN = PHIsToSlice[PHIId];
710 if ((EltPHI = ExtractedVals[LoweredPHIRecord(PN, Offset, Ty)]) == nullptr) {
713 EltPHI = PHINode::Create(Ty, PN->getNumIncomingValues(),
714 PN->getName()+".off"+Twine(Offset), PN);
715 assert(EltPHI->getType() != PN->getType() &&
718 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
719 BasicBlock *Pred = PN->getIncomingBlock(i);
729 Value *InVal = PN->getIncomingValue(i);
730 if (InVal == PN) {
736 if (PHINode *InPHI = dyn_cast<PHINode>(PN)) {
760 if (PHINode *OldInVal = dyn_cast<PHINode>(PN->getIncomingValue(i)))
773 ExtractedVals[LoweredPHIRecord(PN, Offset, Ty)] = EltPHI;
790 Instruction *InstCombiner::visitPHINode(PHINode &PN) {
791 if (Value *V = SimplifyInstruction(&PN, DL, TLI))
792 return ReplaceInstUsesWith(PN, V);
796 if (isa<Instruction>(PN.getIncomingValue(0)) &&
797 isa<Instruction>(PN.getIncomingValue(1)) &&
798 cast<Instruction>(PN.getIncomingValue(0))->getOpcode() ==
799 cast<Instruction>(PN.getIncomingValue(1))->getOpcode() &&
802 PN.getIncomingValue(0)->hasOneUse())
803 if (Instruction *Result = FoldPHIArgOpIntoPHI(PN))
809 if (PN.hasOneUse()) {
810 Instruction *PHIUser = cast<Instruction>(PN.user_back());
813 PotentiallyDeadPHIs.insert(&PN);
815 return ReplaceInstUsesWith(PN, UndefValue::get(PN.getType()));
826 PHIUser->user_back() == &PN) {
827 return ReplaceInstUsesWith(PN, UndefValue::get(PN.getType()));
838 PN.getNumIncomingValues();
841 isa<PHINode>(PN.getIncomingValue(InValNo)))
845 Value *NonPhiInVal = PN.getIncomingValue(InValNo);
850 Value *OpVal = PN.getIncomingValue(InValNo);
860 if (PHIsEqualValue(&PN, NonPhiInVal, ValueEqualPHIs))
861 return ReplaceInstUsesWith(PN, NonPhiInVal);
870 PHINode *FirstPN = cast<PHINode>(PN.getParent()->begin());
871 if (&PN != FirstPN)
873 BasicBlock *BBA = PN.getIncomingBlock(i);
876 Value *VA = PN.getIncomingValue(i);
877 unsigned j = PN.getBasicBlockIndex(BBB);
878 Value *VB = PN.getIncomingValue(j);
879 PN.setIncomingBlock(i, BBB);
880 PN.setIncomingValue(i, VB);
881 PN.setIncomingBlock(j, BBA);
882 PN.setIncomingValue(j, VA);
883 // NOTE: Instcombine normally would want us to "return &PN" if we
894 if (PN.getType()->isIntegerTy() && DL &&
895 !DL->isLegalInteger(PN.getType()->getPrimitiveSizeInBits()))
896 if (Instruction *Res = SliceUpIllegalIntegerPHI(PN))