Home | History | Annotate | Download | only in InstCombine

Lines Matching refs:PN

24 Instruction *InstCombiner::FoldPHIArgBinOpIntoPHI(PHINode &PN) {
25 Instruction *FirstInst = cast<Instruction>(PN.getIncomingValue(0));
44 for (unsigned i = 1; i != PN.getNumIncomingValues(); ++i) {
45 Instruction *I = dyn_cast<Instruction>(PN.getIncomingValue(i));
83 NewLHS = PHINode::Create(LHSType, PN.getNumIncomingValues(),
84 FirstInst->getOperand(0)->getName() + ".pn");
85 NewLHS->addIncoming(InLHS, PN.getIncomingBlock(0));
86 InsertNewInstBefore(NewLHS, PN);
91 NewRHS = PHINode::Create(RHSType, PN.getNumIncomingValues(),
92 FirstInst->getOperand(1)->getName() + ".pn");
93 NewRHS->addIncoming(InRHS, PN.getIncomingBlock(0));
94 InsertNewInstBefore(NewRHS, PN);
100 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
101 Instruction *InInst = cast<Instruction>(PN.getIncomingValue(i));
104 NewLHS->addIncoming(NewInLHS, PN.getIncomingBlock(i));
108 NewRHS->addIncoming(NewInRHS, PN.getIncomingBlock(i));
130 Instruction *InstCombiner::FoldPHIArgGEPIntoPHI(PHINode &PN) {
131 GetElementPtrInst *FirstInst =cast<GetElementPtrInst>(PN.getIncomingValue(0));
147 for (unsigned i = 1; i != PN.getNumIncomingValues(); ++i) {
148 GetElementPtrInst *GEP= dyn_cast<GetElementPtrInst>(PN.getIncomingValue(i));
208 FirstOp->getName()+".pn");
209 InsertNewInstBefore(NewPN, PN);
211 NewPN->addIncoming(FirstOp, PN.getIncomingBlock(0));
220 for (unsigned i = 1, e = PN.getNumIncomingValues(); i != e; ++i) {
221 GetElementPtrInst *InGEP =cast<GetElementPtrInst>(PN.getIncomingValue(i));
222 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 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->use_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 &&
636 PHINode *PN = PHIsToSlice[PHIId];
642 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
643 InvokeInst *II = dyn_cast<InvokeInst>(PN->getIncomingValue(i));
645 if (II->getParent() != PN->getIncomingBlock(i))
655 for (Value::use_iterator UI = PN->use_begin(), E = PN->use_end();
706 PHINode *PN = PHIsToSlice[PHIId];
714 if ((EltPHI = ExtractedVals[LoweredPHIRecord(PN, Offset, Ty)]) == 0) {
717 EltPHI = PHINode::Create(Ty, PN->getNumIncomingValues(),
718 PN->getName()+".off"+Twine(Offset), PN);
719 assert(EltPHI->getType() != PN->getType() &&
722 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
723 BasicBlock *Pred = PN->getIncomingBlock(i);
733 Value *InVal = PN->getIncomingValue(i);
734 if (InVal == PN) {
740 if (PHINode *InPHI = dyn_cast<PHINode>(PN)) {
764 if (PHINode *OldInVal = dyn_cast<PHINode>(PN->getIncomingValue(i)))
777 ExtractedVals[LoweredPHIRecord(PN, Offset, Ty)] = EltPHI;
794 Instruction *InstCombiner::visitPHINode(PHINode &PN) {
795 if (Value *V = SimplifyInstruction(&PN, TD))
796 return ReplaceInstUsesWith(PN, V);
800 if (isa<Instruction>(PN.getIncomingValue(0)) &&
801 isa<Instruction>(PN.getIncomingValue(1)) &&
802 cast<Instruction>(PN.getIncomingValue(0))->getOpcode() ==
803 cast<Instruction>(PN.getIncomingValue(1))->getOpcode() &&
806 PN.getIncomingValue(0)->hasOneUse())
807 if (Instruction *Result = FoldPHIArgOpIntoPHI(PN))
813 if (PN.hasOneUse()) {
814 Instruction *PHIUser = cast<Instruction>(PN.use_back());
817 PotentiallyDeadPHIs.insert(&PN);
819 return ReplaceInstUsesWith(PN, UndefValue::get(PN.getType()));
830 PHIUser->use_back() == &PN) {
831 return ReplaceInstUsesWith(PN, UndefValue::get(PN.getType()));
842 unsigned InValNo = 0, NumIncomingVals = PN.getNumIncomingValues();
845 isa<PHINode>(PN.getIncomingValue(InValNo)))
849 Value *NonPhiInVal = PN.getIncomingValue(InValNo);
854 Value *OpVal = PN.getIncomingValue(InValNo);
864 if (PHIsEqualValue(&PN, NonPhiInVal, ValueEqualPHIs))
865 return ReplaceInstUsesWith(PN, NonPhiInVal);
874 PHINode *FirstPN = cast<PHINode>(PN.getParent()->begin());
875 if (&PN != FirstPN)
877 BasicBlock *BBA = PN.getIncomingBlock(i);
880 Value *VA = PN.getIncomingValue(i);
881 unsigned j = PN.getBasicBlockIndex(BBB);
882 Value *VB = PN.getIncomingValue(j);
883 PN.setIncomingBlock(i, BBB);
884 PN.setIncomingValue(i, VB);
885 PN.setIncomingBlock(j, BBA);
886 PN.setIncomingValue(j, VA);
887 // NOTE: Instcombine normally would want us to "return &PN" if we
898 if (PN.getType()->isIntegerTy() && TD &&
899 !TD->isLegalInteger(PN.getType()->getPrimitiveSizeInBits()))
900 if (Instruction *Res = SliceUpIllegalIntegerPHI(PN))