[LLVMdev] How to test isDereferenceablePointer?

Philip Reames listmail at philipreames.com
Tue Jan 20 10:01:18 PST 2015


On 01/19/2015 08:35 PM, Nick Lewycky wrote:
> Philip Reames wrote:
>> T.M.K., there's no direct way to test it.
>
> There is. See the 'unittests/' directory which contains the C++ unit 
> tests. See unittests/IR/UserTest.cpp for an example that builds up IR 
> from a .ll-in-a-C-string then queries C++ API operations on it.
Thanks for pointing that out.  Another option might be to introduce a 
small printing pass that simply prints the dereferenceability of every 
pointer in a function - analogous to MemDepPrinter - then use FileCheck 
on the result of that.
>
> Nick
>
>  You have to construct a
>> transformation which happens with the information you added and not
>> otherwise.
>>
>> The easiest case might be LICM.
>>
>> Philip
>>
>> On 01/17/2015 11:25 AM, Ramkumar Ramachandra wrote:
>>> I'm have a
>>> [PATCH] isDereferenceablePointer: look through gc.relocates
>>>
>>> and I want to know how to test this patch. So far, I've found one
>>> candiate: speculative execution in SimplifyCFG
>>> (test/Transforms/SimplifyCFG/SpeculativeExec.ll). However, it's
>>> somewhat involved to show that SimplifyCFG does kick in for
>>> gc.relocate. Is there a better way to directly test it?
>>>
>>> Signed-off-by: Ramkumar Ramachandra <artagnon at gmail.com>
>>> ---
>>> lib/IR/Value.cpp | 9 +++++++++
>>> 1 file changed, 9 insertions(+)
>>>
>>> diff --git a/lib/IR/Value.cpp b/lib/IR/Value.cpp
>>> index 5f7e258..aa701d5 100644
>>> --- a/lib/IR/Value.cpp
>>> +++ b/lib/IR/Value.cpp
>>> @@ -23,8 +23,10 @@
>>> #include "llvm/IR/GetElementPtrTypeIterator.h"
>>> #include "llvm/IR/InstrTypes.h"
>>> #include "llvm/IR/Instructions.h"
>>> +#include "llvm/IR/IntrinsicInst.h"
>>> #include "llvm/IR/Module.h"
>>> #include "llvm/IR/Operator.h"
>>> +#include "llvm/IR/Statepoint.h"
>>> #include "llvm/IR/ValueHandle.h"
>>> #include "llvm/IR/ValueSymbolTable.h"
>>> #include "llvm/Support/Debug.h"
>>> @@ -570,6 +572,13 @@ static bool isDereferenceablePointer(const Value
>>> *V, const DataLayout *DL,
>>> return true;
>>> }
>>> + // For gc.relocate, look through relocations
>>> + if (const IntrinsicInst *I = dyn_cast<IntrinsicInst>(V))
>>> + if (I->getIntrinsicID() == Intrinsic::experimental_gc_relocate) {
>>> + GCRelocateOperands RelocateInst(I);
>>> + return isDereferenceablePointer(RelocateInst.derivedPtr(), DL,
>>> Visited);
>>> + }
>>> +
>>> if (const AddrSpaceCastInst *ASC = dyn_cast<AddrSpaceCastInst>(V))
>>> return isDereferenceablePointer(ASC->getOperand(0), DL, Visited);
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>




More information about the llvm-dev mailing list