aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorDavid Green <david.green@arm.com>2025-05-17 12:20:16 +0100
committerGitHub <noreply@github.com>2025-05-17 12:20:16 +0100
commit722385e87bb8e6e0fe79975d679285815629cc7f (patch)
tree2d183c5934240576f923b729fd67f53c2d10a1ab /llvm/lib/CodeGen
parentc5ec66880bd3bcab3a93cd1ccf3d6947501b3a9e (diff)
downloadllvm-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.cpp28
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));