[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