<div dir="ltr">Ping...</div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-07-01 17:05 GMT+08:00 Kevin Qin <span dir="ltr"><<a href="mailto:kevinqindev@gmail.com" target="_blank">kevinqindev@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Sorry for following up this issue late. This patch is to normalize all constants building a vector. The value of constant nodes will be truncated to fit element width.<br>

<br>
<a href="http://reviews.llvm.org/D4228" target="_blank">http://reviews.llvm.org/D4228</a><br>
<br>
Files:<br>
  lib/Target/AArch64/AArch64ISelLowering.cpp<br>
  test/CodeGen/AArch64/arm64-build-vector.ll<br>
<br>
Index: lib/Target/AArch64/AArch64ISelLowering.cpp<br>
===================================================================<br>
--- lib/Target/AArch64/AArch64ISelLowering.cpp<br>
+++ lib/Target/AArch64/AArch64ISelLowering.cpp<br>
@@ -5181,11 +5181,37 @@<br>
   return Op;<br>
 }<br>
<br>
+// Normalize the operands of BUILD_VECTOR. The value of constant operands will<br>
+// be truncated to fit element width.<br>
+static SDValue NormalizeBuildVector(SDValue Op,<br>
+                                    SelectionDAG &DAG) {<br>
+  assert(Op.getOpcode() == ISD::BUILD_VECTOR && "Unknown opcode!");<br>
+  SDLoc dl(Op);<br>
+  EVT VT = Op.getValueType();<br>
+  EVT EltTy= VT.getVectorElementType();<br>
+<br>
+  if (EltTy.isFloatingPoint() || EltTy.getSizeInBits() > 16)<br>
+    return Op;<br>
+<br>
+  SmallVector<SDValue, 16> Ops;<br>
+  for (unsigned I = 0, E = VT.getVectorNumElements(); I != E; ++I) {<br>
+    SDValue Lane = Op.getOperand(I);<br>
+    if (Lane.getOpcode() == ISD::Constant) {<br>
+      APInt LowBits(EltTy.getSizeInBits(),<br>
+                    cast<ConstantSDNode>(Lane)->getZExtValue());<br>
+      Lane = DAG.getConstant(LowBits.getZExtValue(), MVT::i32);<br>
+    }<br>
+    Ops.push_back(Lane);<br>
+  }<br>
+  return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);<br>
+}<br>
+<br>
 SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op,<br>
                                                  SelectionDAG &DAG) const {<br>
-  BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Op.getNode());<br>
   SDLoc dl(Op);<br>
   EVT VT = Op.getValueType();<br>
+  Op = NormalizeBuildVector(Op, DAG);<br>
+  BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Op.getNode());<br>
<br>
   APInt CnstBits(VT.getSizeInBits(), 0);<br>
   APInt UndefBits(VT.getSizeInBits(), 0);<br>
<div class="">Index: test/CodeGen/AArch64/arm64-build-vector.ll<br>
===================================================================<br>
--- test/CodeGen/AArch64/arm64-build-vector.ll<br>
+++ test/CodeGen/AArch64/arm64-build-vector.ll<br>
</div>@@ -36,7 +36,7 @@<br>
<div class=""><br>
 define <8 x i16> @build_all_zero(<8 x i16> %a) #1 {<br>
</div><div class=""> ; CHECK-LABEL: build_all_zero:<br>
-; CHECK: movn  w[[GREG:[0-9]+]], #0x517f<br>
</div>+; CHECK: movz  w[[GREG:[0-9]+]], #0xae80<br>
<div class="im HOEnZb"> ; CHECK-NEXT:  fmov    s[[FREG:[0-9]+]], w[[GREG]]<br>
</div><div class="im HOEnZb"> ; CHECK-NEXT:  mul.8h  v0, v0, v[[FREG]]<br>
</div><div class="HOEnZb"><div class="h5">   %b = add <8 x i16> %a, <i16 -32768, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Best Regards,<div><br></div><div>Kevin Qin</div></div>
</div>