diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-03-25 01:16:40 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2016-03-25 01:16:40 +0000 |
commit | 8c8fcb2585b45dec7091fc9f3617dd8ef2bc4ac4 (patch) | |
tree | 46170830d064bdb9b38629dfa7b4bd2209e57c30 /llvm/lib | |
parent | 4ae5119eeba206e2b1d88491e8ed76ed0f80721f (diff) | |
download | bcm5719-llvm-8c8fcb2585b45dec7091fc9f3617dd8ef2bc4ac4.tar.gz bcm5719-llvm-8c8fcb2585b45dec7091fc9f3617dd8ef2bc4ac4.zip |
AMDGPU: Cost model for basic integer operations
This resolves bug 21148 by preventing promotion to
i64 induction variables.
llvm-svn: 264376
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp index 0d107af59bd..67ac351c38e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp @@ -108,6 +108,37 @@ int AMDGPUTTIImpl::getArithmeticInstrCost( MVT::SimpleValueType SLT = LT.second.getScalarType().SimpleTy; switch (ISD) { + case ISD::SHL: + case ISD::SRL: + case ISD::SRA: { + if (SLT == MVT::i64) + return get64BitInstrCost() * LT.first * NElts; + + // i32 + return getFullRateInstrCost() * LT.first * NElts; + } + case ISD::ADD: + case ISD::SUB: + case ISD::AND: + case ISD::OR: + case ISD::XOR: { + if (SLT == MVT::i64){ + // and, or and xor are typically split into 2 VALU instructions. + return 2 * getFullRateInstrCost() * LT.first * NElts; + } + + return LT.first * NElts * getFullRateInstrCost(); + } + case ISD::MUL: { + const int QuarterRateCost = getQuarterRateInstrCost(); + if (SLT == MVT::i64) { + const int FullRateCost = getFullRateInstrCost(); + return (4 * QuarterRateCost + (2 * 2) * FullRateCost) * LT.first * NElts; + } + + // i32 + return QuarterRateCost * NElts * LT.first; + } case ISD::FADD: case ISD::FSUB: case ISD::FMUL: |