diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 90887a0772a..805ef478c3c 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -892,7 +892,7 @@ bool TargetLowering::SimplifyDemandedBits(SDOperand Op, MVT::ValueType InVT = Op.getOperand(0).getValueType(); unsigned InBits = MVT::getSizeInBits(InVT); APInt InMask = APInt::getLowBitsSet(BitWidth, InBits); - APInt InSignBit = APInt::getLowBitsSet(BitWidth, InBits); + APInt InSignBit = APInt::getBitsSet(BitWidth, InBits - 1, InBits); APInt NewBits = ~InMask & NewMask; // If none of the top bits are demanded, convert this into an any_extend. diff --git a/test/CodeGen/X86/sext-select.ll b/test/CodeGen/X86/sext-select.ll new file mode 100644 index 00000000000..839ebc2b6c1 --- /dev/null +++ b/test/CodeGen/X86/sext-select.ll @@ -0,0 +1,23 @@ +; RUN: llvm-as < %s | llc -march=x86 | grep movsw +; PR2139 + +declare void @abort() + +define i32 @main() { +entry: + %tmp73 = tail call i1 @return_false() ; [#uses=1] + %g.0 = select i1 %tmp73, i16 0, i16 -480 ; [#uses=2] + %tmp7778 = sext i16 %g.0 to i32 ; [#uses=1] + %tmp80 = shl i32 %tmp7778, 3 ; [#uses=2] + %tmp87 = icmp sgt i32 %tmp80, 32767 ; [#uses=1] + br i1 %tmp87, label %bb90, label %bb91 +bb90: ; preds = %bb84, %bb72 + tail call void @abort() + unreachable +bb91: ; preds = %bb84 + ret i32 0 +} + +define i1 @return_false() { + ret i1 0 +}