//===- 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
Instruction *visitInstruction(Instruction &I) { return 0; }
private:
+ Instruction *visitCallSite(CallSite CS);
bool transformConstExprCastCall(CallSite CS);
// InsertNewInstBefore - insert an instruction New before instruction Old
// 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
// 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)))
// 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));
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;
}
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...
//
case Instruction::And: Code = LHSCode & RHSCode; break;
case Instruction::Or: Code = LHSCode | RHSCode; break;
case Instruction::Xor: Code = LHSCode ^ RHSCode; break;
- default: assert(0 && "Illegal logical opcode!");
+ default: assert(0 && "Illegal logical opcode!"); return 0;
}
Value *RV = getSetCCValue(Code, LHS, RHS);
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,
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,
}
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.
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));
}
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
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);
// 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
// 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());
// 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
}
}
+// 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.
//
// 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)) {
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;
// 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;