[LLVMdev] dense maps

Preston Briggs preston.briggs at gmail.com
Thu Jan 26 15:11:55 PST 2012


My problem was that the constructor for DenseMap has an undocumented
constraint.


explicit DenseMap(unsigned NumInitBuckets = 0) {
  init(NumInitBuckets);
}

if given an explicit argument, requires that the argument be a power of 2.

It's checked by an assert in init(), but for some reason my code didn't
trip the assertion.
Is there a special way I must make to enable asserts?

Thanks,
Preston


On Wed, Jan 25, 2012 at 9:44 PM, Preston Briggs <preston.briggs at gmail.com>wrote:

> Reading the LLVM Programmer's Manual, the description of DenseSet mentions:
>
> *Note that DenseSet has the same requirements for the value type that
> DenseMap <http://llvm.org/docs/ProgrammersManual.html#dss_densemap> has.*
>
>
> But when I read about DenseMap, I don't really see any requirements for
> the values, just a warning about space.  On the other hand, the *keys*have special requirements, which aren't entirely clear to me.  It says
>
>
> *Finally, you must implement a partial specialization of DenseMapInfo for
> the key that you want, if it isn't already supported. This is required to
> tell DenseMap about two special marker values (which can never be inserted
> into the map) that it needs internally.*
>
> Will my code fail to compile if the required specialization of
> DenseMapInfo is not present?
>
> I wonder all these things because I've tripped across a problem where a
> method hangs repeatably, and I don't see the problem.
>
> typedef SmallVector<BasicBlock *, 4> Frontier;
> DenseMap<BasicBlock *, Frontier> frontier(blocks*3/2);
>
> BasicBlock *Xblock = ...
>
> errs() << "start\n";
> Frontier &f = frontier[Xblock];    // Xblock is not yet represented in
> frontier
> errs() << "finish\n";
>
>
> It compiles fine (as part of a function-level pass), but the call
> frontier[Xblock] fails (hangs) after several successful calls.  I tried
> replacing the declaration of frontier with
>
> DenseMap<BasicBlock *, Frontier *> frontier(blocks*3/2);
>
>
> but trip over the same problem in the same place.
>
> I've used the DenseMap successfully in several other places, so I'm not
> sure that's gone wrong here.
>
> Any ideas?
>
> Thanks,
> Preston
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120126/a5845af8/attachment.html>


More information about the llvm-dev mailing list