[llvm-commits] [llvm-gcc-4.2] r64234 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-types.cpp

Duncan Sands baldrick at free.fr
Tue Feb 10 12:43:26 PST 2009


Author: baldrick
Date: Tue Feb 10 14:43:26 2009
New Revision: 64234

URL: http://llvm.org/viewvc/llvm-project?rev=64234&view=rev
Log:
Handle odd-sized integers coming from bitfields
using apint codegen rather than the current hack.
See FrontendC/2008-01-07-UnusualIntSize.c.

Modified:
    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
    llvm-gcc-4.2/trunk/gcc/llvm-types.cpp

Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=64234&r1=64233&r2=64234&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Tue Feb 10 14:43:26 2009
@@ -1101,31 +1101,7 @@
     Result = TreeConstantToLLVM::ConvertVECTOR_CST(exp);
     break;
   }
-  
-  // If this is an operation on an integer value in a precision smaller than
-  // the LLVM value we are computing it in, reduce the excess precision here.
-  // This happens with odd-sized bitfields (e.g. i33) that are evaluated in the
-  // next size power-of-two register (e.g. i64).  This should be reevaluated
-  // when we have good support for unusual sized integers in the code generator.
-  if (Result && TREE_CODE(TREE_TYPE(exp)) == INTEGER_TYPE) {
-    unsigned LLVMWidth = Result->getType()->getPrimitiveSizeInBits();
-    unsigned TreeWidth = TYPE_PRECISION(TREE_TYPE(exp));
-    if (LLVMWidth > TreeWidth && lang_hooks.reduce_bit_field_operations) {
-      if (TYPE_UNSIGNED(TREE_TYPE(exp))) {
-        // Use an 'and' to clear excess top bits.
-        Constant *Mask =
-          ConstantInt::get(APInt::getLowBitsSet(LLVMWidth, TreeWidth));
-        Result = Builder.CreateAnd(Result, Mask, "mask");
-      } else {
-        // Shift Left then shift right.
-        Constant *ShAmt = ConstantInt::get(Result->getType(), 
-                                           LLVMWidth-TreeWidth);
-        Result = Builder.CreateShl(Result, ShAmt, "sextl");
-        Result = Builder.CreateAShr(Result, ShAmt, "sextr");
-      }
-    }
-  }
-  
+
   if (TheDebugInfo && EXPR_HAS_LOCATION(exp)) {
     // Restore location back down the tree.
     TheDebugInfo->setLocationFile(EXPR_FILENAME(exp));

Modified: llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-types.cpp?rev=64234&r1=64233&r2=64234&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-types.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-types.cpp Tue Feb 10 14:43:26 2009
@@ -746,8 +746,7 @@
     type = orig_type;
   case INTEGER_TYPE:
     if (const Type *Ty = GET_TYPE_LLVM(type)) return Ty;
-    return SET_TYPE_LLVM(type, 
-                         IntegerType::get(TREE_INT_CST_LOW(TYPE_SIZE(type))));
+    return SET_TYPE_LLVM(type, IntegerType::get(TYPE_PRECISION(type)));
   case REAL_TYPE:
     if (const Type *Ty = GET_TYPE_LLVM(type)) return Ty;
     switch (TYPE_PRECISION(type)) {





More information about the llvm-commits mailing list