[llvm-commits] CVS: llvm/lib/CodeGen/IntrinsicLowering.cpp

Chris Lattner lattner at cs.uiuc.edu
Wed May 11 12:42:22 PDT 2005



Changes in directory llvm/lib/CodeGen:

IntrinsicLowering.cpp updated: 1.30 -> 1.31
---
Log message:

fix and concisify intinsic lowering for ctpop.  Unfortunately, this code
looks completely untested. :(


---
Diffs of the changes:  (+61 -167)

 IntrinsicLowering.cpp |  228 +++++++++++++-------------------------------------
 1 files changed, 61 insertions(+), 167 deletions(-)


Index: llvm/lib/CodeGen/IntrinsicLowering.cpp
diff -u llvm/lib/CodeGen/IntrinsicLowering.cpp:1.30 llvm/lib/CodeGen/IntrinsicLowering.cpp:1.31
--- llvm/lib/CodeGen/IntrinsicLowering.cpp:1.30	Sun May  8 14:46:29 2005
+++ llvm/lib/CodeGen/IntrinsicLowering.cpp	Wed May 11 14:42:05 2005
@@ -127,6 +127,40 @@
       }
 }
 
+/// LowerCTPOP - Emit the code to lower ctpop of V before the specified
+/// instruction.
+static Value *LowerCTPOP(Value *V, Instruction *IP) {
+  assert(V->getType()->isInteger() && "Can't ctpop a non-integer type!");
+  unsigned BitSize = V->getType()->getPrimitiveSizeInBits();
+
+  static const uint64_t MaskValues[6] = {
+    0x5555555555555555ULL, 0x3333333333333333ULL,
+    0x0F0F0F0F0F0F0F0FULL, 0x00FF00FF00FF00FFULL,
+    0x0000FFFF0000FFFFULL, 0x00000000FFFFFFFFULL
+  };
+
+  const Type *DestTy = V->getType();
+
+  // Force to unsigned so that the shift rights are logical.
+  if (DestTy->isSigned())
+    V = new CastInst(V, DestTy->getUnsignedVersion(), V->getName(), IP);
+
+  for (unsigned i = 1, ct = 0; i != BitSize; i <<= 1, ++ct) {
+    Value *MaskCst =
+      ConstantExpr::getCast(ConstantUInt::get(Type::ULongTy,
+                                              MaskValues[ct]), V->getType());
+    Value *LHS = BinaryOperator::createAnd(V, MaskCst, "cppop.and1", IP);
+    Value *VShift = new ShiftInst(Instruction::Shr, V, 
+                      ConstantInt::get(Type::UByteTy, i), "ctpop.sh", IP);
+    Value *RHS = BinaryOperator::createAnd(VShift, MaskCst, "cppop.and2", IP);
+    V = BinaryOperator::createAdd(LHS, RHS, "ctpop.step", IP);
+  }
+
+  if (V->getType() != DestTy)
+    V = new CastInst(V, DestTy, V->getName(), IP);
+  return V;
+}
+
 void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) {
   Function *Callee = CI->getCalledFunction();
   assert(Callee && "Cannot lower an indirect call!");
@@ -172,157 +206,10 @@
                     AbortFCache);
     break;
   }
-  case Intrinsic::ctpop: {
-    Value *Src = CI->getOperand(1);
-    switch (CI->getOperand(0)->getType()->getTypeID())
-    {
-    case Type::SByteTyID:
-    case Type::UByteTyID:
-      {
-        Value* SA = ConstantUInt::get(Type::UByteTy, 1);
-        Value* MA = ConstantUInt::get(Type::UIntTy, 0x55);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 2);
-        MA = ConstantUInt::get(Type::UIntTy, 0x33);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And,
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 4);
-        MA = ConstantUInt::get(Type::UIntTy, 0x0F);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA), "ctpop");
-      }
-      break;
-    case Type::ShortTyID:
-    case Type::UShortTyID:
-      {
-        Value* SA = ConstantUInt::get(Type::UByteTy, 1);
-        Value* MA = ConstantUInt::get(Type::UIntTy, 0x5555);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 2);
-        MA = ConstantUInt::get(Type::UIntTy, 0x3333);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 4);
-        MA = ConstantUInt::get(Type::UIntTy, 0x0F0F);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 8);
-        MA = ConstantUInt::get(Type::UIntTy, 0x00FF);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA), "ctpop");
-
-      }
-      break;
-    case Type::IntTyID:
-    case Type::UIntTyID:
-      {
-        Value* SA = ConstantUInt::get(Type::UByteTy, 1);
-        Value* MA = ConstantUInt::get(Type::UIntTy, 0x55555555);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 2);
-        MA = ConstantUInt::get(Type::UIntTy, 0x33333333);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 4);
-        MA = ConstantUInt::get(Type::UIntTy, 0x0F0F0F0F);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 8);
-        MA = ConstantUInt::get(Type::UIntTy, 0x00FF00FF);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 8);
-        MA = ConstantUInt::get(Type::UIntTy, 0x0000FFFF);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA), "ctpop");
-      }
-      break;
-    case Type::LongTyID:
-    case Type::ULongTyID:
-      {
-        Value* SA = ConstantUInt::get(Type::UByteTy, 1);
-        Value* MA = ConstantUInt::get(Type::ULongTy, 0x5555555555555555ULL);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 2);
-        MA = ConstantUInt::get(Type::ULongTy, 0x3333333333333333ULL);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 4);
-        MA = ConstantUInt::get(Type::ULongTy, 0x0F0F0F0F0F0F0F0FULL);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 8);
-        MA = ConstantUInt::get(Type::ULongTy, 0x00FF00FF00FF00FFULL);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA));
-        SA = ConstantUInt::get(Type::UByteTy, 16);
-        MA = ConstantUInt::get(Type::ULongTy, 0x00000000FFFFFFFFULL);
-        Src = BinaryOperator::create(Instruction::Add,
-                BinaryOperator::create(Instruction::And, Src, MA),
-                BinaryOperator::create(Instruction::And, 
-                                       new ShiftInst(Instruction::Shr, Src, SA),
-                                       MA), "ctpop");
-      }
-      break;
-    default:
-      abort();
-    }
-        
-    CI->replaceAllUsesWith(Src);
+  case Intrinsic::ctpop:
+    CI->replaceAllUsesWith(LowerCTPOP(CI->getOperand(1), CI));
     break;
