Use the correct value for InSignBit.
authorDan Gohman <gohman@apple.com>
Tue, 11 Mar 2008 21:29:43 +0000 (21:29 +0000)
committerDan Gohman <gohman@apple.com>
Tue, 11 Mar 2008 21:29:43 +0000 (21:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48245 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/TargetLowering.cpp
test/CodeGen/X86/sext-select.ll [new file with mode: 0644]

index 90887a0772a6ea6be45173b785eaf5197436a460..805ef478c3ccbce0cc33b9f81f916da658d8d95a 100644 (file)
@@ -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 (file)
index 0000000..839ebc2
--- /dev/null
@@ -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()           ; <i8> [#uses=1]
+       %g.0 = select i1 %tmp73, i16 0, i16 -480                ; <i16> [#uses=2]
+       %tmp7778 = sext i16 %g.0 to i32         ; <i32> [#uses=1]
+       %tmp80 = shl i32 %tmp7778, 3            ; <i32> [#uses=2]
+       %tmp87 = icmp sgt i32 %tmp80, 32767             ; <i1> [#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
+}