@@ -5044,18 +5044,29 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
5044
5044
WeakTrackingVH SunkAddrVH = SunkAddrs[Addr];
5045
5045
5046
5046
Value * SunkAddr = SunkAddrVH.pointsToAliveValue () ? SunkAddrVH : nullptr ;
5047
+ Type *IntPtrTy = DL->getIntPtrType (Addr->getType ());
5047
5048
if (SunkAddr) {
5048
5049
LLVM_DEBUG (dbgs () << " CGP: Reusing nonlocal addrmode: " << AddrMode
5049
5050
<< " for " << *MemoryInst << " \n " );
5050
- if (SunkAddr->getType () != Addr->getType ())
5051
- SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5051
+ if (SunkAddr->getType () != Addr->getType ()) {
5052
+ // Even though we only considered no-op addrspacecasts,
5053
+ // semantically-meaningful conversions may still be present due to
5054
+ // ptrtoint/inttoptr sequences.
5055
+ if (SunkAddr->getType ()->getPointerAddressSpace () !=
5056
+ Addr->getType ()->getPointerAddressSpace () &&
5057
+ !DL->isNonIntegralPointerType (Addr->getType ())) {
5058
+ SunkAddr = Builder.CreatePtrToInt (SunkAddr, IntPtrTy, " sunkaddr" );
5059
+ SunkAddr =
5060
+ Builder.CreateIntToPtr (SunkAddr, Addr->getType (), " sunkaddr" );
5061
+ } else
5062
+ SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5063
+ }
5052
5064
} else if (AddrSinkUsingGEPs || (!AddrSinkUsingGEPs.getNumOccurrences () &&
5053
5065
SubtargetInfo->addrSinkUsingGEPs ())) {
5054
5066
// By default, we use the GEP-based method when AA is used later. This
5055
5067
// prevents new inttoptr/ptrtoint pairs from degrading AA capabilities.
5056
5068
LLVM_DEBUG (dbgs () << " CGP: SINKING nonlocal addrmode: " << AddrMode
5057
5069
<< " for " << *MemoryInst << " \n " );
5058
- Type *IntPtrTy = DL->getIntPtrType (Addr->getType ());
5059
5070
Value *ResultPtr = nullptr , *ResultIndex = nullptr ;
5060
5071
5061
5072
// First, find the pointer.
@@ -5184,8 +5195,19 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
5184
5195
: Builder.CreateGEP (I8Ty, ResultPtr, ResultIndex, " sunkaddr" );
5185
5196
}
5186
5197
5187
- if (SunkAddr->getType () != Addr->getType ())
5188
- SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5198
+ if (SunkAddr->getType () != Addr->getType ()) {
5199
+ // Even though we only considered no-op addrspacecasts,
5200
+ // semantically-meaningful conversions may still be present due to
5201
+ // ptrtoint/inttoptr sequences.
5202
+ if (SunkAddr->getType ()->getPointerAddressSpace () !=
5203
+ Addr->getType ()->getPointerAddressSpace () &&
5204
+ !DL->isNonIntegralPointerType (Addr->getType ())) {
5205
+ SunkAddr = Builder.CreatePtrToInt (SunkAddr, IntPtrTy, " sunkaddr" );
5206
+ SunkAddr =
5207
+ Builder.CreateIntToPtr (SunkAddr, Addr->getType (), " sunkaddr" );
5208
+ } else
5209
+ SunkAddr = Builder.CreatePointerCast (SunkAddr, Addr->getType ());
5210
+ }
5189
5211
}
5190
5212
} else {
5191
5213
// We'd require a ptrtoint/inttoptr down the line, which we can't do for
0 commit comments