From c904d5075f364d5ec2996e9270a6082e482510bc Mon Sep 17 00:00:00 2001 From: Ramkumar Ramachandra Date: Mon, 9 Feb 2015 21:50:03 +0000 Subject: [PATCH] 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 --- lib/Analysis/MemDerefPrinter.cpp | 15 ++++++++++++--- .../ValueTracking/memory-dereferenceable.ll | 4 +++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/Analysis/MemDerefPrinter.cpp b/lib/Analysis/MemDerefPrinter.cpp index 64cec181a2f..531d75e730d 100644 --- a/lib/Analysis/MemDerefPrinter.cpp +++ b/lib/Analysis/MemDerefPrinter.cpp @@ -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(); + 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().getDataLayout(); for (auto &I: inst_range(F)) { if (LoadInst *LI = dyn_cast(&I)) { Value *PO = LI->getPointerOperand(); - if (PO->isDereferenceablePointer(nullptr)) + if (PO->isDereferenceablePointer(DL)) Vec.push_back(PO); } } diff --git a/test/Analysis/ValueTracking/memory-dereferenceable.ll b/test/Analysis/ValueTracking/memory-dereferenceable.ll index 676d33a4e2e..1c55efc3715 100644 --- a/test/Analysis/ValueTracking/memory-dereferenceable.ll +++ b/test/Analysis/ValueTracking/memory-dereferenceable.ll @@ -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 -- 2.34.1