@@ -5224,18 +5224,29 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
5224
5224
WeakTrackingVH SunkAddrVH = SunkAddrs[Addr];
5225
5225
5226
5226
Value * SunkAddr = SunkAddrVH.pointsToAliveValue () ? SunkAddrVH : nullptr ;
5227
+ Type *IntPtrTy = DL->getIntPtrType (Addr->getType ());
5227
5228
if (SunkAddr) {
5228
5229
LLVM_DEBUG (dbgs () << " CGP: Reusing nonlocal addrmode: " << AddrMode
5229
5230
<< " for " << *MemoryInst << " \n " );
5230
- if (SunkAddr->getType () != Addr->getType ())
5231
- SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5231
+ if (SunkAddr->getType () != Addr->getType ()) {
5232
+ // Even though we only considered no-op addrspacecasts,
5233
+ // semantically-meaningful conversions may still be present due to
5234
+ // ptrtoint/inttoptr sequences.
5235
+ if (SunkAddr->getType ()->getPointerAddressSpace () !=
5236
+ Addr->getType ()->getPointerAddressSpace () &&
5237
+ !DL->isNonIntegralPointerType (Addr->getType ())) {
5238
+ SunkAddr = Builder.CreatePtrToInt (SunkAddr, IntPtrTy, " sunkaddr" );
5239
+ SunkAddr =
5240
+ Builder.CreateIntToPtr (SunkAddr, Addr->getType (), " sunkaddr" );
5241
+ } else
5242
+ SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5243
+ }
5232
5244
} else if (AddrSinkUsingGEPs || (!AddrSinkUsingGEPs.getNumOccurrences () &&
5233
5245
SubtargetInfo->addrSinkUsingGEPs ())) {
5234
5246
// By default, we use the GEP-based method when AA is used later. This
5235
5247
// prevents new inttoptr/ptrtoint pairs from degrading AA capabilities.
5236
5248
LLVM_DEBUG (dbgs () << " CGP: SINKING nonlocal addrmode: " << AddrMode
5237
5249
<< " for " << *MemoryInst << " \n " );
5238
- Type *IntPtrTy = DL->getIntPtrType (Addr->getType ());
5239
5250
Value *ResultPtr = nullptr , *ResultIndex = nullptr ;
5240
5251
5241
5252
// First, find the pointer.
@@ -5364,8 +5375,19 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
5364
5375
: Builder.CreateGEP (I8Ty, ResultPtr, ResultIndex, " sunkaddr" );
5365
5376
}
5366
5377
5367
- if (SunkAddr->getType () != Addr->getType ())
5368
- SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5378
+ if (SunkAddr->getType () != Addr->getType ()) {
5379
+ // Even though we only considered no-op addrspacecasts,
5380
+ // semantically-meaningful conversions may still be present due to
5381
+ // ptrtoint/inttoptr sequences.
5382
+ if (SunkAddr->getType ()->getPointerAddressSpace () !=
5383
+ Addr->getType ()->getPointerAddressSpace () &&
5384
+ !DL->isNonIntegralPointerType (Addr->getType ())) {
5385
+ SunkAddr = Builder.CreatePtrToInt (SunkAddr, IntPtrTy, " sunkaddr" );
5386
+ SunkAddr =
5387
+ Builder.CreateIntToPtr (SunkAddr, Addr->getType (), " sunkaddr" );
5388
+ } else
5389
+ SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5390
+ }
5369
5391
}
5370
5392
} else {
5371
5393
// We'd require a ptrtoint/inttoptr down the line, which we can't do for
0 commit comments