Fix lowering of cttz to work with signed values
authorChris Lattner <sabre@nondot.org>
Wed, 11 May 2005 20:02:14 +0000 (20:02 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 11 May 2005 20:02:14 +0000 (20:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21874 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/IntrinsicLowering.cpp

index 1817ade1cdb66955febf7a4bb60c8b0485ba9498..634f959f3c4781684989879d73a896770fb6c3f7 100644 (file)
@@ -251,13 +251,12 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
     break;
   }
   case Intrinsic::cttz: {
+    // cttz(x) -> ctpop(~X & (X-1))
     Value *Src = CI->getOperand(1);
     Value *NotSrc = BinaryOperator::createNot(Src, Src->getName()+".not", CI);
-    Src = BinaryOperator::createAnd(NotSrc,
-                                    BinaryOperator::createSub(Src, 
-                           ConstantUInt::get(CI->getOperand(0)->getType(), 1), "", CI));
-
-    Src = LowerCTPOP(Src, CI);
+    Value *SrcM1  = ConstantInt::get(Src->getType(), 1);
+    SrcM1 = BinaryOperator::createSub(Src, SrcM1, "", CI);
+    Src = LowerCTPOP(BinaryOperator::createAnd(NotSrc, SrcM1, "", CI), CI);
     CI->replaceAllUsesWith(Src);
     break;
   }