[llvm-commits] [llvm] r166865 - /llvm/trunk/lib/Transforms/Vectorize/BBVectorize.cpp
Nadav Rotem
nrotem at apple.com
Fri Oct 26 21:42:55 PDT 2012
Hi Hal,
I am running some benchmarks and I see strange results. The x86 backend is weird. Expensive integer arithmetic ops <8 x i32> which are unsupported on AVX, are marked as 'custom' because they have custom lowering. We don't have a good way of knowing that 'ADD <8 x i32>' is actually slow on AVX. On the other hand, easy operations such as FCMP <4 x float>, which should be straight forward, are marked as 'Expand', and they are lowered in a DAGCombine op.
Nadav
On Oct 26, 2012, at 9:33 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> Author: hfinkel
> Date: Fri Oct 26 23:33:48 2012
> New Revision: 166865
>
> URL: http://llvm.org/viewvc/llvm-project?rev=166865&view=rev
> Log:
> Update BBVectorize to use the new VTTI instr. cost interfaces.
>
> The monolithic interface for instruction costs has been split into
> several functions. This is the corresponding change. No functionality
> change is intended.
>
> Modified:
> llvm/trunk/lib/Transforms/Vectorize/BBVectorize.cpp
>
> Modified: llvm/trunk/lib/Transforms/Vectorize/BBVectorize.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/BBVectorize.cpp?rev=166865&r1=166864&r2=166865&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Vectorize/BBVectorize.cpp (original)
> +++ llvm/trunk/lib/Transforms/Vectorize/BBVectorize.cpp Fri Oct 26 23:33:48 2012
> @@ -484,6 +484,61 @@
> 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
> @@ -834,11 +889,11 @@
> 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;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list