Hi Hao,<br><br>Sorry - I had tunnel vision. I hadn't noticed you'd quoted a bugzilla issue - it's obviously pasted there, so that's good enough.<div><br></div><div>Sorry for the noise.</div><div><br></div><div>James</div><br><div class="gmail_quote">On Mon Dec 22 2014 at 10:46:36 AM James Molloy <<a href="mailto:james@jamesmolloy.co.uk">james@jamesmolloy.co.uk</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Hao,<br><br>> <span style="line-height:19.7999992370605px">This patch is by Wei-cheng Wang. Review please.</span><br style="line-height:19.7999992370605px"><div><span style="line-height:19.7999992370605px"><br></span></div><div><span style="line-height:19.7999992370605px">Could you please point to where you got this patch? There have been patches reverted in the past because the patch author hasn't given explicit approval and we can't just take someone's code without explicit attribution.</span></div><div><span style="line-height:19.7999992370605px"><br></span></div><div><span style="line-height:19.7999992370605px">Cheers,</span></div><div><span style="line-height:19.7999992370605px"><br></span></div><div><span style="line-height:19.7999992370605px">James</span></div><br><div class="gmail_quote">On Mon Dec 22 2014 at 6:48:46 AM Hao Liu <<a href="mailto:Hao.Liu@arm.com" target="_blank">Hao.Liu@arm.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi t.p.northover,<br>
<br>
Hi Tim and other reviewers,<br>
<br>
This patch fix the bug PR21675 (<a href="http://llvm.org/bugs/show_bug.cgi?id=21675" target="_blank">http://llvm.org/bugs/show_<u></u>bug<u></u>.cgi?id=21675</a>). There is a bug about lowering llvm.ctpop.i32. Previously we use:<br>
      SDValue ZeroVec = DAG.getUNDEF(MVT::v8i8)<br>
But ctpop is to do bit count. Using undef doesn't mean the upper bits are all zero.<br>
<br>
There are some redundant instructions as follows:<br>
      fmov w0, s0<br>
      fmov d0, x0<br>
But this should be optimized in other places.<br>
<br>
This patch is by Wei-cheng Wang. Review please.<br>
<br>
Thanks,<br>
-Hao<br>
<br>
<a href="http://reviews.llvm.org/D6753" target="_blank">http://reviews.llvm.org/D6753</a><br>
<br>
Files:<br>
  lib/Target/AArch64/<u></u>AArch64ISel<u></u>Lowering.cpp<br>
  test/CodeGen/AArch64/arm64-<u></u>pop<u></u>cnt.ll<br>
<br>
Index: lib/Target/AArch64/<u></u>AArch64ISel<u></u>Lowering.cpp<br>
==============================<u></u><u></u>==============================<u></u><u></u>=======<br>
--- lib/Target/AArch64/<u></u>AArch64ISel<u></u>Lowering.cpp<br>
+++ lib/Target/AArch64/<u></u>AArch64ISel<u></u>Lowering.cpp<br>
@@ -3457,18 +3457,12 @@<br>
   SDValue Val = Op.getOperand(0);<br>
   SDLoc DL(Op);<br>
   EVT VT = Op.getValueType();<br>
-  SDValue ZeroVec = DAG.getUNDEF(MVT::v8i8);<br>
<br>
-  SDValue VecVal;<br>
-  if (VT == MVT::i32) {<br>
-    VecVal = DAG.getNode(ISD::BITCAST, DL, MVT::f32, Val);<br>
-    VecVal = DAG.getTargetInsertSubreg(<u></u>AArc<u></u>h64::ssub, DL, MVT::v8i8, ZeroVec,<br>
-                                       VecVal);<br>
-  } else {<br>
-    VecVal = DAG.getNode(ISD::BITCAST, DL, MVT::v8i8, Val);<br>
-  }<br>
+  if (VT == MVT::i32)<br>
+    Val = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, Val);<br>
+  Val = DAG.getNode(ISD::BITCAST, DL, MVT::v8i8, Val);<br>
<br>
-  SDValue CtPop = DAG.getNode(ISD::CTPOP, DL, MVT::v8i8, VecVal);<br>
+  SDValue CtPop = DAG.getNode(ISD::CTPOP, DL, MVT::v8i8, Val);<br>
   SDValue UaddLV = DAG.getNode(<br>
       ISD::INTRINSIC_WO_CHAIN, DL, MVT::i32,<br>
       DAG.getConstant(Intrinsic::<u></u>aa<u></u>rch64_neon_uaddlv, MVT::i32), CtPop);<br>
Index: test/CodeGen/AArch64/arm64-<u></u>pop<u></u>cnt.ll<br>
==============================<u></u><u></u>==============================<u></u><u></u>=======<br>
--- test/CodeGen/AArch64/arm64-<u></u>pop<u></u>cnt.ll<br>
+++ test/CodeGen/AArch64/arm64-<u></u>pop<u></u>cnt.ll<br>
@@ -4,7 +4,8 @@<br>
 define i32 @cnt32_advsimd(i32 %x) nounwind readnone {<br>
   %cnt = tail call i32 @llvm.ctpop.i32(i32 %x)<br>
   ret i32 %cnt<br>
-; CHECK: fmov  s0, w0<br>
+; CHECK: ubfx  x{{[0-9]+}}<br>
+; CHECK: fmov  d0, x{{[0-9]+}}<br>
 ; CHECK: cnt.8b        v0, v0<br>
 ; CHECK: uaddlv.8b     h0, v0<br>
 ; CHECK: fmov w0, s0<br>
@@ -15,7 +16,24 @@<br>
 ; CHECK-NONEON: and w{{[0-9]+}}, w{{[0-9]+}}, #0x33333333<br>
 ; CHECK-NONEON: and w{{[0-9]+}}, w{{[0-9]+}}, #0xf0f0f0f<br>
 ; CHECK-NONEON: mul<br>
+}<br>
<br>
+define i32 @cnt32_advsimd_2(<2 x i32> %x) {<br>
+  %1 = extractelement <2 x i32> %x, i64 0<br>
+  %2 = tail call i32 @llvm.ctpop.i32(i32 %1)<br>
+  ret i32 %2<br>
+; CHECK: fmov  w0, s0<br>
+; CHECK: fmov  d0, x0<br>
+; CHECK: cnt.8b        v0, v0<br>
+; CHECK: uaddlv.8b     h0, v0<br>
+; CHECK: fmov w0, s0<br>
+; CHECK: ret<br>
+; CHECK-NONEON-LABEL: cnt32_advsimd_2<br>
+; CHECK-NONEON-NOT: 8b<br>
+; CHECK-NONEON: and w{{[0-9]+}}, w{{[0-9]+}}, #0x55555555<br>
+; CHECK-NONEON: and w{{[0-9]+}}, w{{[0-9]+}}, #0x33333333<br>
+; CHECK-NONEON: and w{{[0-9]+}}, w{{[0-9]+}}, #0xf0f0f0f<br>
+; CHECK-NONEON: mul<br>
 }<br>
<br>
 define i64 @cnt64_advsimd(i64 %x) nounwind readnone {<br>
<br>
EMAIL PREFERENCES<br>
  <a href="http://reviews.llvm.org/settings/panel/emailpreferences/" target="_blank">http://reviews.llvm.org/<u></u>settin<u></u>gs/panel/<u></u>emailpreferences/</a><br>
______________________________<u></u><u></u>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/<u></u>mailm<u></u>an/listinfo/llvm-commits</a><br>
</blockquote></div></blockquote></div>