mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
731346ec27
There is a circular dependency between SROA and InferAddressSpaces today that requires running both multiple times in order to be able to eliminate all simple allocas and addrspacecasts. InferAddressSpaces can't remove addrspacecasts when written to memory, and SROA helps move pointers out of memory. This should avoid inserting new commuting addrspacecasts with GEPs, since there are unresolved questions about pointer wrapping between different address spaces. For now, don't replace volatile operations that don't match the alloca addrspace, as it would change the address space of the access. It may be still OK to insert an addrspacecast from the new alloca, but be more conservative for now. llvm-svn: 363462
45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
//===- PtrUseVisitor.cpp - InstVisitors over a pointers uses --------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
/// \file
|
|
/// Implementation of the pointer use visitors.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Analysis/PtrUseVisitor.h"
|
|
#include "llvm/IR/Instruction.h"
|
|
#include "llvm/IR/Instructions.h"
|
|
#include <algorithm>
|
|
|
|
using namespace llvm;
|
|
|
|
void detail::PtrUseVisitorBase::enqueueUsers(Instruction &I) {
|
|
for (Use &U : I.uses()) {
|
|
if (VisitedUses.insert(&U).second) {
|
|
UseToVisit NewU = {
|
|
UseToVisit::UseAndIsOffsetKnownPair(&U, IsOffsetKnown),
|
|
Offset
|
|
};
|
|
Worklist.push_back(std::move(NewU));
|
|
}
|
|
}
|
|
}
|
|
|
|
bool detail::PtrUseVisitorBase::adjustOffsetForGEP(GetElementPtrInst &GEPI) {
|
|
if (!IsOffsetKnown)
|
|
return false;
|
|
|
|
APInt TmpOffset(DL.getIndexTypeSizeInBits(GEPI.getType()), 0);
|
|
if (GEPI.accumulateConstantOffset(DL, TmpOffset)) {
|
|
Offset += TmpOffset.sextOrTrunc(Offset.getBitWidth());
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|