diff options
| author | Thorsten Schütt <schuett@gmail.com> | 2024-04-27 08:39:35 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-27 08:39:35 +0200 |
| commit | bc349cea7ad83bba9614e82f695d4b608f801102 (patch) | |
| tree | aa41bc6216a1f1e0d621474e70b3720ecc1dd956 /llvm/lib/CodeGen/GlobalISel/CombinerHelperVectorOps.cpp | |
| parent | 9145514fde484916971e6bb147c18f9235a9f2b5 (diff) | |
| download | llvm-bc349cea7ad83bba9614e82f695d4b608f801102.tar.gz llvm-bc349cea7ad83bba9614e82f695d4b608f801102.tar.bz2 llvm-bc349cea7ad83bba9614e82f695d4b608f801102.zip | |
[GlobalIsel] combine insert vector element (#89363)
preliminary steps
poison symbols
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/CombinerHelperVectorOps.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/CombinerHelperVectorOps.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelperVectorOps.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelperVectorOps.cpp index 123bf21f657c..fb33801a3a33 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelperVectorOps.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelperVectorOps.cpp @@ -77,7 +77,7 @@ bool CombinerHelper::matchExtractVectorElement(MachineInstr &MI, // Fold extractVectorElement(Vector, TOOLARGE) -> undef if (IndexC && VectorTy.isFixedVector() && - IndexC->getZExtValue() >= VectorTy.getNumElements() && + IndexC->uge(VectorTy.getNumElements()) && isLegalOrBeforeLegalizer({TargetOpcode::G_IMPLICIT_DEF, {DstTy}})) { // For fixed-length vectors, it's invalid to extract out-of-range elements. MatchInfo = [=](MachineIRBuilder &B) { B.buildUndef(Dst); }; @@ -324,3 +324,26 @@ bool CombinerHelper::matchExtractVectorElementWithBuildVectorTrunc( return true; } + +bool CombinerHelper::matchInsertVectorElementOOB(MachineInstr &MI, + BuildFnTy &MatchInfo) { + GInsertVectorElement *Insert = cast<GInsertVectorElement>(&MI); + + Register Dst = Insert->getReg(0); + LLT DstTy = MRI.getType(Dst); + Register Index = Insert->getIndexReg(); + + if (!DstTy.isFixedVector()) + return false; + + std::optional<ValueAndVReg> MaybeIndex = + getIConstantVRegValWithLookThrough(Index, MRI); + + if (MaybeIndex && MaybeIndex->Value.uge(DstTy.getNumElements()) && + isLegalOrBeforeLegalizer({TargetOpcode::G_IMPLICIT_DEF, {DstTy}})) { + MatchInfo = [=](MachineIRBuilder &B) { B.buildUndef(Dst); }; + return true; + } + + return false; +} |
