[PATCH] D23036: [SelectionDAG] Use a union of bitfield structs for SDNode::SubclassData.
Justin Lebar via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 4 16:23:25 PDT 2016
Sorry for taking so long to come back to this; I was sick after I got
back from my trip.
Now that I look at it, I don't think the new code is right.
unsigned getRawSubclassData() const {
uint16_t Data;
memcpy(&Data, &SDNodeBits, sizeof(SDNodeBits));
static_assert(sizeof(SDNodeBits) <= sizeof(uint16_t),
"SDNodeBits field too large?");
return Data;
}
If sizeof(SDNodeBits) == 1, then we have a few problems:
* Our code is endianness-unsafe. Which doesn't matter because we're
just using this as input into a hashtable key, but still.
* Half of Data is uninitialized.
* We're not copying all of the bits from the anonymous union, which is
the intent of the code.
The obvious thing would be to add a uint16_t member to the anon union,
but I am pretty sure Chandler explained to me this would be UB. We
are already walking very close to the line here.
I'll send a patch to do the not-obvious thing and make sure a language
lawyer stamps it.
-Justin
On Thu, Aug 25, 2016 at 5:57 PM, Akira Hatanaka <ahatanak at gmail.com> wrote:
> ahatanak added a comment.
>
> Fixed the static_assert in r279797. Feel free to change the message or remove the assert if you want. I'll be watching the bot to see if it passes the static_assert.
>
>
> Repository:
> rL LLVM
>
> https://reviews.llvm.org/D23036
>
>
>
More information about the llvm-commits
mailing list