OLD | NEW |
1 //===- InstCombineMulDivRem.cpp -------------------------------------------===// | 1 //===- InstCombineMulDivRem.cpp -------------------------------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file implements the visit functions for mul, fmul, sdiv, udiv, fdiv, | 10 // This file implements the visit functions for mul, fmul, sdiv, udiv, fdiv, |
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 T->setDebugLoc(I.getDebugLoc()); | 518 T->setDebugLoc(I.getDebugLoc()); |
519 | 519 |
520 Instruction *R = BinaryOperator::CreateFMul(T, Y); | 520 Instruction *R = BinaryOperator::CreateFMul(T, Y); |
521 R->copyFastMathFlags(&I); | 521 R->copyFastMathFlags(&I); |
522 return R; | 522 return R; |
523 } | 523 } |
524 } | 524 } |
525 } | 525 } |
526 | 526 |
527 // B * (uitofp i1 C) -> select C, B, 0 | 527 // B * (uitofp i1 C) -> select C, B, 0 |
528 if (I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) { | 528 if(I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) { |
529 Value *LHS = Op0, *RHS = Op1; | 529 Value *LHS=Op0, *RHS=Op1; |
530 Value *B, *C; | 530 Value *B, *C; |
531 if (!match(RHS, m_UIToFp(m_Value(C)))) | 531 if (!match(RHS, m_UIToFp(m_Value(C)))) |
532 std::swap(LHS, RHS); | 532 std::swap(LHS, RHS); |
533 | 533 |
534 if (match(RHS, m_UIToFp(m_Value(C))) && C->getType()->isIntegerTy(1)) { | 534 if (match(RHS, m_UIToFp(m_Value(C)))) { |
535 B = LHS; | 535 B=LHS; |
536 Value *Zero = ConstantFP::getNegativeZero(B->getType()); | 536 Value *Zero = ConstantFP::getNegativeZero(B->getType()); |
537 return SelectInst::Create(C, B, Zero); | 537 return SelectInst::Create(C, B, Zero); |
538 } | 538 } |
539 } | 539 } |
540 | 540 |
541 // A * (1 - uitofp i1 C) -> select C, 0, A | 541 // A * (1 - uitofp i1 C) -> select C, 0, A |
542 if (I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) { | 542 if(I.hasNoNaNs() && I.hasNoInfs() && I.hasNoSignedZeros()) { |
543 Value *LHS = Op0, *RHS = Op1; | 543 Value *LHS=Op0, *RHS=Op1; |
544 Value *A, *C; | 544 Value *A, *C; |
545 if (!match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C))))) | 545 if (!match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C))))) |
546 std::swap(LHS, RHS); | 546 std::swap(LHS, RHS); |
547 | 547 |
548 if (match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C)))) && | 548 if (match(RHS, m_FSub(m_FPOne(), m_UIToFp(m_Value(C))))) { |
549 C->getType()->isIntegerTy(1)) { | 549 A=LHS; |
550 A = LHS; | 550 Value *Zero = ConstantFP::getNegativeZero(A->getType()); |
551 Value *Zero = ConstantFP::getNegativeZero(A->getType()); | 551 return SelectInst::Create(C, Zero, A); |
552 return SelectInst::Create(C, Zero, A); | 552 } |
553 } | |
554 } | 553 } |
555 | 554 |
556 if (!isa<Constant>(Op1)) | 555 if (!isa<Constant>(Op1)) |
557 std::swap(Opnd0, Opnd1); | 556 std::swap(Opnd0, Opnd1); |
558 else | 557 else |
559 break; | 558 break; |
560 } | 559 } |
561 | 560 |
562 return Changed ? &I : 0; | 561 return Changed ? &I : 0; |
563 } | 562 } |
(...skipping 573 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1137 | 1136 |
1138 if (Value *V = SimplifyFRemInst(Op0, Op1, TD)) | 1137 if (Value *V = SimplifyFRemInst(Op0, Op1, TD)) |
1139 return ReplaceInstUsesWith(I, V); | 1138 return ReplaceInstUsesWith(I, V); |
1140 | 1139 |
1141 // Handle cases involving: rem X, (select Cond, Y, Z) | 1140 // Handle cases involving: rem X, (select Cond, Y, Z) |
1142 if (isa<SelectInst>(Op1) && SimplifyDivRemOfSelect(I)) | 1141 if (isa<SelectInst>(Op1) && SimplifyDivRemOfSelect(I)) |
1143 return &I; | 1142 return &I; |
1144 | 1143 |
1145 return 0; | 1144 return 0; |
1146 } | 1145 } |
OLD | NEW |