InstCombineAddSub.cpp revision 694488f4770468f03b974180631c0fbfa21b28cc
153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//===- InstCombineAddSub.cpp ----------------------------------------------===//
253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//
353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//                     The LLVM Compiler Infrastructure
453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//
553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner// This file is distributed under the University of Illinois Open Source
653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner// License. See LICENSE.TXT for details.
753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//
853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//===----------------------------------------------------------------------===//
953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//
1053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner// This file implements the visit functions for add, fadd, sub, and fsub.
1153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//
1253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//===----------------------------------------------------------------------===//
1353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
1453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner#include "InstCombine.h"
1553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner#include "llvm/Analysis/InstructionSimplify.h"
1653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner#include "llvm/Target/TargetData.h"
1753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner#include "llvm/Support/GetElementPtrTypeIterator.h"
1853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner#include "llvm/Support/PatternMatch.h"
1953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattnerusing namespace llvm;
2053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattnerusing namespace PatternMatch;
2153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
2253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// AddOne - Add one to a ConstantInt.
2353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattnerstatic Constant *AddOne(Constant *C) {
2453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return ConstantExpr::getAdd(C, ConstantInt::get(C->getType(), 1));
2553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
2653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// SubOne - Subtract one from a ConstantInt.
2753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattnerstatic Constant *SubOne(ConstantInt *C) {
2853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return ConstantInt::get(C->getContext(), C->getValue()-1);
2953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
3053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
3153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
3253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner// dyn_castFoldableMul - If this value is a multiply that can be folded into
3353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner// other computations (because it has a constant operand), return the
3453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner// non-constant operand of the multiply, and set CST to point to the multiplier.
3553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner// Otherwise, return null.
3653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner//
3753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattnerstatic inline Value *dyn_castFoldableMul(Value *V, ConstantInt *&CST) {
383168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner  if (!V->hasOneUse() || !V->getType()->isInteger())
393168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner    return 0;
403168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner
413168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner  Instruction *I = dyn_cast<Instruction>(V);
423168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner  if (I == 0) return 0;
433168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner
443168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner  if (I->getOpcode() == Instruction::Mul)
453168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner    if ((CST = dyn_cast<ConstantInt>(I->getOperand(1))))
463168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner      return I->getOperand(0);
473168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner  if (I->getOpcode() == Instruction::Shl)
483168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner    if ((CST = dyn_cast<ConstantInt>(I->getOperand(1)))) {
493168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner      // The multiplier is really 1 << CST.
503168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner      uint32_t BitWidth = cast<IntegerType>(V->getType())->getBitWidth();
513168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner      uint32_t CSTVal = CST->getLimitedValue(BitWidth);
523168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner      CST = ConstantInt::get(V->getType()->getContext(),
533168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner                             APInt(BitWidth, 1).shl(CSTVal));
543168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner      return I->getOperand(0);
5553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
5653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return 0;
5753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
5853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
5953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
6053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// WillNotOverflowSignedAdd - Return true if we can prove that:
6153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner///    (sext (add LHS, RHS))  === (add (sext LHS), (sext RHS))
6253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// This basically requires proving that the add in the original type would not
6353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// overflow to change the sign bit or have a carry out.
6453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattnerbool InstCombiner::WillNotOverflowSignedAdd(Value *LHS, Value *RHS) {
6553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // There are different heuristics we can use for this.  Here are some simple
6653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // ones.
6753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
6853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // Add has the property that adding any two 2's complement numbers can only
6953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // have one carry bit which can change a sign.  As such, if LHS and RHS each
7053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // have at least two sign bits, we know that the addition of the two values
7153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // will sign extend fine.
7253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (ComputeNumSignBits(LHS) > 1 && ComputeNumSignBits(RHS) > 1)
7353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return true;
7453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
7553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
7653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // If one of the operands only has one non-zero bit, and if the other operand
7753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // has a known-zero bit in a more significant place than it (not including the
7853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // sign bit) the ripple may go up to and fill the zero, but won't change the
7953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // sign.  For example, (X & ~4) + 1.
8053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
8153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // TODO: Implement.
8253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
8353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return false;
8453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
8553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
8653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris LattnerInstruction *InstCombiner::visitAdd(BinaryOperator &I) {
8753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  bool Changed = SimplifyCommutative(I);
8853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
8953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
9053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Value *V = SimplifyAddInst(LHS, RHS, I.hasNoSignedWrap(),
9153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                 I.hasNoUnsignedWrap(), TD))
9253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return ReplaceInstUsesWith(I, V);
9353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
9453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
9553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
9653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (ConstantInt *CI = dyn_cast<ConstantInt>(RHSC)) {
9753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // X + (signbit) --> X ^ signbit
9853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      const APInt& Val = CI->getValue();
9953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      uint32_t BitWidth = Val.getBitWidth();
10053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Val == APInt::getSignBit(BitWidth))
10153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateXor(LHS, RHS);
10253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
10353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // See if SimplifyDemandedBits can simplify this.  This handles stuff like
10453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // (X & 254)+1 -> (X&254)|1
10553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (SimplifyDemandedInstructionBits(I))
10653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return &I;
10753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
10853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // zext(bool) + C -> bool ? C + 1 : C
10953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (ZExtInst *ZI = dyn_cast<ZExtInst>(LHS))
11053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (ZI->getSrcTy() == Type::getInt1Ty(I.getContext()))
11153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          return SelectInst::Create(ZI->getOperand(0), AddOne(CI), CI);
11253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
11353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
11453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (isa<PHINode>(LHS))
11553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Instruction *NV = FoldOpIntoPhi(I))
11653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return NV;
11753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
11853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    ConstantInt *XorRHS = 0;
11953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *XorLHS = 0;
12053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (isa<ConstantInt>(RHSC) &&
12153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        match(LHS, m_Xor(m_Value(XorLHS), m_ConstantInt(XorRHS)))) {
12253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      uint32_t TySizeBits = I.getType()->getScalarSizeInBits();
12353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      const APInt& RHSVal = cast<ConstantInt>(RHSC)->getValue();
12453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
12553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      uint32_t Size = TySizeBits / 2;
12653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      APInt C0080Val(APInt(TySizeBits, 1ULL).shl(Size - 1));
12753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      APInt CFF80Val(-C0080Val);
12853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      do {
12953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (TySizeBits > Size) {
13053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          // If we have ADD(XOR(AND(X, 0xFF), 0x80), 0xF..F80), it's a sext.
13153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          // If we have ADD(XOR(AND(X, 0xFF), 0xF..F80), 0x80), it's a sext.
13253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          if ((RHSVal == CFF80Val && XorRHS->getValue() == C0080Val) ||
13353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              (RHSVal == C0080Val && XorRHS->getValue() == CFF80Val)) {
13453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            // This is a sign extend if the top bits are known zero.
13553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            if (!MaskedValueIsZero(XorLHS,
13653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                   APInt::getHighBitsSet(TySizeBits, TySizeBits - Size)))
13753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              Size = 0;  // Not a sign ext, but can't be any others either.
13853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            break;
13953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          }
14053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        }
14153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Size >>= 1;
14253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        C0080Val = APIntOps::lshr(C0080Val, Size);
14353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        CFF80Val = APIntOps::ashr(CFF80Val, Size);
14453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      } while (Size >= 1);
14553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
14653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // FIXME: This shouldn't be necessary. When the backends can handle types
14753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // with funny bit widths then this switch statement should be removed. It
14853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // is just here to get the size of the "middle" type back up to something
14953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // that the back ends can handle.
15053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      const Type *MiddleType = 0;
15153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      switch (Size) {
15253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        default: break;
15353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        case 32:
15453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        case 16:
15553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        case  8: MiddleType = IntegerType::get(I.getContext(), Size); break;
15653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
15753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (MiddleType) {
15853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewTrunc = Builder->CreateTrunc(XorLHS, MiddleType, "sext");
15953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return new SExtInst(NewTrunc, I.getType(), I.getName());
16053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
16153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
16253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
16353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
16411acaa374cdcebb161bf0de5f244265d78a749c1Benjamin Kramer  if (I.getType()->isInteger(1))
16553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return BinaryOperator::CreateXor(LHS, RHS);
16653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
16753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (I.getType()->isInteger()) {
16853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // X + X --> X << 1
16953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (LHS == RHS)
17053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateShl(LHS, ConstantInt::get(I.getType(), 1));
17153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
17253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Instruction *RHSI = dyn_cast<Instruction>(RHS)) {
17353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (RHSI->getOpcode() == Instruction::Sub)
17453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (LHS == RHSI->getOperand(1))                   // A + (B - A) --> B
17553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          return ReplaceInstUsesWith(I, RHSI->getOperand(0));
17653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
17753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Instruction *LHSI = dyn_cast<Instruction>(LHS)) {
17853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (LHSI->getOpcode() == Instruction::Sub)
17953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (RHS == LHSI->getOperand(1))                   // (B - A) + A --> B
18053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          return ReplaceInstUsesWith(I, LHSI->getOperand(0));
18153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
18253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
18353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
18453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // -A + B  -->  B - A
18553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // -A + -B  -->  -(A + B)
18653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Value *LHSV = dyn_castNegVal(LHS)) {
18753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (LHS->getType()->isIntOrIntVector()) {
18853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Value *RHSV = dyn_castNegVal(RHS)) {
18953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewAdd = Builder->CreateAdd(LHSV, RHSV, "sum");
19053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateNeg(NewAdd);
19153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
19253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
19353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
19453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return BinaryOperator::CreateSub(RHS, LHSV);
19553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
19653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
19753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // A + -B  -->  A - B
19853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (!isa<Constant>(RHS))
19953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Value *V = dyn_castNegVal(RHS))
20053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateSub(LHS, V);
20153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
20253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
20353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  ConstantInt *C2;
20453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Value *X = dyn_castFoldableMul(LHS, C2)) {
20553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (X == RHS)   // X*C + X --> X * (C+1)
20653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateMul(RHS, AddOne(C2));
20753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
20853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // X*C1 + X*C2 --> X * (C1+C2)
20953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    ConstantInt *C1;
21053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (X == dyn_castFoldableMul(RHS, C1))
21153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateMul(X, ConstantExpr::getAdd(C1, C2));
21253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
21353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
21453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // X + X*C --> X * (C+1)
21553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (dyn_castFoldableMul(RHS, C2) == LHS)
21653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return BinaryOperator::CreateMul(LHS, AddOne(C2));
21753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
21853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // X + ~X --> -1   since   ~X = -X-1
21953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (match(LHS, m_Not(m_Specific(RHS))) ||
22053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      match(RHS, m_Not(m_Specific(LHS))))
22153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return ReplaceInstUsesWith(I, Constant::getAllOnesValue(I.getType()));
22253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
22353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // A+B --> A|B iff A and B have no bits set in common.
22453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (const IntegerType *IT = dyn_cast<IntegerType>(I.getType())) {
22553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    APInt Mask = APInt::getAllOnesValue(IT->getBitWidth());
22653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    APInt LHSKnownOne(IT->getBitWidth(), 0);
22753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    APInt LHSKnownZero(IT->getBitWidth(), 0);
22853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    ComputeMaskedBits(LHS, Mask, LHSKnownZero, LHSKnownOne);
22953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (LHSKnownZero != 0) {
23053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      APInt RHSKnownOne(IT->getBitWidth(), 0);
23153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      APInt RHSKnownZero(IT->getBitWidth(), 0);
23253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      ComputeMaskedBits(RHS, Mask, RHSKnownZero, RHSKnownOne);
23353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
23453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // No bits in common -> bitwise or.
23553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if ((LHSKnownZero|RHSKnownZero).isAllOnesValue())
23653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateOr(LHS, RHS);
23753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
23853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
23953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
24053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // W*X + Y*Z --> W * (X+Z)  iff W == Y
24153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (I.getType()->isIntOrIntVector()) {
24253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *W, *X, *Y, *Z;
24353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (match(LHS, m_Mul(m_Value(W), m_Value(X))) &&
24453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        match(RHS, m_Mul(m_Value(Y), m_Value(Z)))) {
24553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (W != Y) {
24653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (W == Z) {
24753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          std::swap(Y, Z);
24853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        } else if (Y == X) {
24953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          std::swap(W, X);
25053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        } else if (X == Z) {
25153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          std::swap(Y, Z);
25253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          std::swap(W, X);
25353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        }
25453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
25553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
25653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (W == Y) {
25753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewAdd = Builder->CreateAdd(X, Z, LHS->getName());
25853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateMul(W, NewAdd);
25953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
26053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
26153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
26253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
26353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (ConstantInt *CRHS = dyn_cast<ConstantInt>(RHS)) {
26453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *X = 0;
26553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (match(LHS, m_Not(m_Value(X))))    // ~X + C --> (C-1) - X
26653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateSub(SubOne(CRHS), X);
26753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
26853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // (X & FF00) + xx00  -> (X+xx00) & FF00
26953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (LHS->hasOneUse() &&
27053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        match(LHS, m_And(m_Value(X), m_ConstantInt(C2)))) {
27153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Constant *Anded = ConstantExpr::getAnd(CRHS, C2);
27253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Anded == CRHS) {
27353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // See if all bits from the first bit set in the Add RHS up are included
27453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // in the mask.  First, get the rightmost bit.
27553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        const APInt &AddRHSV = CRHS->getValue();
27653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
27753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Form a mask of all bits from the lowest bit added through the top.
27853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        APInt AddRHSHighBits(~((AddRHSV & -AddRHSV)-1));
27953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
28053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // See if the and mask includes all of these bits.
28153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        APInt AddRHSHighBitsAnd(AddRHSHighBits & C2->getValue());
28253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
28353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (AddRHSHighBits == AddRHSHighBitsAnd) {
28453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          // Okay, the xform is safe.  Insert the new add pronto.
28553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          Value *NewAdd = Builder->CreateAdd(X, CRHS, LHS->getName());
28653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          return BinaryOperator::CreateAnd(NewAdd, C2);
28753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        }
28853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
28953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
29053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
29153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // Try to fold constant add into select arguments.
29253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (SelectInst *SI = dyn_cast<SelectInst>(LHS))
29353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Instruction *R = FoldOpIntoSelect(I, SI))
29453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return R;
29553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
29653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
29753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // add (select X 0 (sub n A)) A  -->  select X A n
29853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  {
29953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    SelectInst *SI = dyn_cast<SelectInst>(LHS);
30053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *A = RHS;
30153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (!SI) {
30253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      SI = dyn_cast<SelectInst>(RHS);
30353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      A = LHS;
30453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
30553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (SI && SI->hasOneUse()) {
30653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Value *TV = SI->getTrueValue();
30753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Value *FV = SI->getFalseValue();
30853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Value *N;
30953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
31053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // Can we fold the add into the argument of the select?
31153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // We check both true and false select arguments for a matching subtract.
31253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (match(FV, m_Zero()) &&
31353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          match(TV, m_Sub(m_Value(N), m_Specific(A))))
31453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Fold the add into the true select value.
31553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return SelectInst::Create(SI->getCondition(), N, A);
31653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (match(TV, m_Zero()) &&
31753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          match(FV, m_Sub(m_Value(N), m_Specific(A))))
31853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Fold the add into the false select value.
31953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return SelectInst::Create(SI->getCondition(), A, N);
32053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
32153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
32253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
32353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // Check for (add (sext x), y), see if we can merge this into an
32453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // integer add followed by a sext.
32553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (SExtInst *LHSConv = dyn_cast<SExtInst>(LHS)) {
32653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // (add (sext x), cst) --> (sext (add x, cst'))
32753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (ConstantInt *RHSC = dyn_cast<ConstantInt>(RHS)) {
32853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Constant *CI =
32953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        ConstantExpr::getTrunc(RHSC, LHSConv->getOperand(0)->getType());
33053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (LHSConv->hasOneUse() &&
33153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          ConstantExpr::getSExt(CI, I.getType()) == RHSC &&
33253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          WillNotOverflowSignedAdd(LHSConv->getOperand(0), CI)) {
33353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Insert the new, smaller add.
33453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewAdd = Builder->CreateNSWAdd(LHSConv->getOperand(0),
33553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                              CI, "addconv");
33653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return new SExtInst(NewAdd, I.getType());
33753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
33853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
33953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
34053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // (add (sext x), (sext y)) --> (sext (add int x, y))
34153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (SExtInst *RHSConv = dyn_cast<SExtInst>(RHS)) {
34253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // Only do this if x/y have the same type, if at last one of them has a
34353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // single use (so we don't increase the number of sexts), and if the
34453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // integer add will not overflow.
34553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (LHSConv->getOperand(0)->getType()==RHSConv->getOperand(0)->getType()&&
34653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          (LHSConv->hasOneUse() || RHSConv->hasOneUse()) &&
34753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          WillNotOverflowSignedAdd(LHSConv->getOperand(0),
34853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                   RHSConv->getOperand(0))) {
34953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Insert the new integer add.
35053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewAdd = Builder->CreateNSWAdd(LHSConv->getOperand(0),
3513168c7dd25193039b3dbf9ce6bb57c7da3e56f85Chris Lattner                                             RHSConv->getOperand(0), "addconv");
35253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return new SExtInst(NewAdd, I.getType());
35353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
35453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
35553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
35653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
35753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return Changed ? &I : 0;
35853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
35953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
36053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris LattnerInstruction *InstCombiner::visitFAdd(BinaryOperator &I) {
36153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  bool Changed = SimplifyCommutative(I);
36253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
36353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
36453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
36553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // X + 0 --> X
36653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (ConstantFP *CFP = dyn_cast<ConstantFP>(RHSC)) {
36753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (CFP->isExactlyValue(ConstantFP::getNegativeZero
36853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                              (I.getType())->getValueAPF()))
36953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return ReplaceInstUsesWith(I, LHS);
37053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
37153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
37253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (isa<PHINode>(LHS))
37353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Instruction *NV = FoldOpIntoPhi(I))
37453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return NV;
37553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
37653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
37753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // -A + B  -->  B - A
37853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // -A + -B  -->  -(A + B)
37953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Value *LHSV = dyn_castFNegVal(LHS))
38053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return BinaryOperator::CreateFSub(RHS, LHSV);
38153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
38253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // A + -B  -->  A - B
38353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (!isa<Constant>(RHS))
38453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Value *V = dyn_castFNegVal(RHS))
38553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateFSub(LHS, V);
38653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
38753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // Check for X+0.0.  Simplify it to X if we know X is not -0.0.
38853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (ConstantFP *CFP = dyn_cast<ConstantFP>(RHS))
38953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (CFP->getValueAPF().isPosZero() && CannotBeNegativeZero(LHS))
39053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return ReplaceInstUsesWith(I, LHS);
39153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
39253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // Check for (add double (sitofp x), y), see if we can merge this into an
39353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // integer add followed by a promotion.
39453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (SIToFPInst *LHSConv = dyn_cast<SIToFPInst>(LHS)) {
39553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // (add double (sitofp x), fpcst) --> (sitofp (add int x, intcst))
39653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // ... if the constant fits in the integer value.  This is useful for things
39753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // like (double)(x & 1234) + 4.0 -> (double)((X & 1234)+4) which no longer
39853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // requires a constant pool load, and generally allows the add to be better
39953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // instcombined.
40053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (ConstantFP *CFP = dyn_cast<ConstantFP>(RHS)) {
40153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Constant *CI =
40253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      ConstantExpr::getFPToSI(CFP, LHSConv->getOperand(0)->getType());
40353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (LHSConv->hasOneUse() &&
40453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          ConstantExpr::getSIToFP(CI, I.getType()) == CFP &&
40553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          WillNotOverflowSignedAdd(LHSConv->getOperand(0), CI)) {
40653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Insert the new integer add.
40753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewAdd = Builder->CreateNSWAdd(LHSConv->getOperand(0),
40853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                              CI, "addconv");
40953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return new SIToFPInst(NewAdd, I.getType());
41053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
41153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
41253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
41353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // (add double (sitofp x), (sitofp y)) --> (sitofp (add int x, y))
41453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (SIToFPInst *RHSConv = dyn_cast<SIToFPInst>(RHS)) {
41553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // Only do this if x/y have the same type, if at last one of them has a
41653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // single use (so we don't increase the number of int->fp conversions),
41753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // and if the integer add will not overflow.
41853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (LHSConv->getOperand(0)->getType()==RHSConv->getOperand(0)->getType()&&
41953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          (LHSConv->hasOneUse() || RHSConv->hasOneUse()) &&
42053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          WillNotOverflowSignedAdd(LHSConv->getOperand(0),
42153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                   RHSConv->getOperand(0))) {
42253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Insert the new integer add.
42353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewAdd = Builder->CreateNSWAdd(LHSConv->getOperand(0),
42453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                              RHSConv->getOperand(0),"addconv");
42553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return new SIToFPInst(NewAdd, I.getType());
42653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
42753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
42853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
42953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
43053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return Changed ? &I : 0;
43153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
43253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
43353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
43453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// EmitGEPOffset - Given a getelementptr instruction/constantexpr, emit the
43553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// code necessary to compute the offset from the base pointer (without adding
43653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// in the base pointer).  Return the result as a signed integer of intptr size.
43753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris LattnerValue *InstCombiner::EmitGEPOffset(User *GEP) {
43853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  TargetData &TD = *getTargetData();
43953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  gep_type_iterator GTI = gep_type_begin(GEP);
44053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  const Type *IntPtrTy = TD.getIntPtrType(GEP->getContext());
44153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  Value *Result = Constant::getNullValue(IntPtrTy);
44253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
44353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // Build a mask for high order bits.
44453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  unsigned IntPtrWidth = TD.getPointerSizeInBits();
44553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  uint64_t PtrSizeMask = ~0ULL >> (64-IntPtrWidth);
44653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
44753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  for (User::op_iterator i = GEP->op_begin() + 1, e = GEP->op_end(); i != e;
44853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner       ++i, ++GTI) {
44953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *Op = *i;
45053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    uint64_t Size = TD.getTypeAllocSize(GTI.getIndexedType()) & PtrSizeMask;
45153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (ConstantInt *OpC = dyn_cast<ConstantInt>(Op)) {
45253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (OpC->isZero()) continue;
45353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
45453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // Handle a struct index, which adds its field offset to the pointer.
45553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (const StructType *STy = dyn_cast<StructType>(*GTI)) {
45653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Size = TD.getStructLayout(STy)->getElementOffset(OpC->getZExtValue());
45753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
45853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Result = Builder->CreateAdd(Result,
45953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                    ConstantInt::get(IntPtrTy, Size),
46053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                    GEP->getName()+".offs");
46153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        continue;
46253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
46353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
46453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Constant *Scale = ConstantInt::get(IntPtrTy, Size);
46553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Constant *OC =
46653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              ConstantExpr::getIntegerCast(OpC, IntPtrTy, true /*SExt*/);
46753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Scale = ConstantExpr::getMul(OC, Scale);
46853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // Emit an add instruction.
46953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Result = Builder->CreateAdd(Result, Scale, GEP->getName()+".offs");
47053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      continue;
47153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
47253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // Convert to correct type.
47353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Op->getType() != IntPtrTy)
47453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Op = Builder->CreateIntCast(Op, IntPtrTy, true, Op->getName()+".c");
47553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Size != 1) {
47653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Constant *Scale = ConstantInt::get(IntPtrTy, Size);
47753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // We'll let instcombine(mul) convert this to a shl if possible.
47853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Op = Builder->CreateMul(Op, Scale, GEP->getName()+".idx");
47953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
48053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
48153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // Emit an add instruction.
48253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Result = Builder->CreateAdd(Op, Result, GEP->getName()+".offs");
48353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
48453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return Result;
48553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
48653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
48753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
48853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
48953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
49053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// Optimize pointer differences into the same array into a size.  Consider:
49153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner///  &A[10] - &A[0]: we should compile this to "10".  LHS/RHS are the pointer
49253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner/// operands to the ptrtoint instructions for the LHS/RHS of the subtract.
49353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner///
49453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris LattnerValue *InstCombiner::OptimizePointerDifference(Value *LHS, Value *RHS,
49553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                               const Type *Ty) {
49653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  assert(TD && "Must have target data info for this");
49753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
49853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // If LHS is a gep based on RHS or RHS is a gep based on LHS, we can optimize
49953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // this.
50053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  bool Swapped = false;
50153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  GetElementPtrInst *GEP = 0;
50253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  ConstantExpr *CstGEP = 0;
50353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
50453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // TODO: Could also optimize &A[i] - &A[j] -> "i-j", and "&A.foo[i] - &A.foo".
50553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // For now we require one side to be the base pointer "A" or a constant
50653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // expression derived from it.
50753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (GetElementPtrInst *LHSGEP = dyn_cast<GetElementPtrInst>(LHS)) {
50853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // (gep X, ...) - X
50953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (LHSGEP->getOperand(0) == RHS) {
51053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      GEP = LHSGEP;
51153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Swapped = false;
51253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(RHS)) {
51353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // (gep X, ...) - (ce_gep X, ...)
51453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (CE->getOpcode() == Instruction::GetElementPtr &&
51553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          LHSGEP->getOperand(0) == CE->getOperand(0)) {
51653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        CstGEP = CE;
51753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        GEP = LHSGEP;
51853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Swapped = false;
51953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
52053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
52153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
52253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
52353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (GetElementPtrInst *RHSGEP = dyn_cast<GetElementPtrInst>(RHS)) {
52453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // X - (gep X, ...)
52553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (RHSGEP->getOperand(0) == LHS) {
52653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      GEP = RHSGEP;
52753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      Swapped = true;
52853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(LHS)) {
52953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // (ce_gep X, ...) - (gep X, ...)
53053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (CE->getOpcode() == Instruction::GetElementPtr &&
53153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          RHSGEP->getOperand(0) == CE->getOperand(0)) {
53253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        CstGEP = CE;
53353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        GEP = RHSGEP;
53453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Swapped = true;
53553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
53653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
53753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
53853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
53953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (GEP == 0)
54053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return 0;
54153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
54253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // Emit the offset of the GEP and an intptr_t.
54353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  Value *Result = EmitGEPOffset(GEP);
54453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
54553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // If we had a constant expression GEP on the other side offsetting the
54653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // pointer, subtract it from the offset we have.
54753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (CstGEP) {
54853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *CstOffset = EmitGEPOffset(CstGEP);
54953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Result = Builder->CreateSub(Result, CstOffset);
55053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
55153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
55253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
55353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // If we have p - gep(p, ...)  then we have to negate the result.
55453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Swapped)
55553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Result = Builder->CreateNeg(Result, "diff.neg");
55653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
55753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return Builder->CreateIntCast(Result, Ty, true);
55853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
55953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
56053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
56153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris LattnerInstruction *InstCombiner::visitSub(BinaryOperator &I) {
56253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
56353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
56453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Op0 == Op1)                        // sub X, X  -> 0
56553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
56653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
56753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // If this is a 'B = x-(-A)', change to B = x+A.  This preserves NSW/NUW.
56853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Value *V = dyn_castNegVal(Op1)) {
56953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    BinaryOperator *Res = BinaryOperator::CreateAdd(Op0, V);
57053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Res->setHasNoSignedWrap(I.hasNoSignedWrap());
57153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Res->setHasNoUnsignedWrap(I.hasNoUnsignedWrap());
57253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return Res;
57353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
57453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
57553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (isa<UndefValue>(Op0))
57653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return ReplaceInstUsesWith(I, Op0);    // undef - X -> undef
57753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (isa<UndefValue>(Op1))
57853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return ReplaceInstUsesWith(I, Op1);    // X - undef -> undef
57911acaa374cdcebb161bf0de5f244265d78a749c1Benjamin Kramer  if (I.getType()->isInteger(1))
58053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return BinaryOperator::CreateXor(Op0, Op1);
58153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
58253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (ConstantInt *C = dyn_cast<ConstantInt>(Op0)) {
58353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // Replace (-1 - A) with (~A).
58453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (C->isAllOnesValue())
58553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateNot(Op1);
58653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
58753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // C - ~X == X + (1+C)
58853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *X = 0;
58953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (match(Op1, m_Not(m_Value(X))))
59053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateAdd(X, AddOne(C));
59153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
59253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // -(X >>u 31) -> (X >>s 31)
59353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // -(X >>s 31) -> (X >>u 31)
59453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (C->isZero()) {
59553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (BinaryOperator *SI = dyn_cast<BinaryOperator>(Op1)) {
59653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (SI->getOpcode() == Instruction::LShr) {
59753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          if (ConstantInt *CU = dyn_cast<ConstantInt>(SI->getOperand(1))) {
59853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            // Check to see if we are shifting out everything but the sign bit.
59953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            if (CU->getLimitedValue(SI->getType()->getPrimitiveSizeInBits()) ==
60053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                SI->getType()->getPrimitiveSizeInBits()-1) {
60153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              // Ok, the transformation is safe.  Insert AShr.
60253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              return BinaryOperator::Create(Instruction::AShr,
60353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                          SI->getOperand(0), CU, SI->getName());
60453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            }
60553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          }
60653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        } else if (SI->getOpcode() == Instruction::AShr) {
60753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          if (ConstantInt *CU = dyn_cast<ConstantInt>(SI->getOperand(1))) {
60853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            // Check to see if we are shifting out everything but the sign bit.
60953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            if (CU->getLimitedValue(SI->getType()->getPrimitiveSizeInBits()) ==
61053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                SI->getType()->getPrimitiveSizeInBits()-1) {
61153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              // Ok, the transformation is safe.  Insert LShr.
61253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              return BinaryOperator::CreateLShr(
61353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                          SI->getOperand(0), CU, SI->getName());
61453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            }
61553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          }
61653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        }
61753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
61853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
61953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
62053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // Try to fold constant sub into select arguments.
62153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (SelectInst *SI = dyn_cast<SelectInst>(Op1))
62253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Instruction *R = FoldOpIntoSelect(I, SI))
62353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return R;
62453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
62553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // C - zext(bool) -> bool ? C - 1 : C
62653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (ZExtInst *ZI = dyn_cast<ZExtInst>(Op1))
62753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (ZI->getSrcTy() == Type::getInt1Ty(I.getContext()))
62853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return SelectInst::Create(ZI->getOperand(0), SubOne(C), C);
62953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
63053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
63153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (BinaryOperator *Op1I = dyn_cast<BinaryOperator>(Op1)) {
63253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Op1I->getOpcode() == Instruction::Add) {
63353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Op1I->getOperand(0) == Op0)              // X-(X+Y) == -Y
63453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateNeg(Op1I->getOperand(1),
63553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                         I.getName());
63653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      else if (Op1I->getOperand(1) == Op0)         // X-(Y+X) == -Y
63753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateNeg(Op1I->getOperand(0),
63853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                         I.getName());
63953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      else if (ConstantInt *CI1 = dyn_cast<ConstantInt>(I.getOperand(0))) {
64053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (ConstantInt *CI2 = dyn_cast<ConstantInt>(Op1I->getOperand(1)))
64153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          // C1-(X+C2) --> (C1-C2)-X
64253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          return BinaryOperator::CreateSub(
64353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            ConstantExpr::getSub(CI1, CI2), Op1I->getOperand(0));
64453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
64553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
64653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
64753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Op1I->hasOneUse()) {
64853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // Replace (x - (y - z)) with (x + (z - y)) if the (y - z) subexpression
64953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // is not used by anyone else...
65053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      //
65153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Op1I->getOpcode() == Instruction::Sub) {
65253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Swap the two operands of the subexpr...
65353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *IIOp0 = Op1I->getOperand(0), *IIOp1 = Op1I->getOperand(1);
65453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Op1I->setOperand(0, IIOp1);
65553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Op1I->setOperand(1, IIOp0);
65653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
65753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        // Create the new top level add instruction...
65853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateAdd(Op0, Op1);
65953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
66053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
66153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // Replace (A - (A & B)) with (A & ~B) if this is the only use of (A&B)...
66253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      //
66353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Op1I->getOpcode() == Instruction::And &&
66453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          (Op1I->getOperand(0) == Op0 || Op1I->getOperand(1) == Op0)) {
66553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *OtherOp = Op1I->getOperand(Op1I->getOperand(0) == Op0);
66653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
66753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Value *NewNot = Builder->CreateNot(OtherOp, "B.not");
66853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateAnd(Op0, NewNot);
66953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
67053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
67153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // 0 - (X sdiv C)  -> (X sdiv -C)
67253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Op1I->getOpcode() == Instruction::SDiv)
67353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        if (ConstantInt *CSI = dyn_cast<ConstantInt>(Op0))
67453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          if (CSI->isZero())
67553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner            if (Constant *DivRHS = dyn_cast<Constant>(Op1I->getOperand(1)))
67653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner              return BinaryOperator::CreateSDiv(Op1I->getOperand(0),
67753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                          ConstantExpr::getNeg(DivRHS));
67853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
679694488f4770468f03b974180631c0fbfa21b28ccEli Friedman      // 0 - (C << X)  -> (-C << X)
680694488f4770468f03b974180631c0fbfa21b28ccEli Friedman      if (Op1I->getOpcode() == Instruction::Shl)
681694488f4770468f03b974180631c0fbfa21b28ccEli Friedman        if (ConstantInt *CSI = dyn_cast<ConstantInt>(Op0))
682694488f4770468f03b974180631c0fbfa21b28ccEli Friedman          if (CSI->isZero())
683694488f4770468f03b974180631c0fbfa21b28ccEli Friedman            if (Value *ShlLHSNeg = dyn_castNegVal(Op1I->getOperand(0)))
684694488f4770468f03b974180631c0fbfa21b28ccEli Friedman              return BinaryOperator::CreateShl(ShlLHSNeg, Op1I->getOperand(1));
685694488f4770468f03b974180631c0fbfa21b28ccEli Friedman
68653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      // X - X*C --> X * (1-C)
68753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      ConstantInt *C2 = 0;
68853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (dyn_castFoldableMul(Op1I, C2) == Op0) {
68953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        Constant *CP1 =
69053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner          ConstantExpr::getSub(ConstantInt::get(I.getType(), 1),
69153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                             C2);
69253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateMul(Op0, CP1);
69353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      }
69453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
69553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
69653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
69753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0)) {
69853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (Op0I->getOpcode() == Instruction::Add) {
69953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Op0I->getOperand(0) == Op1)             // (Y+X)-Y == X
70053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return ReplaceInstUsesWith(I, Op0I->getOperand(1));
70153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      else if (Op0I->getOperand(1) == Op1)        // (X+Y)-Y == X
70253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return ReplaceInstUsesWith(I, Op0I->getOperand(0));
70353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    } else if (Op0I->getOpcode() == Instruction::Sub) {
70453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Op0I->getOperand(0) == Op1)             // (X-Y)-X == -Y
70553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return BinaryOperator::CreateNeg(Op0I->getOperand(1),
70653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner                                         I.getName());
70753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    }
70853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
70953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
71053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  ConstantInt *C1;
71153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Value *X = dyn_castFoldableMul(Op0, C1)) {
71253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (X == Op1)  // X*C - X --> X * (C-1)
71353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateMul(Op1, SubOne(C1));
71453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
71553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    ConstantInt *C2;   // X*C1 - X*C2 -> X * (C1-C2)
71653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (X == dyn_castFoldableMul(Op1, C2))
71753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      return BinaryOperator::CreateMul(X, ConstantExpr::getSub(C1, C2));
71853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
71953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
72053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // Optimize pointer differences into the same array into a size.  Consider:
72153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  //  &A[10] - &A[0]: we should compile this to "10".
72253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (TD) {
72353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    Value *LHSOp, *RHSOp;
72453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (match(Op0, m_PtrToInt(m_Value(LHSOp))) &&
72553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        match(Op1, m_PtrToInt(m_Value(RHSOp))))
72653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Value *Res = OptimizePointerDifference(LHSOp, RHSOp, I.getType()))
72753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return ReplaceInstUsesWith(I, Res);
72853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
72953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    // trunc(p)-trunc(q) -> trunc(p-q)
73053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    if (match(Op0, m_Trunc(m_PtrToInt(m_Value(LHSOp)))) &&
73153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        match(Op1, m_Trunc(m_PtrToInt(m_Value(RHSOp)))))
73253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner      if (Value *Res = OptimizePointerDifference(LHSOp, RHSOp, I.getType()))
73353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner        return ReplaceInstUsesWith(I, Res);
73453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  }
73553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
73653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return 0;
73753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
73853a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
73953a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris LattnerInstruction *InstCombiner::visitFSub(BinaryOperator &I) {
74053a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
74153a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
74253a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  // If this is a 'B = x-(-A)', change to B = x+A...
74353a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  if (Value *V = dyn_castFNegVal(Op1))
74453a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner    return BinaryOperator::CreateFAdd(Op0, V);
74553a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner
74653a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner  return 0;
74753a19b73b5d18794c314bf93f4f3f03e5a8af1f2Chris Lattner}
748