mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-01 00:33:09 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228611 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c016fa420f
commit
c904d5075f
@ -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…
Reference in New Issue
Block a user