-  }
+
   case Intrinsic::ctlz: {
     Value *Src = CI->getOperand(1);
     Value* SA;
@@ -331,39 +218,46 @@
     case Type::LongTyID:
     case Type::ULongTyID:
       SA = ConstantUInt::get(Type::UByteTy, 32);
-      Src = BinaryOperator::create(Instruction::Or, Src, new ShiftInst(Instruction::Shr, Src, SA));
+      Src = BinaryOperator::createOr(Src, new ShiftInst(Instruction::Shr, Src,
+                                                        SA, "", CI), "", CI);
     case Type::IntTyID:
     case Type::UIntTyID:
       SA = ConstantUInt::get(Type::UByteTy, 16);
-      Src = BinaryOperator::create(Instruction::Or, Src, new ShiftInst(Instruction::Shr, Src, SA));
+      Src = BinaryOperator::createOr(Src, new ShiftInst(Instruction::Shr,
+                                                        Src, SA, "", CI),
+                                     "", CI);
     case Type::ShortTyID:
     case Type::UShortTyID:
       SA = ConstantUInt::get(Type::UByteTy, 8);
-      Src = BinaryOperator::create(Instruction::Or, Src, new ShiftInst(Instruction::Shr, Src, SA));
+      Src = BinaryOperator::createOr(Src, new ShiftInst(Instruction::Shr,
+                                                        Src, SA, "", CI),
+                                     "", CI);
     default:
       SA = ConstantUInt::get(Type::UByteTy, 1);
-      Src = BinaryOperator::create(Instruction::Or, Src, new ShiftInst(Instruction::Shr, Src, SA));
+      Src = BinaryOperator::createOr(Src, new ShiftInst(Instruction::Shr, Src,
+                                                        SA, "", CI), "", CI);
       SA = ConstantUInt::get(Type::UByteTy, 2);
-      Src = BinaryOperator::create(Instruction::Or, Src, new ShiftInst(Instruction::Shr, Src, SA));
+      Src = BinaryOperator::createOr(Src, new ShiftInst(Instruction::Shr, Src,
+                                                        SA, "", CI), "", CI);
       SA = ConstantUInt::get(Type::UByteTy, 4);
-      Src = BinaryOperator::create(Instruction::Or, Src, new ShiftInst(Instruction::Shr, Src, SA));
+      Src = BinaryOperator::createOr(Src, new ShiftInst(Instruction::Shr, Src,
+                                                        SA, "", CI), "", CI);
     };
-    Src = BinaryOperator::createNot(Src);
+    Src = BinaryOperator::createNot(Src, "", CI);
 
-    Src = new CallInst(new Function(CI->getCalledFunction()->getFunctionType(),
-                                    CI->getCalledFunction()->getLinkage(),
-                                    "llvm.ctpop"), Src);
+
+    Src = LowerCTPOP(Src, CI);
     CI->replaceAllUsesWith(Src);
     break;
   }
   case Intrinsic::cttz: {
     Value *Src = CI->getOperand(1);
-    Src = BinaryOperator::create(Instruction::And, BinaryOperator::createNot(Src),
-            BinaryOperator::create(Instruction::Sub, Src, 
-                            ConstantUInt::get(CI->getOperand(0)->getType(), 1)));
-    Src = new CallInst(new Function(CI->getCalledFunction()->getFunctionType(),
-                                    CI->getCalledFunction()->getLinkage(),
-                                    "llvm.ctpop"), Src);
+    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);
     CI->replaceAllUsesWith(Src);
     break;
   }
@@ -442,5 +336,5 @@
 
   assert(CI->use_empty() &&
          "Lowering should have eliminated any uses of the intrinsic call!");
-  CI->getParent()->getInstList().erase(CI);
+  CI->eraseFromParent();
 }






More information about the llvm-commits mailing list