Lines Matching refs:DU
896 Instruction *cloneIVUser(NarrowIVDefUse DU, const SCEVAddRecExpr *WideAR);
897 Instruction *cloneArithmeticIVUser(NarrowIVDefUse DU,
899 Instruction *cloneBitwiseIVUser(NarrowIVDefUse DU);
903 const SCEVAddRecExpr* getExtendedOperandRecurrence(NarrowIVDefUse DU);
908 Instruction *widenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter);
910 bool widenLoopCompare(NarrowIVDefUse DU);
944 Instruction *WidenIV::cloneIVUser(NarrowIVDefUse DU,
946 unsigned Opcode = DU.NarrowUse->getOpcode();
954 return cloneArithmeticIVUser(DU, WideAR);
962 return cloneBitwiseIVUser(DU);
966 Instruction *WidenIV::cloneBitwiseIVUser(NarrowIVDefUse DU) {
967 Instruction *NarrowUse = DU.NarrowUse;
968 Instruction *NarrowDef = DU.NarrowDef;
969 Instruction *WideDef = DU.WideDef;
995 Instruction *WidenIV::cloneArithmeticIVUser(NarrowIVDefUse DU,
997 Instruction *NarrowUse = DU.NarrowUse;
998 Instruction *NarrowDef = DU.NarrowDef;
999 Instruction *WideDef = DU.WideDef;
1103 const SCEVAddRecExpr* WidenIV::getExtendedOperandRecurrence(NarrowIVDefUse DU) {
1106 const unsigned OpCode = DU.NarrowUse->getOpcode();
1115 DU.NarrowUse->getOperand(0) == DU.NarrowDef ? 1 : 0;
1116 assert(DU.NarrowUse->getOperand(1-ExtendOperIdx) == DU.NarrowDef && "bad DU");
1120 cast<OverflowingBinaryOperator>(DU.NarrowUse);
1123 SE->getSCEV(DU.NarrowUse->getOperand(ExtendOperIdx)), WideType);
1126 SE->getSCEV(DU.NarrowUse->getOperand(ExtendOperIdx)), WideType);
1135 const SCEV *lhs = SE->getSCEV(DU.WideDef);
1177 static void truncateIVUse(NarrowIVDefUse DU, DominatorTree *DT, LoopInfo *LI) {
1178 DEBUG(dbgs() << "INDVARS: Truncate IV " << *DU.WideDef
1179 << " for user " << *DU.NarrowUse << "\n");
1181 getInsertPointForUses(DU.NarrowUse, DU.NarrowDef, DT, LI));
1182 Value *Trunc = Builder.CreateTrunc(DU.WideDef, DU.NarrowDef->getType());
1183 DU.NarrowUse->replaceUsesOfWith(DU.NarrowDef, Trunc);
1189 bool WidenIV::widenLoopCompare(NarrowIVDefUse DU) {
1190 ICmpInst *Cmp = dyn_cast<ICmpInst>(DU.NarrowUse);
1209 if (!(DU.NeverNegative || IsSigned == Cmp->isSigned()))
1212 Value *Op = Cmp->getOperand(Cmp->getOperand(0) == DU.NarrowDef ? 1 : 0);
1219 getInsertPointForUses(DU.NarrowUse, DU.NarrowDef, DT, LI));
1220 DU.NarrowUse->replaceUsesOfWith(DU.NarrowDef, DU.WideDef);
1225 DU.NarrowUse->replaceUsesOfWith(Op, ExtOp);
1232 Instruction *WidenIV::widenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter) {
1235 if (PHINode *UsePhi = dyn_cast<PHINode>(DU.NarrowUse)) {
1241 truncateIVUse(DU, DT, LI);
1244 PHINode::Create(DU.WideDef->getType(), 1, UsePhi->getName() + ".wide",
1246 WidePhi->addIncoming(DU.WideDef, UsePhi->getIncomingBlock(0));
1248 Value *Trunc = Builder.CreateTrunc(WidePhi, DU.NarrowDef->getType());
1258 if (IsSigned ? isa<SExtInst>(DU.NarrowUse) : isa<ZExtInst>(DU.NarrowUse)) {
1259 Value *NewDef = DU.WideDef;
1260 if (DU.NarrowUse->getType() != WideType) {
1261 unsigned CastWidth = SE->getTypeSizeInBits(DU.NarrowUse->getType());
1265 IRBuilder<> Builder(DU.NarrowUse);
1266 DU.WideDef, DU.NarrowUse->getType());
1273 << " not wide enough to subsume " << *DU.NarrowUse << "\n");
1274 DU.NarrowUse->replaceUsesOfWith(DU.NarrowDef, DU.WideDef);
1275 NewDef = DU.NarrowUse;
1278 if (NewDef != DU.NarrowUse) {
1279 DEBUG(dbgs() << "INDVARS: eliminating " << *DU.NarrowUse
1280 << " replaced by " << *DU.WideDef << "\n");
1282 DU.NarrowUse->replaceAllUsesWith(NewDef);
1283 DeadInsts.emplace_back(DU.NarrowUse);
1296 const SCEVAddRecExpr *WideAddRec = getWideRecurrence(DU.NarrowUse);
1298 WideAddRec = getExtendedOperandRecurrence(DU);
1303 if (widenLoopCompare(DU))
1309 truncateIVUse(DU, DT, LI);
1314 assert(DU.NarrowUse != DU.NarrowUse->getParent()->getTerminator() &&
1321 && Rewriter.hoistIVInc(WideInc, DU.NarrowUse))
1324 WideUse = cloneIVUser(DU, WideAddRec);
1425 NarrowIVDefUse DU = NarrowIVUsers.pop_back_val();
1429 Instruction *WideUse = widenIVUse(DU, Rewriter);
1433 pushNarrowIVUsers(DU.NarrowUse, WideUse);
1436 if (DU.NarrowDef->use_empty())
1437 DeadInsts.emplace_back(DU.NarrowDef);