<div dir="ltr">Thanks Ben!<div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 31, 2016 at 3:47 AM Benjamin Kramer via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: d0k<br>
Date: Thu Mar 31 05:42:40 2016<br>
New Revision: 265005<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=265005&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=265005&view=rev</a><br>
Log:<br>
[TTI] Let the cost model estimate ctpop costs based on legality<br>
<br>
PPC has a vector popcount, this lets the vectorizer use the correct cost<br>
for it. Tweak X86 test to use an intrinsic that's actually scalarized (we<br>
have a somewhat efficient lowering for vector popcount using SSE, the<br>
cost model finds that now).<br>
<br>
Added:<br>
    llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h<br>
    llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h?rev=265005&r1=265004&r2=265005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h?rev=265005&r1=265004&r2=265005&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGen/BasicTTIImpl.h Thu Mar 31 05:42:40 2016<br>
@@ -621,6 +621,7 @@ public:<br>
   unsigned getIntrinsicInstrCost(Intrinsic::ID IID, Type *RetTy,<br>
                                  ArrayRef<Type *> Tys) {<br>
     unsigned ISD = 0;<br>
+    unsigned SingleCallCost = 10; // Library call cost. Make it expensive.<br>
     switch (IID) {<br>
     default: {<br>
       // Assume that we need to scalarize this intrinsic.<br>
@@ -725,6 +726,13 @@ public:<br>
     case Intrinsic::masked_load:<br>
       return static_cast<T *>(this)<br>
           ->getMaskedMemoryOpCost(Instruction::Load, RetTy, 0, 0);<br>
+    case Intrinsic::ctpop:<br>
+      ISD = ISD::CTPOP;<br>
+      // In case of legalization use TCC_Expensive. This is cheaper than a<br>
+      // library call but still not a cheap instruction.<br>
+      SingleCallCost = TargetTransformInfo::TCC_Expensive;<br>
+      break;<br>
+    // FIXME: ctlz, cttz, ...<br>
     }<br>
<br>
     const TargetLoweringBase *TLI = getTLI();<br>
@@ -785,7 +793,7 @@ public:<br>
     }<br>
<br>
     // This is going to be turned into a library call, make it expensive.<br>
-    return 10;<br>
+    return SingleCallCost;<br>
   }<br>
<br>
   /// \brief Compute a cost of the given call instruction.<br>
<br>
Added: llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll?rev=265005&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll?rev=265005&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll (added)<br>
+++ llvm/trunk/test/Analysis/CostModel/PowerPC/popcnt.ll Thu Mar 31 05:42:40 2016<br>
@@ -0,0 +1,11 @@<br>
+; RUN: opt < %s -cost-model -analyze -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s<br>
+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"<br>
+target triple = "powerpc64-unknown-linux-gnu"<br>
+<br>
+define <4 x i32> @test1(<4 x i32> %arg) {<br>
+  ; CHECK: cost of 1 {{.*}} call <4 x i32> @llvm.ctpop.v4i32<br>
+  %ctpop = call <4 x i32> @llvm.ctpop.v4i32(<4 x i32> %arg)<br>
+  ret <4 x i32> %ctpop<br>
+}<br>
+<br>
+declare <4 x i32> @llvm.ctpop.v4i32(<4 x i32>)<br>
<br>
Modified: llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll?rev=265005&r1=265004&r2=265005&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll?rev=265005&r1=265004&r2=265005&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll (original)<br>
+++ llvm/trunk/test/Analysis/CostModel/X86/scalarize.ll Thu Mar 31 05:42:40 2016<br>
@@ -13,8 +13,8 @@<br>
 declare %i4 @llvm.bswap.v4i32(%i4)<br>
 declare %i8 @llvm.bswap.v2i64(%i8)<br>
<br>
-declare %i4 @llvm.ctpop.v4i32(%i4)<br>
-declare %i8 @llvm.ctpop.v2i64(%i8)<br>
+declare %i4 @llvm.cttz.v4i32(%i4)<br>
+declare %i8 @llvm.cttz.v2i64(%i8)<br>
<br>
 ; CHECK32-LABEL: test_scalarized_intrinsics<br>
 ; CHECK64-LABEL: test_scalarized_intrinsics<br>
@@ -28,12 +28,12 @@ define void @test_scalarized_intrinsics(<br>
 ; CHECK64: cost of 6 {{.*}}bswap.v2i64<br>
         %r3 = call %i8 @llvm.bswap.v2i64(%i8 undef)<br>
<br>
-; CHECK32: cost of 12 {{.*}}ctpop.v4i32<br>
-; CHECK64: cost of 12 {{.*}}ctpop.v4i32<br>
-        %r4 = call %i4 @llvm.ctpop.v4i32(%i4 undef)<br>
-; CHECK32: cost of 10 {{.*}}ctpop.v2i64<br>
-; CHECK64: cost of 6 {{.*}}ctpop.v2i64<br>
-        %r5 = call %i8 @llvm.ctpop.v2i64(%i8 undef)<br>
+; CHECK32: cost of 12 {{.*}}cttz.v4i32<br>
+; CHECK64: cost of 12 {{.*}}cttz.v4i32<br>
+        %r4 = call %i4 @llvm.cttz.v4i32(%i4 undef)<br>
+; CHECK32: cost of 10 {{.*}}cttz.v2i64<br>
+; CHECK64: cost of 6 {{.*}}cttz.v2i64<br>
+        %r5 = call %i8 @llvm.cttz.v2i64(%i8 undef)<br>
<br>
 ; CHECK32: ret<br>
 ; CHECK64: ret<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>