Lines Matching defs:DU

754   Instruction *CloneIVUser(NarrowIVDefUse DU);
758 const SCEVAddRecExpr* GetExtendedOperandRecurrence(NarrowIVDefUse DU);
760 Instruction *WidenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter);
794 Instruction *WidenIV::CloneIVUser(NarrowIVDefUse DU) {
795 unsigned Opcode = DU.NarrowUse->getOpcode();
809 DEBUG(dbgs() << "Cloning IVUser: " << *DU.NarrowUse << "\n");
816 Value *LHS = (DU.NarrowUse->getOperand(0) == DU.NarrowDef) ? DU.WideDef :
817 getExtend(DU.NarrowUse->getOperand(0), WideType, IsSigned, DU.NarrowUse);
818 Value *RHS = (DU.NarrowUse->getOperand(1) == DU.NarrowDef) ? DU.WideDef :
819 getExtend(DU.NarrowUse->getOperand(1), WideType, IsSigned, DU.NarrowUse);
821 BinaryOperator *NarrowBO = cast<BinaryOperator>(DU.NarrowUse);
825 IRBuilder<> Builder(DU.NarrowUse);
840 const SCEVAddRecExpr* WidenIV::GetExtendedOperandRecurrence(NarrowIVDefUse DU) {
842 if (DU.NarrowUse->getOpcode() != Instruction::Add)
847 unsigned ExtendOperIdx = DU.NarrowUse->getOperand(0) == DU.NarrowDef ? 1 : 0;
848 assert(DU.NarrowUse->getOperand(1-ExtendOperIdx) == DU.NarrowDef && "bad DU");
852 cast<OverflowingBinaryOperator>(DU.NarrowUse);
855 SE->getSCEV(DU.NarrowUse->getOperand(ExtendOperIdx)), WideType);
858 SE->getSCEV(DU.NarrowUse->getOperand(ExtendOperIdx)), WideType);
868 SE->getAddExpr(SE->getSCEV(DU.WideDef), ExtendOperExpr));
903 static void truncateIVUse(NarrowIVDefUse DU, DominatorTree *DT) {
904 DEBUG(dbgs() << "INDVARS: Truncate IV " << *DU.WideDef
905 << " for user " << *DU.NarrowUse << "\n");
906 IRBuilder<> Builder(getInsertPointForUses(DU.NarrowUse, DU.NarrowDef, DT));
907 Value *Trunc = Builder.CreateTrunc(DU.WideDef, DU.NarrowDef->getType());
908 DU.NarrowUse->replaceUsesOfWith(DU.NarrowDef, Trunc);
913 Instruction *WidenIV::WidenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter) {
916 if (PHINode *UsePhi = dyn_cast<PHINode>(DU.NarrowUse)) {
922 truncateIVUse(DU, DT);
925 PHINode::Create(DU.WideDef->getType(), 1, UsePhi->getName() + ".wide",
927 WidePhi->addIncoming(DU.WideDef, UsePhi->getIncomingBlock(0));
929 Value *Trunc = Builder.CreateTrunc(WidePhi, DU.NarrowDef->getType());
939 if (IsSigned ? isa<SExtInst>(DU.NarrowUse) : isa<ZExtInst>(DU.NarrowUse)) {
940 Value *NewDef = DU.WideDef;
941 if (DU.NarrowUse->getType() != WideType) {
942 unsigned CastWidth = SE->getTypeSizeInBits(DU.NarrowUse->getType());
946 IRBuilder<> Builder(DU.NarrowUse);
947 NewDef = Builder.CreateTrunc(DU.WideDef, DU.NarrowUse->getType());
954 << " not wide enough to subsume " << *DU.NarrowUse << "\n");
955 DU.NarrowUse->replaceUsesOfWith(DU.NarrowDef, DU.WideDef);
956 NewDef = DU.NarrowUse;
959 if (NewDef != DU.NarrowUse) {
960 DEBUG(dbgs() << "INDVARS: eliminating " << *DU.NarrowUse
961 << " replaced by " << *DU.WideDef << "\n");
963 DU.NarrowUse->replaceAllUsesWith(NewDef);
964 DeadInsts.push_back(DU.NarrowUse);
977 const SCEVAddRecExpr *WideAddRec = GetWideRecurrence(DU.NarrowUse);
979 WideAddRec = GetExtendedOperandRecurrence(DU);
985 truncateIVUse(DU, DT);
990 assert(DU.NarrowUse != DU.NarrowUse->getParent()->getTerminator() &&
997 && Rewriter.hoistIVInc(WideInc, DU.NarrowUse))
1000 WideUse = CloneIVUser(DU);
1097 NarrowIVDefUse DU = NarrowIVUsers.pop_back_val();
1101 Instruction *WideUse = WidenIVUse(DU, Rewriter);
1105 pushNarrowIVUsers(DU.NarrowUse, WideUse);
1108 if (DU.NarrowDef->use_empty())
1109 DeadInsts.push_back(DU.NarrowDef);