diff options
author | David Green <david.green@arm.com> | 2025-05-17 12:20:16 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-17 12:20:16 +0100 |
commit | 722385e87bb8e6e0fe79975d679285815629cc7f (patch) | |
tree | 2d183c5934240576f923b729fd67f53c2d10a1ab /llvm/lib/CodeGen | |
parent | c5ec66880bd3bcab3a93cd1ccf3d6947501b3a9e (diff) | |
download | llvm-722385e87bb8e6e0fe79975d679285815629cc7f.zip llvm-722385e87bb8e6e0fe79975d679285815629cc7f.tar.gz llvm-722385e87bb8e6e0fe79975d679285815629cc7f.tar.bz2 |
[GlobalISel] Add G_SHUFFLE_VECTOR computeKnownBits (#139501)
The code is taken from SelectionDAG::computeKnownBits.
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp index 589936b..748ecbd 100644 --- a/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp +++ b/llvm/lib/CodeGen/GlobalISel/GISelValueTracking.cpp @@ -14,6 +14,7 @@ #include "llvm/CodeGen/GlobalISel/GISelValueTracking.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Analysis/ValueTracking.h" +#include "llvm/Analysis/VectorUtils.h" #include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h" #include "llvm/CodeGen/GlobalISel/Utils.h" #include "llvm/CodeGen/MachineFrameInfo.h" @@ -629,6 +630,33 @@ void GISelValueTracking::computeKnownBitsImpl(Register R, KnownBits &Known, Known.Zero.setBitsFrom(LowBits); break; } + case TargetOpcode::G_SHUFFLE_VECTOR: { + APInt DemandedLHS, DemandedRHS; + // Collect the known bits that are shared by every vector element referenced + // by the shuffle. + unsigned NumElts = MRI.getType(MI.getOperand(1).getReg()).getNumElements(); + if (!getShuffleDemandedElts(NumElts, MI.getOperand(3).getShuffleMask(), + DemandedElts, DemandedLHS, DemandedRHS)) + break; + + // Known bits are the values that are shared by every demanded element. + Known.Zero.setAllBits(); + Known.One.setAllBits(); + if (!!DemandedLHS) { + computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedLHS, + Depth + 1); + Known = Known.intersectWith(Known2); + } + // If we don't know any bits, early out. + if (Known.isUnknown()) + break; + if (!!DemandedRHS) { + computeKnownBitsImpl(MI.getOperand(2).getReg(), Known2, DemandedRHS, + Depth + 1); + Known = Known.intersectWith(Known2); + } + break; + } } LLVM_DEBUG(dumpResult(MI, Known, Depth)); |