24 #define DEBUG_TYPE "integer-division"
58 Value *DvdXor =
Builder.CreateXor(Dividend, DividendSign);
60 Value *UDividend =
Builder.CreateSub(DvdXor, DividendSign);
61 Value *UDivisor =
Builder.CreateSub(DvsXor, DivisorSign);
66 if (
Instruction *URemInst = dyn_cast<Instruction>(URem))
67 Builder.SetInsertPoint(URemInst);
91 if (
Instruction *UDiv = dyn_cast<Instruction>(Quotient))
140 if (
Instruction *UDiv = dyn_cast<Instruction>(Q_Mag))
221 "udiv-loop-exit",
F, End);
223 "udiv-do-while",
F, End);
225 "udiv-preheader",
F, End);
249 Builder.SetInsertPoint(SpecialCases);
259 Value *RetVal =
Builder.CreateSelect(Ret0, Zero, Dividend);
261 Builder.CreateCondBr(EarlyRet, End, BB1);
274 Builder.CreateCondBr(SkipLoop, LoopExit, Preheader);
280 Builder.SetInsertPoint(Preheader);
303 Builder.SetInsertPoint(DoWhile);
320 Builder.CreateCondBr(Tmp12, LoopExit, DoWhile);
328 Builder.SetInsertPoint(LoopExit);
338 Builder.SetInsertPoint(End, End->begin());
376 Rem->
getOpcode() == Instruction::URem) &&
377 "Trying to expand remainder from a non-remainder function");
384 "Div of bitwidth other than 32 or 64 not supported");
387 if (Rem->
getOpcode() == Instruction::SRem) {
417 assert(UDiv->getOpcode() == Instruction::UDiv &&
"Non-udiv in expansion?");
434 Div->
getOpcode() == Instruction::UDiv) &&
435 "Trying to expand division from a non-division function");
442 "Div of bitwidth other than 32 or 64 not supported");
445 if (Div->
getOpcode() == Instruction::SDiv) {
486 Rem->
getOpcode() == Instruction::URem) &&
487 "Trying to expand remainder from a non-remainder function");
494 assert(RemTyBitWidth <= 32 &&
495 "Div of bitwidth greater than 32 not supported");
497 if (RemTyBitWidth == 32)
510 if (Rem->
getOpcode() == Instruction::SRem) {
513 ExtRem =
Builder.CreateSRem(ExtDividend, ExtDivisor);
517 ExtRem =
Builder.CreateURem(ExtDividend, ExtDivisor);
519 Trunc =
Builder.CreateTrunc(ExtRem, RemTy);
535 Rem->
getOpcode() == Instruction::URem) &&
536 "Trying to expand remainder from a non-remainder function");
543 assert(RemTyBitWidth <= 64 &&
"Div of bitwidth greater than 64 not supported");
545 if (RemTyBitWidth == 64)
558 if (Rem->
getOpcode() == Instruction::SRem) {
561 ExtRem =
Builder.CreateSRem(ExtDividend, ExtDivisor);
565 ExtRem =
Builder.CreateURem(ExtDividend, ExtDivisor);
567 Trunc =
Builder.CreateTrunc(ExtRem, RemTy);
584 Div->
getOpcode() == Instruction::UDiv) &&
585 "Trying to expand division from a non-division function");
592 assert(DivTyBitWidth <= 32 &&
"Div of bitwidth greater than 32 not supported");
594 if (DivTyBitWidth == 32)
607 if (Div->
getOpcode() == Instruction::SDiv) {
610 ExtDiv =
Builder.CreateSDiv(ExtDividend, ExtDivisor);
614 ExtDiv =
Builder.CreateUDiv(ExtDividend, ExtDivisor);
616 Trunc =
Builder.CreateTrunc(ExtDiv, DivTy);
632 Div->
getOpcode() == Instruction::UDiv) &&
633 "Trying to expand division from a non-division function");
640 assert(DivTyBitWidth <= 64 &&
641 "Div of bitwidth greater than 64 not supported");
643 if (DivTyBitWidth == 64)
656 if (Div->
getOpcode() == Instruction::SDiv) {
659 ExtDiv =
Builder.CreateSDiv(ExtDividend, ExtDivisor);
663 ExtDiv =
Builder.CreateUDiv(ExtDividend, ExtDivisor);
665 Trunc =
Builder.CreateTrunc(ExtDiv, DivTy);