Added LLVM project notice to the top of every C++ source file.
[oota-llvm.git] / lib / Transforms / Scalar / InstructionCombining.cpp
index e69db1d463da5c934b933d56d1f15d5fe5127806..91c549d495ed99b1be1503f593c29a70eb0dcbb4 100644 (file)
@@ -1,4 +1,11 @@
 //===- InstructionCombining.cpp - Combine multiple instructions -----------===//
+// 
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// 
+//===----------------------------------------------------------------------===//
 //
 // InstructionCombining - Combine instructions to form fewer, simple
 // instructions.  This pass does not modify the CFG This pass is where algebraic
@@ -99,6 +106,7 @@ namespace {
     Instruction *visitInstruction(Instruction &I) { return 0; }
 
   private:
+    Instruction *visitCallSite(CallSite CS);
     bool transformConstExprCastCall(CallSite CS);
 
     // InsertNewInstBefore - insert an instruction New before instruction Old
@@ -158,7 +166,7 @@ static unsigned getComplexity(Value *V) {
 // isOnlyUse - Return true if this instruction will be deleted if we stop using
 // it.
 static bool isOnlyUse(Value *V) {
-  return V->use_size() == 1 || isa<Constant>(V);
+  return V->hasOneUse() || isa<Constant>(V);
 }
 
 // SimplifyCommutative - This performs a few simplifications for commutative
@@ -237,7 +245,7 @@ static inline Value *dyn_castNotVal(Value *V) {
 // non-constant operand of the multiply.
 //
 static inline Value *dyn_castFoldableMul(Value *V) {
-  if (V->use_size() == 1 && V->getType()->isInteger())
+  if (V->hasOneUse() && V->getType()->isInteger())
     if (Instruction *I = dyn_cast<Instruction>(V))
       if (I->getOpcode() == Instruction::Mul)
         if (isa<Constant>(I->getOperand(1)))
@@ -291,7 +299,7 @@ Instruction *AssociativeOpt(BinaryOperator &Root, const Functor &F) {
 
   // Otherwise, if the LHS is not of the same opcode as the root, return.
   Instruction *LHSI = dyn_cast<Instruction>(LHS);
-  while (LHSI && LHSI->getOpcode() == Opcode && LHSI->use_size() == 1) {
+  while (LHSI && LHSI->getOpcode() == Opcode && LHSI->hasOneUse()) {
     // Should we apply this transform to the RHS?
     bool ShouldApply = F.shouldApply(LHSI->getOperand(1));
 
@@ -437,6 +445,22 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
   if (Constant *C2 = dyn_castMaskingAnd(RHS))
     if (Instruction *R = AssociativeOpt(I, AddMaskingAnd(C2))) return R;
 
+  if (ConstantInt *CRHS = dyn_cast<ConstantInt>(RHS)) {
+    if (Instruction *ILHS = dyn_cast<Instruction>(LHS)) {
+      switch (ILHS->getOpcode()) {
+      case Instruction::Xor:
+        // ~X + C --> (C-1) - X
+        if (ConstantInt *XorRHS = dyn_cast<ConstantInt>(ILHS->getOperand(1)))
+          if (XorRHS->isAllOnesValue())
+            return BinaryOperator::create(Instruction::Sub,
+                                     *CRHS - *ConstantInt::get(I.getType(), 1),
+                                          ILHS->getOperand(0));
+        break;
+      default: break;
+      }
+    }
+  }
+
   return Changed ? &I : 0;
 }
 
@@ -467,7 +491,7 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
       return BinaryOperator::createNot(Op1);
 
   if (BinaryOperator *Op1I = dyn_cast<BinaryOperator>(Op1))
-    if (Op1I->use_size() == 1) {
+    if (Op1I->hasOneUse()) {
       // Replace (x - (y - z)) with (x + (z - y)) if the (y - z) subexpression
       // is not used by anyone else...
       //
@@ -732,7 +756,7 @@ Instruction *InstCombiner::OptAndOp(Instruction *Op,
     if ((*AndRHS & *OpRHS)->isNullValue()) {
       // (X ^ C1) & C2 --> (X & C2) iff (C1&C2) == 0
       return BinaryOperator::create(Instruction::And, X, AndRHS);
-    } else if (Op->use_size() == 1) {
+    } else if (Op->hasOneUse()) {
       // (X ^ C1) & C2 --> (X & C2) ^ (C1&C2)
       std::string OpName = Op->getName(); Op->setName("");
       Instruction *And = BinaryOperator::create(Instruction::And,
@@ -750,7 +774,7 @@ Instruction *InstCombiner::OptAndOp(Instruction *Op,
       if (Together == AndRHS) // (X | C) & C --> C
         return ReplaceInstUsesWith(TheAnd, AndRHS);
       
-      if (Op->use_size() == 1 && Together != OpRHS) {
+      if (Op->hasOneUse() && Together != OpRHS) {
         // (X | C1) & C2 --> (X | (C1&C2)) & C2
         std::string Op0Name = Op->getName(); Op->setName("");
         Instruction *Or = BinaryOperator::create(Instruction::Or, X,
@@ -761,7 +785,7 @@ Instruction *InstCombiner::OptAndOp(Instruction *Op,
     }
     break;
   case Instruction::Add:
-    if (Op->use_size() == 1) {
+    if (Op->hasOneUse()) {
       // Adding a one to a single bit bit-field should be turned into an XOR
       // of the bit.  First thing to check is to see if this AND is with a
       // single bit constant.
@@ -970,7 +994,7 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
     if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0)) {
       // xor (setcc A, B), true = not (setcc A, B) = setncc A, B
       if (SetCondInst *SCI = dyn_cast<SetCondInst>(Op0I))
-        if (RHS == ConstantBool::True && SCI->use_size() == 1)
+        if (RHS == ConstantBool::True && SCI->hasOneUse())
           return new SetCondInst(SCI->getInverseCondition(),
                                  SCI->getOperand(0), SCI->getOperand(1));
           
@@ -1009,7 +1033,7 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
       }
 
   if (Instruction *Op0I = dyn_cast<Instruction>(Op0))
-    if (Op0I->getOpcode() == Instruction::Or && Op0I->use_size() == 1) {
+    if (Op0I->getOpcode() == Instruction::Or && Op0I->hasOneUse()) {
       if (Op0I->getOperand(0) == Op1)                // (B|A)^B == (A|B)^B
         cast<BinaryOperator>(Op0I)->swapOperands();
       if (Op0I->getOperand(1) == Op1) {              // (A|B)^B == A & ~B
@@ -1127,7 +1151,7 @@ Instruction *InstCombiner::visitSetCondInst(BinaryOperator &I) {
               return new SetCondInst(I.getOpcode(), BOp0, NegVal);
             else if (Value *NegVal = dyn_castNegVal(BOp0))
               return new SetCondInst(I.getOpcode(), NegVal, BOp1);
-            else if (BO->use_size() == 1) {
+            else if (BO->hasOneUse()) {
               Instruction *Neg = BinaryOperator::createNeg(BOp1, BO->getName());
               BO->setName("");
               InsertNewInstBefore(Neg, I);
@@ -1274,7 +1298,7 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
 
     // If the operand is an bitwise operator with a constant RHS, and the
     // shift is the only use, we can pull it out of the shift.
-    if (Op0->use_size() == 1)
+    if (Op0->hasOneUse())
       if (BinaryOperator *Op0BO = dyn_cast<BinaryOperator>(Op0))
         if (ConstantInt *Op0C = dyn_cast<ConstantInt>(Op0BO->getOperand(1))) {
           bool isValid = true;     // Valid only for And, Or, Xor
@@ -1516,7 +1540,7 @@ Instruction *InstCombiner::visitCastInst(CastInst &CI) {
   // propagate the cast into the instruction.  Also, only handle integral types
   // for now.
   if (Instruction *SrcI = dyn_cast<Instruction>(Src))
-    if (SrcI->use_size() == 1 && Src->getType()->isIntegral() &&
+    if (SrcI->hasOneUse() && Src->getType()->isIntegral() &&
         CI.getType()->isInteger()) {  // Don't mess with casts to bool here
       const Type *DestTy = CI.getType();
       unsigned SrcBitSize = getTypeSizeInBits(Src->getType());
@@ -1565,15 +1589,13 @@ Instruction *InstCombiner::visitCastInst(CastInst &CI) {
 // CallInst simplification
 //
 Instruction *InstCombiner::visitCallInst(CallInst &CI) {
-  if (transformConstExprCastCall(&CI)) return 0;
-  return 0;
+  return visitCallSite(&CI);
 }
 
 // InvokeInst simplification
 //
 Instruction *InstCombiner::visitInvokeInst(InvokeInst &II) {
-  if (transformConstExprCastCall(&II)) return 0;
-  return 0;
+  return visitCallSite(&II);
 }
 
 // getPromotedType - Return the specified type promoted as it would be to pass
@@ -1589,6 +1611,37 @@ static const Type *getPromotedType(const Type *Ty) {
   }
 }
 
+// visitCallSite - Improvements for call and invoke instructions.
+//
+Instruction *InstCombiner::visitCallSite(CallSite CS) {
+  bool Changed = false;
+
+  // If the callee is a constexpr cast of a function, attempt to move the cast
+  // to the arguments of the call/invoke.
+  if (transformConstExprCastCall(CS)) return 0;
+
+  Value *Callee = CS.getCalledValue();
+  const PointerType *PTy = cast<PointerType>(Callee->getType());
+  const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
+  if (FTy->isVarArg()) {
+    // See if we can optimize any arguments passed through the varargs area of
+    // the call.
+    for (CallSite::arg_iterator I = CS.arg_begin()+FTy->getNumParams(),
+           E = CS.arg_end(); I != E; ++I)
+      if (CastInst *CI = dyn_cast<CastInst>(*I)) {
+        // If this cast does not effect the value passed through the varargs
+        // area, we can eliminate the use of the cast.
+        Value *Op = CI->getOperand(0);
+        if (CI->getType()->isLosslesslyConvertibleTo(Op->getType())) {
+          *I = Op;
+          Changed = true;
+        }
+      }
+  }
+  
+  return Changed ? CS.getInstruction() : 0;
+}
+
 // transformConstExprCastCall - If the callee is a constexpr cast of a function,
 // attempt to move the cast to the arguments of the call/invoke.
 //
@@ -1923,17 +1976,16 @@ bool InstCombiner::runOnFunction(Function &F) {
     // Check to see if we can DIE the instruction...
     if (isInstructionTriviallyDead(I)) {
       // Add operands to the worklist...
-      for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
-        if (Instruction *Op = dyn_cast<Instruction>(I->getOperand(i)))
-          WorkList.push_back(Op);
-
+      if (I->getNumOperands() < 4)
+        for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
+          if (Instruction *Op = dyn_cast<Instruction>(I->getOperand(i)))
+            WorkList.push_back(Op);
       ++NumDeadInst;
-      BasicBlock::iterator BBI = I;
-      if (dceInstruction(BBI)) {
-        removeFromWorkList(I);
-        continue;
-      }
-    } 
+
+      I->getParent()->getInstList().erase(I);
+      removeFromWorkList(I);
+      continue;
+    }
 
     // Instruction isn't dead, see if we can constant propagate it...
     if (Constant *C = ConstantFoldInstruction(I)) {
@@ -1944,13 +1996,11 @@ bool InstCombiner::runOnFunction(Function &F) {
       ReplaceInstUsesWith(*I, C);
 
       ++NumConstProp;
-      BasicBlock::iterator BBI = I;
-      if (dceInstruction(BBI)) {
-        removeFromWorkList(I);
-        continue;
-      }
+      I->getParent()->getInstList().erase(I);
+      removeFromWorkList(I);
+      continue;
     }
-    
+
     // Now that we have an instruction, try combining it to simplify it...
     if (Instruction *Result = visit(*I)) {
       ++NumCombined;
@@ -1959,7 +2009,20 @@ bool InstCombiner::runOnFunction(Function &F) {
         // Instructions can end up on the worklist more than once.  Make sure
         // we do not process an instruction that has been deleted.
         removeFromWorkList(I);
-        ReplaceInstWithInst(I, Result);
+
+        // Move the name to the new instruction first...
+        std::string OldName = I->getName(); I->setName("");
+        Result->setName(OldName);
+
+        // Insert the new instruction into the basic block...
+        BasicBlock *InstParent = I->getParent();
+        InstParent->getInstList().insert(I, Result);
+
+        // Everything uses the new instruction now...
+        I->replaceAllUsesWith(Result);
+
+        // Erase the old instruction.
+        InstParent->getInstList().erase(I);
       } else {
         BasicBlock::iterator II = I;