[llvm] r265005 - [TTI] Let the cost model estimate ctpop costs based on legality

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 31 03:42:40 PDT 2016


Author: d0k
Date: Thu Mar 31 05:42:40 2016
New Revision: 265005

URL: http://llvm.org/viewvc/llvm-project?rev=265005&view=rev
Log:
[TTI] Let the cost model estimate ctpop costs based on legality

PPC has a vector popcount, this lets the vectorizer use the correct cost
for it. Tweak X86 test to use an intrinsic that's actually scalarized (we
have a somewhat efficient lowering for vector popcount using SSE, the
cost model finds that now).

Added:
    llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll
Modified:
    llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h
    llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll

Modified: llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h?rev=265005&r1=265004&r2=265005&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h (original)
+++ llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h Thu Mar 31 05:42:40 2016
@@ -621,6 +621,7 @@ public:
   unsigned getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy,
                                  ArrayRef<Type *> Tys) {
     unsigned ISD = 0;
+    unsigned SingleCallCost = 10; // Library call cost. Make it expensive.
     switch (IID) {
     default: {
       // Assume that we need to scalarize this intrinsic.
@@ -725,6 +726,13 @@ public:
     case Intrinsic::masked_load:
       return static_cast<T *>(this)
           ->getMaskedMemoryOpCost(Instruction::Load, RetTy, 0, 0);
+    case Intrinsic::ctpop:
+      ISD = ISD::CTPOP;
+      // In case of legalization use TCC_Expensive. This is cheaper than a
+      // library call but still not a cheap instruction.
+      SingleCallCost = TargetTransformInfo::TCC_Expensive;
+      break;
+    // FIXME: ctlz, cttz, ...
     }
 
     const TargetLoweringBase *TLI = getTLI();
@@ -785,7 +793,7 @@ public:
     }
 
     // This is going to be turned into a library call, make it expensive.
-    return 10;
+    return SingleCallCost;
   }
 
   /// \brief Compute a cost of the given call instruction.

Added: llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll?rev=265005&view=auto
==============================================================================
--- llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll (added)
+++ llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll Thu Mar 31 05:42:40 2016
@@ -0,0 +1,11 @@
+; RUN: opt < %s -cost-model -analyze -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s
+target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
+target triple = "powerpc64-unknown-linux-gnu"
+
+define <4 x i32> @test1(<4 x i32> %arg) {
+  ; CHECK: cost of 1 {{.*}} call <4 x i32> @llvm.ctpop.v4i32
+  %ctpop = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %arg)
+  ret <4 x i32> %ctpop
+}
+
+declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)

Modified: llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll?rev=265005&r1=265004&r2=265005&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll (original)
+++ llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll Thu Mar 31 05:42:40 2016
@@ -13,8 +13,8 @@
 declare %i4 @llvm.bswap.v4i32(%i4)
 declare %i8 @llvm.bswap.v2i64(%i8)
 
-declare %i4 @llvm.ctpop.v4i32(%i4)
-declare %i8 @llvm.ctpop.v2i64(%i8)
+declare %i4 @llvm.cttz.v4i32(%i4)
+declare %i8 @llvm.cttz.v2i64(%i8)
 
 ; CHECK32-LABEL: test_scalarized_intrinsics
 ; CHECK64-LABEL: test_scalarized_intrinsics
@@ -28,12 +28,12 @@ define void @test_scalarized_intrinsics(
 ; CHECK64: cost of 6 {{.*}}bswap.v2i64
         %r3 = call %i8 @llvm.bswap.v2i64(%i8 undef)
 
-; CHECK32: cost of 12 {{.*}}ctpop.v4i32
-; CHECK64: cost of 12 {{.*}}ctpop.v4i32
-        %r4 = call %i4 @llvm.ctpop.v4i32(%i4 undef)
-; CHECK32: cost of 10 {{.*}}ctpop.v2i64
-; CHECK64: cost of 6 {{.*}}ctpop.v2i64
-        %r5 = call %i8 @llvm.ctpop.v2i64(%i8 undef)
+; CHECK32: cost of 12 {{.*}}cttz.v4i32
+; CHECK64: cost of 12 {{.*}}cttz.v4i32
+        %r4 = call %i4 @llvm.cttz.v4i32(%i4 undef)
+; CHECK32: cost of 10 {{.*}}cttz.v2i64
+; CHECK64: cost of 6 {{.*}}cttz.v2i64
+        %r5 = call %i8 @llvm.cttz.v2i64(%i8 undef)
 
 ; CHECK32: ret
 ; CHECK64: ret




More information about the llvm-commits mailing list