1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[CodeMetrics] Don't let extends of i1 be free.

getUserCost() currently returns TCC_Free for any extend of a compare (i1)
result. It seems this is only true in a limited number of cases where for
example two compares are chained. Even in those types of cases it seems
unlikely that they are generally free, while they may be in some cases.

This patch therefore removes this special handling of cast of i1. No tests
are failing because of this.

If some target want the old behavior, it could override getUserCost().

Review: Hal Finkel, Chandler Carruth, Evgeny Astigeevich, Simon Pilgrim,
        Ulrich Weigand
https://reviews.llvm.org/D54742/new/

llvm-svn: 360970
This commit is contained in:
Jonas Paulsson 2019-05-17 01:26:35 +00:00
parent 3924f2e9bc
commit c59c742c81
2 changed files with 58 additions and 9 deletions

View File

@ -826,15 +826,11 @@ public:
return static_cast<T *>(this)->getCallCost(F, Arguments, U);
}
if (const CastInst *CI = dyn_cast<CastInst>(U)) {
// Result of a cmp instruction is often extended (to be used by other
// cmp instructions, logical or return instructions). These are usually
// nop on most sane targets.
if (isa<CmpInst>(CI->getOperand(0)))
return TTI::TCC_Free;
if (isa<SExtInst>(CI) || isa<ZExtInst>(CI) || isa<FPExtInst>(CI))
return static_cast<T *>(this)->getExtCost(CI, Operands.back());
}
if (isa<SExtInst>(U) || isa<ZExtInst>(U) || isa<FPExtInst>(U))
// The old behaviour of generally treating extensions of icmp to be free
// has been removed. A target that needs it should override getUserCost().
return static_cast<T *>(this)->getExtCost(cast<Instruction>(U),
Operands.back());
return static_cast<T *>(this)->getOperationCost(
Operator::getOpcode(U), U->getType(),

View File

@ -0,0 +1,53 @@
; RUN: opt < %s -cost-model -cost-kind=code-size -analyze \
; RUN: -mtriple=s390x-unknown-linux -mcpu=z13 | FileCheck %s
;
; Check that getUserCost() does not return TCC_Free for extensions of
; i1 returned from icmp.
define i64 @fun1(i64 %v) {
; CHECK-LABEL: 'fun1'
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %cmp = icmp eq i64 %v, 0
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %z = zext i1 %cmp to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: ret i64 %z
%cmp = icmp eq i64 %v, 0
%z = zext i1 %cmp to i64
ret i64 %z
}
define i64 @fun2(i64 %v) {
; CHECK-LABEL: 'fun2'
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %cmp = icmp eq i64 %v, 0
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %z = sext i1 %cmp to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: ret i64 %z
%cmp = icmp eq i64 %v, 0
%z = sext i1 %cmp to i64
ret i64 %z
}
define double @fun3(i64 %v) {
; CHECK-LABEL: 'fun3'
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %cmp = icmp eq i64 %v, 0
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %z = uitofp i1 %cmp to double
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: ret double %z
%cmp = icmp eq i64 %v, 0
%z = uitofp i1 %cmp to double
ret double %z
}
define double @fun4(i64 %v) {
; CHECK-LABEL: 'fun4'
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %cmp = icmp eq i64 %v, 0
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %z = sitofp i1 %cmp to double
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: ret double %z
%cmp = icmp eq i64 %v, 0
%z = sitofp i1 %cmp to double
ret double %z
}
define i64 @fun5(i1 %v) {
; CHECK-LABEL: 'fun5'
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: %z = zext i1 %v to i64
; CHECK: Cost Model: Found an estimated cost of 1 for instruction: ret i64 %z
%z = zext i1 %v to i64
ret i64 %z
}