[LLVMdev] Large constants in patchpoints
Juergen Ributzka
juergen at apple.com
Fri Oct 31 11:47:32 PDT 2014
We also could make the DenseMap just an uint64_t. In this case the empty key and the tombstone would be never encoded into the constant pool, because they can be encoded in the offset field itself.
> On Oct 31, 2014, at 11:20 AM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote:
>
> Currently llvm crashes on following code, run through llc:
>
> declare void @llvm.experimental.stackmap(i64, i32, ...)
>
> define void @foo() {
> tail call void (i64, i32, ...)* @llvm.experimental.stackmap(i64 0,
> i32 0, i64 9223372036854775807)
> ret void
> }
>
> The issue is that 9223372036854775807 (decimal for 0x7fffffffffffffff)
> is the "empty key" for an int64_t, and in
> StackMaps::recordStackMapOpers we crash when we try to insert this as
> a key into ConstPool. The this happens if we change the constant to
> be the tombstone.
>
> Two potential fixes I can think of:
>
> 1. have some special logic to remember the offsets for the tombstone
> and empty i64 constants. This can easily be tracked using two
> "Optional<int>" fields.
>
> 2. change ConstantPool to be use a std::map instead of a
> llvm::DenseMap as the map in the MapVector.
>
> An aside: the same function has this check "((I->Offset +
> (int64_t(1)<<31)) >> 32)" -- won't this cause a signed overflow (and
> hence UB) if I->Offset is negative?
>
I guess "!isInt<32>(I->Offset)” might be a more readable solution.
> -- Sanjoy
More information about the llvm-dev
mailing list