Ramkumar Ramachandra
2015-Feb-09 06:14 UTC
[LLVMdev] DataLayout missing in isDereferenceablePointer()
Eric Christopher wrote:> How are you trying to call it? Do you have a DataLayout?In test/Analysis/ValueTracking/memory-dereferenceable.ll, just change byval to dereferenceable(8), and %dparam won't match (see lib/IR/Value.cpp:521 for the logic that is supposed to fire). How do I get it to pass? I tried introducing a target-triple and target-datalayout, but it didn't help.
Sanjoy Das
2015-Feb-09 07:01 UTC
[LLVMdev] DataLayout missing in isDereferenceablePointer()
Ram, You need to change MemDerefPrinter to pass in the DataLayout to isDereferenceablePointer. The test passes with this change: (NB: this may not be the right way to solve the problem) diff --git a/lib/Analysis/MemDerefPrinter.cpp b/lib/Analysis/MemDerefPrinter.cpp index 64cec18..d239cdf 100644 --- a/lib/Analysis/MemDerefPrinter.cpp +++ b/lib/Analysis/MemDerefPrinter.cpp @@ -36,22 +36,23 @@ namespace { char MemDerefPrinter::ID = 0; INITIALIZE_PASS(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 = F.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); } } return false; } void MemDerefPrinter::print(raw_ostream &OS, const Module *M) const { OS << "The following are dereferenceable:\n"; for (auto &V: Vec) { diff --git a/test/Analysis/ValueTracking/memory-dereferenceable.ll b/test/Analysis/ValueTracking/memory-dereferenceable.ll index 1ec3fef..f4ca532 100644 --- a/test/Analysis/ValueTracking/memory-dereferenceable.ll +++ b/test/Analysis/ValueTracking/memory-dereferenceable.ll @@ -1,19 +1,21 @@ ; RUN: opt -print-memderefs -analyze -S <%s | FileCheck %s ; 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 ; CHECK: %dparam ; We haven't yet taught it to look through relocations ; CHECK-NOT: %relocate ; CHECK-NOT: %nparam entry: %globalptr = getelementptr inbounds [6 x i8]* @globalstr, i32 0, i32 0 On Sun, Feb 8, 2015 at 10:14 PM, Ramkumar Ramachandra <artagnon at gmail.com> wrote:> Eric Christopher wrote: >> How are you trying to call it? Do you have a DataLayout? > > In test/Analysis/ValueTracking/memory-dereferenceable.ll, just change > byval to dereferenceable(8), and %dparam won't match (see > lib/IR/Value.cpp:521 for the logic that is supposed to fire). How do I > get it to pass? I tried introducing a target-triple and > target-datalayout, but it didn't help. > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Ramkumar Ramachandra
2015-Feb-09 16:13 UTC
[LLVMdev] DataLayout missing in isDereferenceablePointer()
Sanjoy, Thanks; this particular case was my stupidity (I wrote -print-memderefs), but I was originally having issues with deref not propagating in InstCombine -- I suppose I have to follow the same approach. Sanjoy Das wrote:> (NB: this may not be the right way to solve the problem)It would be nice if someone can tell me if this is the way it's meant to be done.