mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
MemDerefPrinter: Require DataLayoutPass for higher accuracy
Without a valid data layout, deferenceable(N) doesn't get parsed or propagated. Since this is the key item we are testing, add a dependency on the pass. Differential Revision: http://reviews.llvm.org/D7508 llvm-svn: 228611
This commit is contained in:
parent
4ae49786df
commit
1f2f915d0a
@ -11,6 +11,7 @@
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/Analysis/MemoryDependenceAnalysis.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/InstIterator.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
@ -25,6 +26,10 @@ namespace {
|
||||
MemDerefPrinter() : FunctionPass(ID) {
|
||||
initializeMemDerefPrinterPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.addRequired<DataLayoutPass>();
|
||||
AU.setPreservesAll();
|
||||
}
|
||||
bool runOnFunction(Function &F) override;
|
||||
void print(raw_ostream &OS, const Module * = nullptr) const override;
|
||||
void releaseMemory() override {
|
||||
@ -34,18 +39,22 @@ namespace {
|
||||
}
|
||||
|
||||
char MemDerefPrinter::ID = 0;
|
||||
INITIALIZE_PASS(MemDerefPrinter, "print-memderefs",
|
||||
"Memory Dereferenciblity of pointers in function", false, true)
|
||||
INITIALIZE_PASS_BEGIN(MemDerefPrinter, "print-memderefs",
|
||||
"Memory Dereferenciblity of pointers in function", false, true)
|
||||
INITIALIZE_PASS_DEPENDENCY(DataLayoutPass)
|
||||
INITIALIZE_PASS_END(MemDerefPrinter, "print-memderefs",
|
||||
"Memory Dereferenciblity of pointers in function", false, true)
|
||||
|
||||
FunctionPass *llvm::createMemDerefPrinter() {
|
||||
return new MemDerefPrinter();
|
||||
}
|
||||
|
||||
bool MemDerefPrinter::runOnFunction(Function &F) {
|
||||
const DataLayout *DL = &getAnalysis<DataLayoutPass>().getDataLayout();
|
||||
for (auto &I: inst_range(F)) {
|
||||
if (LoadInst *LI = dyn_cast<LoadInst>(&I)) {
|
||||
Value *PO = LI->getPointerOperand();
|
||||
if (PO->isDereferenceablePointer(nullptr))
|
||||
if (PO->isDereferenceablePointer(DL))
|
||||
Vec.push_back(PO);
|
||||
}
|
||||
}
|
||||
|
@ -3,11 +3,13 @@
|
||||
; Uses the print-deref (+ analyze to print) pass to run
|
||||
; isDereferenceablePointer() on many load instruction operands
|
||||
|
||||
target datalayout = "e"
|
||||
|
||||
declare zeroext i1 @return_i1()
|
||||
|
||||
@globalstr = global [6 x i8] c"hello\00"
|
||||
|
||||
define void @test(i32 addrspace(1)* byval %dparam) {
|
||||
define void @test(i32 addrspace(1)* dereferenceable(8) %dparam) {
|
||||
; CHECK: The following are dereferenceable:
|
||||
; CHECK: %globalptr
|
||||
; CHECK: %alloca
|
||||
|
Loading…
x
Reference in New Issue
Block a user