[LICM] Simplify isLoadInvariantInLoop given opaque pointers (#65597)

Since we no longer support typed pointers in LLVM IR, the PtrASXTy
in isLoadInvariantInLoop was set to be equal to Addr->getType() (an
opaque ptr in the same address space). That made the loop looking
through bitcasts redundant.
This commit is contained in:
Björn Pettersson 2023-09-14 16:53:34 +02:00 committed by GitHub
parent aca9019be0
commit a0ce4384a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1039,7 +1039,7 @@ bool llvm::hoistRegion(DomTreeNode *N, AAResults *AA, LoopInfo *LI,
// invariant.start has no uses.
static bool isLoadInvariantInLoop(LoadInst *LI, DominatorTree *DT,
Loop *CurLoop) {
Value *Addr = LI->getOperand(0);
Value *Addr = LI->getPointerOperand();
const DataLayout &DL = LI->getModule()->getDataLayout();
const TypeSize LocSizeInBits = DL.getTypeSizeInBits(LI->getType());
@ -1055,21 +1055,6 @@ static bool isLoadInvariantInLoop(LoadInst *LI, DominatorTree *DT,
if (LocSizeInBits.isScalable())
return false;
// if the type is ptr addrspace(x), we know this is the type of
// llvm.invariant.start operand
auto *PtrASXTy = PointerType::get(LI->getContext(),
LI->getPointerAddressSpace());
unsigned BitcastsVisited = 0;
// Look through bitcasts until we reach the PtrASXTy type (this is
// invariant.start operand type).
// FIXME: We shouldn't really find such bitcasts with opaque pointers.
while (Addr->getType() != PtrASXTy) {
auto *BC = dyn_cast<BitCastInst>(Addr);
// Avoid traversing high number of bitcast uses.
if (++BitcastsVisited > MaxNumUsesTraversed || !BC)
return false;
Addr = BC->getOperand(0);
}
// If we've ended up at a global/constant, bail. We shouldn't be looking at
// uselists for non-local Values in a loop pass.
if (isa<Constant>(Addr))