forked from OSchip/llvm-project
[SLP] Fix for the min/max intrinsic cost.
The min/max intrinsic cost is currently too low because in the cost calculation
we subtract the cost of the vector compare as we will not emit it.
For the cost of the vector compare we are currently passing BAD_ICMP_PREDICATE
which returns 3, the worst case cost.
I think we should be passing VecPred instead, since we know the predicates of
the compare instr.
I think this is related to commit b3b993a7ad
which introduced the predicate
argument to getCmpSelInstrCost().
https://reviews.llvm.org/rGb3b993a7ad817c3c5801341fa78f34332900eb83
Differential Revision: https://reviews.llvm.org/D120439
This commit is contained in:
parent
6136f97c69
commit
4bbc3290a2
|
@ -5358,9 +5358,8 @@ InstructionCost BoUpSLP::getEntryCost(const TreeEntry *E,
|
|||
// If the selects are the only uses of the compares, they will be dead
|
||||
// and we can adjust the cost by removing their cost.
|
||||
if (IntrinsicAndUse.second)
|
||||
IntrinsicCost -=
|
||||
TTI->getCmpSelInstrCost(Instruction::ICmp, VecTy, MaskTy,
|
||||
CmpInst::BAD_ICMP_PREDICATE, CostKind);
|
||||
IntrinsicCost -= TTI->getCmpSelInstrCost(Instruction::ICmp, VecTy,
|
||||
MaskTy, VecPred, CostKind);
|
||||
VecCost = std::min(VecCost, IntrinsicCost);
|
||||
}
|
||||
LLVM_DEBUG(dumpTreeCosts(E, CommonCost, VecCost, ScalarCost));
|
||||
|
|
|
@ -6,13 +6,11 @@
|
|||
; This maps to a single PMAX instruction in x86.
|
||||
define void @smax_intrinsic_cost(i64 %arg0, i64 %arg1) {
|
||||
; CHECK-LABEL: @smax_intrinsic_cost(
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <2 x i64> poison, i64 [[ARG0:%.*]], i32 0
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <2 x i64> [[TMP1]], i64 [[ARG1:%.*]], i32 1
|
||||
; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt <2 x i64> [[TMP2]], <i64 123, i64 456>
|
||||
; CHECK-NEXT: [[TMP4:%.*]] = select <2 x i1> [[TMP3]], <2 x i64> [[TMP2]], <2 x i64> <i64 123, i64 456>
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i64> [[TMP4]], i32 0
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i64> [[TMP4]], i32 1
|
||||
; CHECK-NEXT: [[ROOT:%.*]] = icmp sle i64 [[TMP5]], [[TMP6]]
|
||||
; CHECK-NEXT: [[ICMP0:%.*]] = icmp sgt i64 [[ARG0:%.*]], 123
|
||||
; CHECK-NEXT: [[ICMP1:%.*]] = icmp sgt i64 [[ARG1:%.*]], 456
|
||||
; CHECK-NEXT: [[SELECT0:%.*]] = select i1 [[ICMP0]], i64 [[ARG0]], i64 123
|
||||
; CHECK-NEXT: [[SELECT1:%.*]] = select i1 [[ICMP1]], i64 [[ARG1]], i64 456
|
||||
; CHECK-NEXT: [[ROOT:%.*]] = icmp sle i64 [[SELECT0]], [[SELECT1]]
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
%icmp0 = icmp sgt i64 %arg0, 123
|
||||
|
|
Loading…
Reference in New Issue