Add support for shift constant expressions
authorChris Lattner <sabre@nondot.org>
Wed, 21 May 2003 17:49:25 +0000 (17:49 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 21 May 2003 17:49:25 +0000 (17:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6260 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Constants.cpp

index 9efc313be7684cf5c13f88ff0ba893167426c83c..273ab07293c73f02153c4d15c0d0cbf42387bd26 100644 (file)
@@ -649,6 +649,12 @@ Constant *ConstantExpr::getCast(Constant *C, const Type *Ty) {
 }
 
 Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2) {
+  // Check the operands for consistency first
+  assert((Opcode >= Instruction::BinaryOpsBegin &&
+          Opcode < Instruction::BinaryOpsEnd) &&
+         "Invalid opcode in binary constant expression");
+  assert(C1->getType() == C2->getType() &&
+         "Operand types in binary constant expression should match");
   
   if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2))
     return FC;          // Fold a few common cases...
@@ -659,20 +665,37 @@ Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2) {
   ConstantExpr *Result = ExprConstants.get(C1->getType(), Key);
   if (Result) return Result;
   
-  // Its not in the table so create a new one and put it in the table.
+  // It's not in the table so create a new one and put it in the table.
+  Result = new ConstantExpr(Opcode, C1, C2);
+  ExprConstants.add(C1->getType(), Key, Result);
+  return Result;
+}
+
+/// getShift - Return a shift left or shift right constant expr
+Constant *ConstantExpr::getShift(unsigned Opcode, Constant *C1, Constant *C2) {
   // Check the operands for consistency first
-  assert((Opcode >= Instruction::BinaryOpsBegin &&
-          Opcode < Instruction::BinaryOpsEnd) &&
+  assert((Opcode == Instruction::Shl ||
+          Opcode == Instruction::Shr) &&
          "Invalid opcode in binary constant expression");
+  assert(C1->getType()->isIntegral() && C2->getType() == Type::UByteTy &&
+         "Invalid operand types for Shift constant expr!");
 
-  assert(C1->getType() == C2->getType() &&
-         "Operand types in binary constant expression should match");
+  if (Constant *FC = ConstantFoldShiftInstruction(Opcode, C1, C2))
+    return FC;          // Fold a few common cases...
+
+  // Look up the constant in the table first to ensure uniqueness
+  std::vector<Constant*> argVec(1, C1); argVec.push_back(C2);
+  const ExprMapKeyType &Key = std::make_pair(Opcode, argVec);
+  ConstantExpr *Result = ExprConstants.get(C1->getType(), Key);
+  if (Result) return Result;
   
+  // It's not in the table so create a new one and put it in the table.
   Result = new ConstantExpr(Opcode, C1, C2);
   ExprConstants.add(C1->getType(), Key, Result);
   return Result;
 }
 
+
 Constant *ConstantExpr::getGetElementPtr(Constant *C,
                                          const std::vector<Constant*> &IdxList){
   if (Constant *FC = ConstantFoldGetElementPtr(C, IdxList))