Author: majnemer Date: Fri Jun 17 12:47:24 2016 New Revision: 273020 URL: http://llvm.org/viewvc/llvm-project?rev=273020&view=rev Log: [CodeGen] Use pointer-sized integers for ptrtoint sources
Given something like: void *v = (void *)100; We need to synthesize a ptrtoint operation from 100. During constant emission, we choose i64 as the type for our constant because it guaranteed not to drop any bits from our CharUnits representation of the value. However, this is suboptimal for 32-bit targets: LLVM passes like GlobalOpt will get confused by these sorts of casts resulting in pessimization. Instead, make sure the ptrtoint operand has a pointer-sized integer type. Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp cfe/trunk/test/CodeGen/const-init.c Modified: cfe/trunk/lib/CodeGen/CGExprConstant.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprConstant.cpp?rev=273020&r1=273019&r2=273020&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGExprConstant.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExprConstant.cpp Fri Jun 17 12:47:24 2016 @@ -1314,8 +1314,14 @@ llvm::Constant *CodeGenModule::EmitConst // Convert to the appropriate type; this could be an lvalue for // an integer. - if (isa<llvm::PointerType>(DestTy)) + if (isa<llvm::PointerType>(DestTy)) { + // Convert the integer to a pointer-sized integer before converting it + // to a pointer. + C = llvm::ConstantExpr::getIntegerCast( + C, getDataLayout().getIntPtrType(DestTy), + /*isSigned=*/false); return llvm::ConstantExpr::getIntToPtr(C, DestTy); + } // If the types don't match this should only be a truncate. if (C->getType() != DestTy) Modified: cfe/trunk/test/CodeGen/const-init.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/const-init.c?rev=273020&r1=273019&r2=273020&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/const-init.c (original) +++ cfe/trunk/test/CodeGen/const-init.c Fri Jun 17 12:47:24 2016 @@ -84,7 +84,7 @@ struct g13_s0 g13[] = { { (long) &g12_tmp } }; -// CHECK: @g14 = global i8* inttoptr (i64 100 to i8*) +// CHECK: @g14 = global i8* inttoptr (i32 100 to i8*) void *g14 = (void*) 100; // CHECK: @g15 = global i32 -1 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits