[llvm-commits] [dragonegg] r127161 - in /dragonegg/trunk: llvm-convert.cpp llvm-internal.h

Duncan Sands baldrick at free.fr
Mon Mar 7 07:56:08 PST 2011


Author: baldrick
Date: Mon Mar  7 09:56:08 2011
New Revision: 127161

URL: http://llvm.org/viewvc/llvm-project?rev=127161&view=rev
Log:
Add a separate routine for turning INTEGER_CST into a constant of register
type.  This results in duplicated code, but I plan to transmogrify the
original version into something completely different.

Modified:
    dragonegg/trunk/llvm-convert.cpp
    dragonegg/trunk/llvm-internal.h

Modified: dragonegg/trunk/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-convert.cpp?rev=127161&r1=127160&r2=127161&view=diff
==============================================================================
--- dragonegg/trunk/llvm-convert.cpp (original)
+++ dragonegg/trunk/llvm-convert.cpp Mon Mar  7 09:56:08 2011
@@ -5881,8 +5881,7 @@
     llvm_unreachable("Unhandled GIMPLE constant!");
 
   case INTEGER_CST:
-    C = TreeConstantToLLVM::ConvertINTEGER_CST(reg);
-    break;
+    return EmitRegisterIntegerConstant(reg);
   case REAL_CST:
     C = TreeConstantToLLVM::ConvertREAL_CST(reg);
     break;
@@ -5905,6 +5904,34 @@
   return Mem2Reg(C, TREE_TYPE(reg), *TheFolder);
 }
 
+/// EmitRegisterIntegerConstant - Turn the given INTEGER_CST into an LLVM
+/// constant of the corresponding register type.
+Constant *TreeToLLVM::EmitRegisterIntegerConstant(tree reg) {
+  unsigned Precision = TYPE_PRECISION(TREE_TYPE(reg));
+
+  ConstantInt *CI;
+  if (HOST_BITS_PER_WIDE_INT < integerPartWidth) {
+    assert(2 * HOST_BITS_PER_WIDE_INT <= integerPartWidth &&
+           "Unsupported host integer precision!");
+    unsigned ShiftAmt = HOST_BITS_PER_WIDE_INT;
+    integerPart Val = (integerPart)(unsigned HOST_WIDE_INT)TREE_INT_CST_LOW(reg)
+      + ((integerPart)(unsigned HOST_WIDE_INT)TREE_INT_CST_HIGH(reg) << ShiftAmt);
+    CI = ConstantInt::get(Context, APInt(Precision, Val));
+  } else {
+    assert(HOST_BITS_PER_WIDE_INT == integerPartWidth &&
+           "The engines cannae' take it captain!");
+    integerPart Parts[] = { TREE_INT_CST_LOW(reg), TREE_INT_CST_HIGH(reg) };
+    CI = ConstantInt::get(Context, APInt(Precision, 2, Parts));
+  }
+
+  // The destination can be a pointer, integer or floating point type so we need
+  // a generalized cast here
+  const Type *Ty = GetRegType(TREE_TYPE(reg));
+  Instruction::CastOps opcode = CastInst::getCastOpcode(CI, false, Ty,
+    !TYPE_UNSIGNED(TREE_TYPE(reg)));
+  return TheFolder->CreateCast(opcode, CI, Ty);
+}
+
 /// Mem2Reg - Convert a value of in-memory type (that given by ConvertType)
 /// to in-register type (that given by GetRegType).
 Value *TreeToLLVM::Mem2Reg(Value *V, tree_node *type, LLVMBuilder &Builder) {

Modified: dragonegg/trunk/llvm-internal.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/llvm-internal.h?rev=127161&r1=127160&r2=127161&view=diff
==============================================================================
--- dragonegg/trunk/llvm-internal.h (original)
+++ dragonegg/trunk/llvm-internal.h Mon Mar  7 09:56:08 2011
@@ -782,6 +782,10 @@
   /// to an LLVM constant.  Creates no code, only constants.
   Constant *EmitRegisterConstant(tree_node *reg);
 
+  /// EmitRegisterIntegerConstant - Turn the given INTEGER_CST into an LLVM
+  /// constant of the corresponding register type.
+  Constant *EmitRegisterIntegerConstant(tree_node *reg);
+
   /// Mem2Reg - Convert a value of in-memory type (that given by ConvertType)
   /// to in-register type (that given by GetRegType).  TODO: Eliminate these
   /// methods: "memory" values should never be held in registers.  Currently





More information about the llvm-commits mailing list