Legalize only if the type is marked as Legal or Custom. If not, return Unsupported as LegalizerHelper is not able to handle non-power-of-2 types right now.
Details
Diff Detail
Event Timeline
lib/CodeGen/GlobalISel/LegalizerInfo.cpp | ||
---|---|---|
75–76 | I was confused by the summary on this patch - I thought you wanted to make sure vector types like <3 x s32> definitely wouldn't be legalized and thought the existing code could sometimes legalize them. It then started doing the following train-of-thought: So, in summary, by the time this gets committed, I think the commit message must be clearer, and e.g. state "Enable legalization of vector types with non-power-of-2 number of elements". This patch clearly is missing tests. |
lib/CodeGen/GlobalISel/LegalizerInfo.cpp | ||
---|---|---|
75–76 |
Yes, it seems I mixed the intent and the patch. I'll update the title.
I didn’t add a test case because there wasn't any legal operations on vector types with non-power-of-2 number of elements, but I just realized I can use G_MERGE_VALUES. Thank you, |
lib/CodeGen/GlobalISel/LegalizerInfo.cpp | ||
---|---|---|
75–76 | Thanks for those changes. I'm wondering now if we shouldn't just completely drop the following: if (!isPowerOf2_64(SizeInBits)) return std::make_pair(Unsupported, LLT()); and just let the fall-back mechanism catch the many/all cases where non-power-of-2-sized types aren't supported. @t.p.northover : Do you have any thoughts on this? |
LGTM after removing the whole check and adding a good explanation in the commit message.
Can you add a simple vector test in test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll? It already has a scalar test (that shows the change is OK if it continues reporting a fallback)
lib/CodeGen/GlobalISel/LegalizerInfo.cpp | ||
---|---|---|
75–76 | I agree, we should probably drop the check completely. I think it was more of a defensive way to avoid even considering non-power-of-2 types elsewhere. But looking around, it seems we're robust enough to fail legalization properly, so it's fine to do that. |
lib/CodeGen/GlobalISel/LegalizerInfo.cpp | ||
---|---|---|
75–76 | I think we can’t drop the check right now because LegalizerHelper is not able to handle these cases. If we remove the check, LegalizerInfo is going to try to find a legal type for non-power-of-2 types and the compiler may hit the assertions in LLT::halfScalarSize() or LLT::halfElements() as they don’t expect a non-power-of-2 type. Instead, we can just check if a non-power-of-2 type is marked as Legal or Custom and return Unsupported if not. What do you think? |
lib/CodeGen/GlobalISel/LegalizerInfo.cpp | ||
---|---|---|
75–76 | Right - I forgot about the doubling/halving behaviour of LegalizerHelper right now. |
lib/CodeGen/GlobalISel/LegalizerInfo.cpp | ||
---|---|---|
75–76 | I plan to push this because it is going to add more vector support and it’s not possible to add a fallback test if we drop the check. I’ll add a comment explaining this is temporary. Thanks, |
I was confused by the summary on this patch - I thought you wanted to make sure vector types like <3 x s32> definitely wouldn't be legalized and thought the existing code could sometimes legalize them. It then started doing the following train-of-thought:
"""
For vector types, getSizeInBits() returns the "number of elements" times "element size in bits".
That result can only be a power of 2 if both "number of elements" and "element size in bits" are both a power of 2.
So, the effect of this change would be to allow more vector data types, like <3 x s32> to be legalized."
So, in summary, by the time this gets committed, I think the commit message must be clearer, and e.g. state "Enable legalization of vector types with non-power-of-2 number of elements".
This patch clearly is missing tests.