OSDN Git Service

[CodeMetrics] Don't let extends of i1 be free.
authorJonas Paulsson <paulsson@linux.vnet.ibm.com>
Fri, 17 May 2019 01:26:35 +0000 (01:26 +0000)
committerJonas Paulsson <paulsson@linux.vnet.ibm.com>
Fri, 17 May 2019 01:26:35 +0000 (01:26 +0000)
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/

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@360970 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/TargetTransformInfoImpl.h
test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll [new file with mode: 0644]

index a1e1f9b..af250aa 100644 (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(),
diff --git a/test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll b/test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll
new file mode 100644 (file)
index 0000000..0df10f7
--- /dev/null
@@ -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
+}