[LLVMdev] Large constants in patchpoints (original) (raw)
Juergen Ributzka juergen at apple.com
Fri Oct 31 11:47:32 PDT 2014
- Previous message: [LLVMdev] Large constants in patchpoints
- Next message: [LLVMdev] Large constants in patchpoints
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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 int64t, 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" 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 + (int64t(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
- Previous message: [LLVMdev] Large constants in patchpoints
- Next message: [LLVMdev] Large constants in patchpoints
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]