25 #define DEBUG_TYPE "integer-division"
59 Value *DvdXor =
Builder.CreateXor(Dividend, DividendSign);
61 Value *UDividend =
Builder.CreateSub(DvdXor, DividendSign);
62 Value *UDivisor =
Builder.CreateSub(DvsXor, DivisorSign);
67 if (
Instruction *URemInst = dyn_cast<Instruction>(URem))
68 Builder.SetInsertPoint(URemInst);
92 if (
Instruction *UDiv = dyn_cast<Instruction>(Quotient))
141 if (
Instruction *UDiv = dyn_cast<Instruction>(Q_Mag))
222 "udiv-loop-exit",
F, End);
224 "udiv-do-while",
F, End);
226 "udiv-preheader",
F, End);
250 Builder.SetInsertPoint(SpecialCases);
260 Value *RetVal =
Builder.CreateSelect(Ret0, Zero, Dividend);
262 Builder.CreateCondBr(EarlyRet, End, BB1);
275 Builder.CreateCondBr(SkipLoop, LoopExit, Preheader);
281 Builder.SetInsertPoint(Preheader);
304 Builder.SetInsertPoint(DoWhile);
321 Builder.CreateCondBr(Tmp12, LoopExit, DoWhile);
329 Builder.SetInsertPoint(LoopExit);
339 Builder.SetInsertPoint(End, End->begin());
377 Rem->
getOpcode() == Instruction::URem) &&
378 "Trying to expand remainder from a non-remainder function");
385 "Div of bitwidth other than 32 or 64 not supported");
388 if (Rem->
getOpcode() == Instruction::SRem) {
418 assert(UDiv->getOpcode() == Instruction::UDiv &&
"Non-udiv in expansion?");
435 Div->
getOpcode() == Instruction::UDiv) &&
436 "Trying to expand division from a non-division function");
443 "Div of bitwidth other than 32 or 64 not supported");
446 if (Div->
getOpcode() == Instruction::SDiv) {
487 Rem->
getOpcode() == Instruction::URem) &&
488 "Trying to expand remainder from a non-remainder function");
495 assert(RemTyBitWidth <= 32 &&
496 "Div of bitwidth greater than 32 not supported");
498 if (RemTyBitWidth == 32)
511 if (Rem->
getOpcode() == Instruction::SRem) {
514 ExtRem =
Builder.CreateSRem(ExtDividend, ExtDivisor);
518 ExtRem =
Builder.CreateURem(ExtDividend, ExtDivisor);
520 Trunc =
Builder.CreateTrunc(ExtRem, RemTy);
536 Rem->
getOpcode() == Instruction::URem) &&
537 "Trying to expand remainder from a non-remainder function");
544 assert(RemTyBitWidth <= 64 &&
"Div of bitwidth greater than 64 not supported");
546 if (RemTyBitWidth == 64)
559 if (Rem->
getOpcode() == Instruction::SRem) {
562 ExtRem =
Builder.CreateSRem(ExtDividend, ExtDivisor);
566 ExtRem =
Builder.CreateURem(ExtDividend, ExtDivisor);
568 Trunc =
Builder.CreateTrunc(ExtRem, RemTy);
585 Div->
getOpcode() == Instruction::UDiv) &&
586 "Trying to expand division from a non-division function");
593 assert(DivTyBitWidth <= 32 &&
"Div of bitwidth greater than 32 not supported");
595 if (DivTyBitWidth == 32)
608 if (Div->
getOpcode() == Instruction::SDiv) {
611 ExtDiv =
Builder.CreateSDiv(ExtDividend, ExtDivisor);
615 ExtDiv =
Builder.CreateUDiv(ExtDividend, ExtDivisor);
617 Trunc =
Builder.CreateTrunc(ExtDiv, DivTy);
633 Div->
getOpcode() == Instruction::UDiv) &&
634 "Trying to expand division from a non-division function");
641 assert(DivTyBitWidth <= 64 &&
642 "Div of bitwidth greater than 64 not supported");
644 if (DivTyBitWidth == 64)
657 if (Div->
getOpcode() == Instruction::SDiv) {
660 ExtDiv =
Builder.CreateSDiv(ExtDividend, ExtDivisor);
664 ExtDiv =
Builder.CreateUDiv(ExtDividend, ExtDivisor);
666 Trunc =
Builder.CreateTrunc(ExtDiv, DivTy);