diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/X86TargetTransformInfo.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp index f91e13f..18bf32f 100644 --- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp @@ -3090,6 +3090,7 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, InstructionCost ExtraCost = 0; if (Opcode == Instruction::ICmp || Opcode == Instruction::FCmp) { // Some vector comparison predicates cost extra instructions. + // TODO: Adjust ExtraCost based on CostKind? // TODO: Should we invert this and assume worst case cmp costs // and reduce for particular predicates? if (MTy.isVector() && @@ -3102,21 +3103,25 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Pred == CmpInst::BAD_FCMP_PREDICATE)) Pred = cast<CmpInst>(I)->getPredicate(); + bool CmpWithConstant = false; + if (auto *CmpInstr = dyn_cast_or_null<CmpInst>(I)) + CmpWithConstant = isa<Constant>(CmpInstr->getOperand(1)); + switch (Pred) { case CmpInst::Predicate::ICMP_NE: // xor(cmpeq(x,y),-1) - ExtraCost = 1; + ExtraCost = CmpWithConstant ? 0 : 1; break; case CmpInst::Predicate::ICMP_SGE: case CmpInst::Predicate::ICMP_SLE: // xor(cmpgt(x,y),-1) - ExtraCost = 1; + ExtraCost = CmpWithConstant ? 0 : 1; break; case CmpInst::Predicate::ICMP_ULT: case CmpInst::Predicate::ICMP_UGT: // cmpgt(xor(x,signbit),xor(y,signbit)) // xor(cmpeq(pmaxu(x,y),x),-1) - ExtraCost = 2; + ExtraCost = CmpWithConstant ? 1 : 2; break; case CmpInst::Predicate::ICMP_ULE: case CmpInst::Predicate::ICMP_UGE: @@ -3127,7 +3132,7 @@ InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, ExtraCost = 1; } else { // xor(cmpgt(xor(x,signbit),xor(y,signbit)),-1) - ExtraCost = 3; + ExtraCost = CmpWithConstant ? 2 : 3; } break; case CmpInst::Predicate::FCMP_ONE: |