[LLVMdev] PointerIntPair causing trouble

Gordon Henriksen gordonhenriksen at me.com
Fri May 1 17:39:41 PDT 2009

On 2009-05-01, at 18:40, Stefanus Du Toit wrote:

> Hi Nicolas,
> Looks like Preston and I have found the cause of the problem. The  
> issue is with PointerLikeTypeTraits<T*>::NumLowBitsAvailable. This  
> is set to 3, which basically assumes that unless the traits are  
> specialized for a particular pointer type, objects of that type are  
> allocated with malloc() and aligned to 8 bytes.
> While PointerLikeTypeTraits is overloaded for Use*, it is not  
> overloaded for User*. lib/VMCore/Use.cpp uses a  
> PointerIntPair<User*, 1, Tag>, and things go bad. Users are  
> typically allocated in an array after a bunch of Uses, which are 12  
> bytes in size, so they may actually only be aligned to 4 bytes.
> The attached patch (which I don't intend to commit, it's just a  
> workaround) works around this simply by dropping this down to 2  
> bits, which gets us past our problem on Windows. I would appreciate  
> if you could verify that this works for you as well.
> To actually solve this properly I see two main options:
> (1) we could specialize PointerLikeTypeTraits for User*, and leave  
> the default value of NumLowBitsAvailable at 3.
> (2) we could drop the default NumLowBitsAvailable to 2 (or even use  
> _alignof and similar compiler-specific extensions to determine it),  
> and allow classes that assert that they are only ever allocated  
> through malloc to relax it back up to 3.

Something like this device should suffice; no need for extensions.

template<typename T>
class alignment_of {
   struct test {
     char a;
     T b;

   enum { value = sizeof(test) - sizeof(T) };

// usage: alignment_of<int>::value

TR1's type_traits header is now available on many platforms now, too.

> My preference would be for option (2), due to the difficulty of  
> tracking this bug down, and the risk of future similar bugs  
> happening. However, I'd appreciate some feedback from the LLVM  
> developer community on this. Please let me know what you think, and  
> I'll be happy to prepare a patch.
> I'm still wondering why this wasn't an issue on other platforms. One  
> possibility is that Use is being bumped up to 16 bytes in size, and  
> thus Users never get placed at less than an 8-byte boundary.  
> However, in that case, the whole point of the "use diet"  
> optimization is lost! I'll investigate and try to find out.
> I'm also still not sure why the assertion in  
> PointerIntPair::setPointer() did not get triggered by the  
> User::allocHungOffUses() implementation in Use.cpp. Perhaps the  
> assertion is wrong (it looks reasonable, though) or perhaps there is  
> something else going on I haven't seen yet. I'll look into this some  
> more as well.
> Let me know if the workaround works for you, and I'd appreciate  
> feedback from anyone (Chris? Gabor?) as to how best to proceed.
> Thanks!
> Stefanus
> <pointer_traits_workaround.diff>
> On 1-May-09, at 6:32 AM, Nicolas Capens wrote:
>> Hi all,
>> I’ve located a regression that causes my project to crash. It’s in  
>> revision 67979, where PointerIntPair is changed from storing the  
>> integer in the upper bits instead of the lower bits. My project is  
>> an experimental JIT-compiler in Windows.
>> So I was wondering if anyone had any clue why the new  
>> PointerIntPair implementation might fail. It doesn’t seem very safe  
>> to me to store other data into a pointer to begin with, but surely  
>> the lower bits must be a safer location than the upper bits?
>> The actual crash I’m seeing is preceded by an assert in  
>> X86InstrInfo::sizeOfImm: "Immediate size not set!". Tracing  
>> backward, I’m seeing a MachineInstr with opcode MOV32rm and  
>> NumOperands equal to 6 (which is 5 in earlier revisions). I’m not  
>> sure if this actually helps explain the bug but it’s one of the  
>> weird things that happen with revision 67979 and subsequent  
>> revisions…
>> All help appreciated.
>> Nicolas
>> <ATT00001.txt>
> --
> Stefanus Du Toit <stefanus.dutoit at rapidmind.com>
>   RapidMind Inc.
>   phone: +1 519 885 5455 x116 -- fax: +1 519 885 1463
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090501/c0b03dee/attachment.html>

More information about the llvm-dev mailing list