[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.

llvm-svn: 273020
This commit is contained in:
David Majnemer 2016-06-17 17:47:24 +00:00
parent 9f86baebe0
commit 3370c20c7e
2 changed files with 8 additions and 2 deletions

View File

@ -1314,8 +1314,14 @@ llvm::Constant *CodeGenModule::EmitConstantValue(const APValue &Value,
// 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)

View File

@ -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