[PATCH] D54742: [CodeMetrics] Don't let extends of i1 be free.
Jonas Paulsson via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 7 06:26:42 PST 2019
jonpa updated this revision to Diff 180482.
jonpa marked 2 inline comments as done.
jonpa added a comment.
Thanks for quick review!
> Probably other arches are also affected by this (any tests failing?),
> And, would be awesome to precommit the adjusted tests, to see the change :)
No - no tests are failing!
> would probably be a good idea to have the same test for them too (x86, aarch64?).
Since this is the default implementation which is affected, wouldn't that be redundant?
> 1. Add one test where i1 was an input to the function
> 2. Rename test file to ext-of-icmp-cost.ll or something 3.Adjust comment
ok - done.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D54742/new/
https://reviews.llvm.org/D54742
Files:
include/llvm/Analysis/TargetTransformInfoImpl.h
test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll
Index: test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll
===================================================================
--- /dev/null
+++ test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll
@@ -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
+}
Index: include/llvm/Analysis/TargetTransformInfoImpl.h
===================================================================
--- include/llvm/Analysis/TargetTransformInfoImpl.h
+++ include/llvm/Analysis/TargetTransformInfoImpl.h
@@ -807,15 +807,11 @@
return static_cast<T *>(this)->getCallCost(F, Arguments);
}
- 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(),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D54742.180482.patch
Type: text/x-patch
Size: 3604 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190107/94a69252/attachment.bin>
More information about the llvm-commits
mailing list