Skip to content

Commit

Permalink
Update BBVectorize to use the new VTTI instr. cost interfaces.
Browse files Browse the repository at this point in the history
The monolithic interface for instruction costs has been split into
several functions. This is the corresponding change. No functionality
change is intended.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166865 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Hal Finkel committed Oct 27, 2012
1 parent f065a84 commit 46fb81c
Showing 1 changed file with 58 additions and 3 deletions.
61 changes: 58 additions & 3 deletions lib/Transforms/Vectorize/BBVectorize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,61 @@ namespace {
return 1;
}

// Returns the cost of the provided instruction using VTTI.
// This does not handle loads and stores.
unsigned getInstrCost(unsigned Opcode, Type *T1, Type *T2) {
switch (Opcode) {
default: break;
case Instruction::GetElementPtr:
// We mark this instruction as zero-cost because scalar GEPs are usually
// lowered to the intruction addressing mode. At the moment we don't
// generate vector GEPs.
return 0;
case Instruction::Br:
return VTTI->getCFInstrCost(Opcode);
case Instruction::PHI:
return 0;
case Instruction::Add:
case Instruction::FAdd:
case Instruction::Sub:
case Instruction::FSub:
case Instruction::Mul:
case Instruction::FMul:
case Instruction::UDiv:
case Instruction::SDiv:
case Instruction::FDiv:
case Instruction::URem:
case Instruction::SRem:
case Instruction::FRem:
case Instruction::Shl:
case Instruction::LShr:
case Instruction::AShr:
case Instruction::And:
case Instruction::Or:
case Instruction::Xor:
return VTTI->getArithmeticInstrCost(Opcode, T1);
case Instruction::Select:
case Instruction::ICmp:
case Instruction::FCmp:
return VTTI->getCmpSelInstrCost(Opcode, T1, T2);
case Instruction::ZExt:
case Instruction::SExt:
case Instruction::FPToUI:
case Instruction::FPToSI:
case Instruction::FPExt:
case Instruction::PtrToInt:
case Instruction::IntToPtr:
case Instruction::SIToFP:
case Instruction::UIToFP:
case Instruction::Trunc:
case Instruction::FPTrunc:
case Instruction::BitCast:
return VTTI->getCastInstrCost(Opcode, T1, T2);
}

return 1;
}

// This determines the relative offset of two loads or stores, returning
// true if the offset could be determined to be some constant value.
// For example, if OffsetInElmts == 1, then J accesses the memory directly
Expand Down Expand Up @@ -834,11 +889,11 @@ namespace {
return false;
}
} else if (VTTI) {
unsigned ICost = VTTI->getInstrCost(I->getOpcode(), IT1, IT2);
unsigned JCost = VTTI->getInstrCost(J->getOpcode(), JT1, JT2);
unsigned ICost = getInstrCost(I->getOpcode(), IT1, IT2);
unsigned JCost = getInstrCost(J->getOpcode(), JT1, JT2);
Type *VT1 = getVecTypeForPair(IT1, JT1),
*VT2 = getVecTypeForPair(IT2, JT2);
unsigned VCost = VTTI->getInstrCost(I->getOpcode(), VT1, VT2);
unsigned VCost = getInstrCost(I->getOpcode(), VT1, VT2);

if (VCost > ICost + JCost)
return false;
Expand Down

0 comments on commit 46fb81c

Please sign in to comment.