diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -4130,14 +4130,20 @@ continue; SDValue SrcOp = Op.getOperand(i); - Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1); + // BUILD_VECTOR can implicitly truncate sources, we handle this specially + // for constant nodes to ensure we only look at the sign bits. + if (ConstantSDNode *C = dyn_cast(SrcOp)) { + APInt T = C->getAPIntValue().trunc(VTBits); + Tmp2 = T.getNumSignBits(); + } else { + Tmp2 = ComputeNumSignBits(SrcOp, Depth + 1); - // BUILD_VECTOR can implicitly truncate sources, we must handle this. - if (SrcOp.getValueSizeInBits() != VTBits) { - assert(SrcOp.getValueSizeInBits() > VTBits && - "Expected BUILD_VECTOR implicit truncation"); - unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits; - Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1); + if (SrcOp.getValueSizeInBits() != VTBits) { + assert(SrcOp.getValueSizeInBits() > VTBits && + "Expected BUILD_VECTOR implicit truncation"); + unsigned ExtraBits = SrcOp.getValueSizeInBits() - VTBits; + Tmp2 = (Tmp2 > ExtraBits ? Tmp2 - ExtraBits : 1); + } } Tmp = std::min(Tmp, Tmp2); } diff --git a/llvm/test/CodeGen/AArch64/dag-combine-setcc.ll b/llvm/test/CodeGen/AArch64/dag-combine-setcc.ll --- a/llvm/test/CodeGen/AArch64/dag-combine-setcc.ll +++ b/llvm/test/CodeGen/AArch64/dag-combine-setcc.ll @@ -226,8 +226,6 @@ ; CHECK-NEXT: mov w8, #1 // =0x1 ; CHECK-NEXT: cmeq v1.16b, v1.16b, #0 ; CHECK-NEXT: bic v0.16b, v0.16b, v1.16b -; CHECK-NEXT: shl v0.16b, v0.16b, #7 -; CHECK-NEXT: cmlt v0.16b, v0.16b, #0 ; CHECK-NEXT: uminv b0, v0.16b ; CHECK-NEXT: fmov w9, s0 ; CHECK-NEXT: bic w0, w8, w9 @@ -249,8 +247,6 @@ ; CHECK-NEXT: bic v1.16b, v1.16b, v3.16b ; CHECK-NEXT: bic v0.16b, v0.16b, v2.16b ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b -; CHECK-NEXT: shl v0.16b, v0.16b, #7 -; CHECK-NEXT: cmlt v0.16b, v0.16b, #0 ; CHECK-NEXT: uminv b0, v0.16b ; CHECK-NEXT: fmov w9, s0 ; CHECK-NEXT: bic w0, w8, w9