diff options
author | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2018-11-01 09:05:32 +0000 |
---|---|---|
committer | Jonas Paulsson <paulsson@linux.vnet.ibm.com> | 2018-11-01 09:05:32 +0000 |
commit | 6749c24f408a3e1e1209c01ac9655eb5b302bd29 (patch) | |
tree | 2b9910b42065690fb331e47b22ce1b5aa1eb762b | |
parent | f15a53bc81377aa0c5e3864fd9cb41fa667a011d (diff) | |
download | bcm5719-llvm-6749c24f408a3e1e1209c01ac9655eb5b302bd29.tar.gz bcm5719-llvm-6749c24f408a3e1e1209c01ac9655eb5b302bd29.zip |
[SystemZ::TTI] Recognize the higher cost of scalar i1 -> fp conversion
Scalar i1 to fp conversions are done with a branch sequence, so it should
have a higher cost.
Review: Ulrich Weigand
https://reviews.llvm.org/D53924
llvm-svn: 345818
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp | 4 | ||||
-rw-r--r-- | llvm/test/Analysis/CostModel/SystemZ/cmp-tofp-scalar.ll | 23 |
2 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp index 18333bfcc11..e7052e2e469 100644 --- a/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZTargetTransformInfo.cpp @@ -749,7 +749,9 @@ int SystemZTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src, assert (!Dst->isVectorTy()); if (Opcode == Instruction::SIToFP || Opcode == Instruction::UIToFP) - return (SrcScalarBits >= 32 ? 1 : 2 /*i8/i16 extend*/); + return (SrcScalarBits >= 32 + ? 1 + : SrcScalarBits > 1 ? 2 /*i8/i16 extend*/ : 5 /*branch seq.*/); if ((Opcode == Instruction::ZExt || Opcode == Instruction::SExt) && Src->isIntegerTy(1)) { diff --git a/llvm/test/Analysis/CostModel/SystemZ/cmp-tofp-scalar.ll b/llvm/test/Analysis/CostModel/SystemZ/cmp-tofp-scalar.ll new file mode 100644 index 00000000000..6cd4ead76a5 --- /dev/null +++ b/llvm/test/Analysis/CostModel/SystemZ/cmp-tofp-scalar.ll @@ -0,0 +1,23 @@ +; RUN: opt < %s -cost-model -analyze -mtriple=systemz-unknown -mcpu=z13 | FileCheck %s +; +; Costs for conversion of i1 to fp. + +define float @fun0(i64 %val1, i64 %val2) { + %cmp = icmp eq i64 %val1, %val2 + %v = uitofp i1 %cmp to float + ret float %v + +; CHECK: fun0 +; CHECK: cost of 1 for instruction: %cmp = icmp eq i64 %val1, %val2 +; CHECK: cost of 5 for instruction: %v = uitofp i1 %cmp to float +} + +define double @fun1(i64 %val1, i64 %val2) { + %cmp = icmp eq i64 %val1, %val2 + %v = uitofp i1 %cmp to double + ret double %v + +; CHECK: fun1 +; CHECK: cost of 1 for instruction: %cmp = icmp eq i64 %val1, %val2 +; CHECK: cost of 5 for instruction: %v = uitofp i1 %cmp to double +} |