[llvm] [AArch64][GlobalISel] Treat vector select as legal (PR #197111)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 3 06:21:10 PDT 2026
================
@@ -1068,13 +1067,39 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
getActionDefinitionsBuilder(G_BRINDIRECT).legalFor({p0});
getActionDefinitionsBuilder(G_SELECT)
- .legalFor({{s32, s32}, {s64, s32}, {p0, s32}})
+ .legalFor({{s32, s32},
+ {s64, s32},
+ {p0, s32},
+ {v8s8, v8s8},
+ {v4s16, v4s16},
+ {v2s32, v2s32},
+ {v16s8, v16s8},
+ {v8s16, v8s16},
+ {v4s32, v4s32},
+ {v2s64, v2s64}})
.widenScalarToNextPow2(0)
.clampScalar(0, s32, s64)
- .clampScalar(1, s32, s32)
.scalarizeIf(scalarOrEltWiderThan(0, 64), 0)
- .minScalarEltSameAsIf(all(isVector(0), isVector(1)), 1, 0)
- .lowerIf(isVector(0));
+ .moreElementsToNextPow2(0)
+ .minScalarEltSameAsIf(all(isVector(0), isScalar(1)), 1, 0)
+ .moreElementsIf(all(isVector(0), isScalar(1)),
+ [=](const LegalityQuery &Query) {
+ return std::pair(1, Query.Types[0].changeElementType(
+ Query.Types[1]));
+ })
+ .clampScalar(1, s32, s32)
+ .minScalarEltSameAsIf(isVector(0), 1, 0)
+ .maxScalarEltSameAsIf(isVector(0), 1, 0)
+ .clampNumElements(0, v8s8, v16s8)
+ .clampNumElements(0, v4s16, v8s16)
+ .clampNumElements(0, v2s32, v4s32)
+ .clampMaxNumElements(0, s64, 2)
+ .clampMaxNumElements(0, p0, 2)
+ .bitcastIf(isPointerVector(0), [=](const LegalityQuery &Query) {
+ // Bitcast pointers vector to i64.
+ const LLT DstTy = Query.Types[0];
+ return std::pair(0, DstTy.changeElementType(LLT::integer(64)));
----------------
arsenm wrote:
```suggestion
return {0, DstTy.changeElementType(LLT::integer(64))}
```
https://github.com/llvm/llvm-project/pull/197111
More information about the llvm-commits
mailing list