forked from OSchip/llvm-project
[LV] Pass compare predicate to getCmpSelInstrCost.
If the condition of a select is a compare, pass its predicate to TTI::getCmpSelInstrCost to get a more accurate cost value instead of passing BAD_ICMP_PREDICATE. I noticed that the commit message from D90070 had a comment about the vectorized select predicate possibly being composed of other compares with different predicate values, but I wasn't able to construct an example where this was an actual issue. If this is an issue, I guess we could add another check that the block isn't predicated for any reason. Reviewed By: dmgreen, fhahn Differential Revision: https://reviews.llvm.org/D114646
This commit is contained in:
parent
ab31d003e1
commit
3d549dddf7
|
@ -7570,8 +7570,12 @@ LoopVectorizationCostModel::getInstructionCost(Instruction *I, ElementCount VF,
|
|||
Type *CondTy = SI->getCondition()->getType();
|
||||
if (!ScalarCond)
|
||||
CondTy = VectorType::get(CondTy, VF);
|
||||
return TTI.getCmpSelInstrCost(I->getOpcode(), VectorTy, CondTy,
|
||||
CmpInst::BAD_ICMP_PREDICATE, CostKind, I);
|
||||
|
||||
CmpInst::Predicate Pred = CmpInst::BAD_ICMP_PREDICATE;
|
||||
if (auto *Cmp = dyn_cast<CmpInst>(SI->getCondition()))
|
||||
Pred = Cmp->getPredicate();
|
||||
return TTI.getCmpSelInstrCost(I->getOpcode(), VectorTy, CondTy, Pred,
|
||||
CostKind, I);
|
||||
}
|
||||
case Instruction::ICmp:
|
||||
case Instruction::FCmp: {
|
||||
|
@ -7581,7 +7585,8 @@ LoopVectorizationCostModel::getInstructionCost(Instruction *I, ElementCount VF,
|
|||
ValTy = IntegerType::get(ValTy->getContext(), MinBWs[Op0AsInstruction]);
|
||||
VectorTy = ToVectorTy(ValTy, VF);
|
||||
return TTI.getCmpSelInstrCost(I->getOpcode(), VectorTy, nullptr,
|
||||
CmpInst::BAD_ICMP_PREDICATE, CostKind, I);
|
||||
cast<CmpInst>(I)->getPredicate(), CostKind,
|
||||
I);
|
||||
}
|
||||
case Instruction::Store:
|
||||
case Instruction::Load: {
|
||||
|
|
|
@ -5,17 +5,17 @@ target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
|||
target triple = "arm64-apple-ios5.0.0"
|
||||
|
||||
define void @selects_1(i32* nocapture %dst, i32 %A, i32 %B, i32 %C, i32 %N) {
|
||||
; CHECK: LV: Found an estimated cost of 5 for VF 2 For instruction: %cond = select i1 %cmp1, i32 10, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 5 for VF 2 For instruction: %cond6 = select i1 %cmp2, i32 30, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 5 for VF 2 For instruction: %cond11 = select i1 %cmp7, i32 %cond, i32 %cond6
|
||||
; CHECK: LV: Found an estimated cost of 1 for VF 2 For instruction: %cond = select i1 %cmp1, i32 10, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 1 for VF 2 For instruction: %cond6 = select i1 %cmp2, i32 30, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 1 for VF 2 For instruction: %cond11 = select i1 %cmp7, i32 %cond, i32 %cond6
|
||||
|
||||
; CHECK: LV: Found an estimated cost of 13 for VF 4 For instruction: %cond = select i1 %cmp1, i32 10, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 13 for VF 4 For instruction: %cond6 = select i1 %cmp2, i32 30, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 13 for VF 4 For instruction: %cond11 = select i1 %cmp7, i32 %cond, i32 %cond6
|
||||
; CHECK: LV: Found an estimated cost of 1 for VF 4 For instruction: %cond = select i1 %cmp1, i32 10, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 1 for VF 4 For instruction: %cond6 = select i1 %cmp2, i32 30, i32 %and
|
||||
; CHECK: LV: Found an estimated cost of 1 for VF 4 For instruction: %cond11 = select i1 %cmp7, i32 %cond, i32 %cond6
|
||||
|
||||
; CHECK-LABEL: define void @selects_1(
|
||||
; CHECK: vector.body:
|
||||
; CHECK: select <2 x i1>
|
||||
; CHECK: select <4 x i1>
|
||||
|
||||
entry:
|
||||
%cmp26 = icmp sgt i32 %N, 0
|
||||
|
|
Loading…
Reference in New Issue