-Consistently name the functions as split*
-Add a helper for doing the two extractSubvector calls and determining the size of the split
-Use getSplitDestVTs to get the result type for the split node.
-Move the binary and unary helper to one place in the file near the extractSubvector functions. Left the VSETCC one near LowerVSETCC since that's its only caller.
-Remove the 256/512 wrappers that just had asserts. I don't think they provided a lot of value and now with the routines called split* the call sites are more obvious what they do.
-Make the unary routine support different source and dest types to support D76212.
-Add some weaker asserts into the helpers to make up for losing the very specific asserts from the 256/512 wrappers.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
Thanks for the cleanup!
llvm/lib/Target/X86/X86ISelLowering.cpp | ||
---|---|---|
5814 | Can we trust SelectionDAG::SplitVector instead do you think? I noticed LowerTRUNCATE is using it. |
llvm/lib/Target/X86/X86ISelLowering.cpp | ||
---|---|---|
5814 | I think we might need the build_vector special case in extractSubvector. I tried to remove that special case years ago and got regressions. Though I guess I don’t know if those were from splitting or other callers of extractSubvector. So there were cases where the split build_vector needs to appear in the same lowering phase that calls the extract. I think the case in LowerTRUNCATE is during type legalization. Type legalization of nodes isn’t dependent on surrounding nodes so early extracting of build_vector isn’t important. The next DAG combine should take care of it. |
Can we trust SelectionDAG::SplitVector instead do you think? I noticed LowerTRUNCATE is using it.