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

Jonas Paulsson via llvm-commits llvm-commits at lists.llvm.org
Thu May 16 18:26:35 PDT 2019


Author: jonpa
Date: Thu May 16 18:26:35 2019
New Revision: 360970

URL: http://llvm.org/viewvc/llvm-project?rev=360970&view=rev
Log:
[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/

Added:
    llvm/trunk/test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll
Modified:
    llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h

Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h?rev=360970&r1=360969&r2=360970&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h (original)
+++ llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h Thu May 16 18:26:35 2019
@@ -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(),

Added: llvm/trunk/test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll?rev=360970&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll (added)
+++ llvm/trunk/test/Analysis/CostModel/SystemZ/ext-of-icmp-cost.ll Thu May 16 18:26:35 2019
@@ -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
+}




More information about the llvm-commits mailing list