[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