From 423be627e6a108b72770426e16cb988b6167c3cb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 14 Feb 2008 18:48:56 +0000 Subject: [PATCH] Fix a miscompilation from Dan's recent apintification. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47128 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 4 +--- test/CodeGen/X86/2008-02-14-BitMiscompile.ll | 8 ++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 test/CodeGen/X86/2008-02-14-BitMiscompile.ll diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 76cf425499e..f8e1fea679c 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1437,12 +1437,10 @@ void SelectionDAG::ComputeMaskedBits(SDOperand Op, const APInt &Mask, // We know that the top bits of C-X are clear if X contains less bits // than C (i.e. no wrap-around can happen). For example, 20-X is // positive if we can prove that X is >= 0 and < 16. - - // sign bit clear if (CLHS->getAPIntValue().isNonNegative()) { unsigned NLZ = (CLHS->getAPIntValue()+1).countLeadingZeros(); // NLZ can't be BitWidth with no sign bit - APInt MaskV = APInt::getHighBitsSet(BitWidth, NLZ); + APInt MaskV = APInt::getHighBitsSet(BitWidth, NLZ+1); ComputeMaskedBits(Op.getOperand(1), MaskV, KnownZero, KnownOne, Depth+1); // If all of the MaskV bits are known to be zero, then we know the output diff --git a/test/CodeGen/X86/2008-02-14-BitMiscompile.ll b/test/CodeGen/X86/2008-02-14-BitMiscompile.ll new file mode 100644 index 00000000000..5bf84560a37 --- /dev/null +++ b/test/CodeGen/X86/2008-02-14-BitMiscompile.ll @@ -0,0 +1,8 @@ +; RUN: llvm-as < %s | llc -march=x86 | grep and +define i32 @test(i1 %A) { + %B = zext i1 %A to i32 ; [#uses=1] + %C = sub i32 0, %B ; [#uses=1] + %D = and i32 %C, 255 ; [#uses=1] + ret i32 %D +} +