summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2016-10-29 11:29:39 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2016-10-29 11:29:39 +0000
commit75a697a17ea3084fadb83737227f36c142a3c7bb (patch)
tree839260a25f3b9a9eccd047e896534907b25c905a /llvm/include
parent25eb42023355f0f575f496391715a69a441a8346 (diff)
downloadbcm5719-llvm-75a697a17ea3084fadb83737227f36c142a3c7bb.tar.gz
bcm5719-llvm-75a697a17ea3084fadb83737227f36c142a3c7bb.zip
[DAGCombiner] (REAPPLIED) Add vector demanded elements support to computeKnownBits
Currently computeKnownBits returns the common known zero/one bits for all elements of vector data, when we may only be interested in one/some of the elements. This patch adds a DemandedElts argument that allows us to specify the elements we actually care about. The original computeKnownBits implementation calls with a DemandedElts demanding all elements to match current behaviour. Scalar types set this to 1. The approach was found to be easier than trying to add a per-element known bits solution, for a similar usefulness given the combines where computeKnownBits is typically used. I've only added support for a few opcodes so far (the ones that have proven straightforward to test), all others will default to demanding all elements but can be updated in due course. DemandedElts support could similarly be added to computeKnownBitsForTargetNode in a future commit. This looked like this had caused compile time regressions on some buildbots (and was reverted in rL285381), but appears to have just been a harmless bystander! Differential Revision: https://reviews.llvm.org/D25691 llvm-svn: 285494
Diffstat (limited to 'llvm/include')
-rw-r--r--llvm/include/llvm/CodeGen/SelectionDAG.h16
1 files changed, 13 insertions, 3 deletions
diff --git a/llvm/include/llvm/CodeGen/SelectionDAG.h b/llvm/include/llvm/CodeGen/SelectionDAG.h
index 6cc1f5095fa..5b535542b27 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAG.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAG.h
@@ -1256,12 +1256,22 @@ public:
const;
/// Determine which bits of Op are known to be either zero or one and return
- /// them in the KnownZero/KnownOne bitsets. Targets can implement the
- /// computeKnownBitsForTargetNode method in the TargetLowering class to allow
- /// target nodes to be understood.
+ /// them in the KnownZero/KnownOne bitsets. For vectors, the known bits are
+ /// those that are shared by every vector element.
+ /// Targets can implement the computeKnownBitsForTargetNode method in the
+ /// TargetLowering class to allow target nodes to be understood.
void computeKnownBits(SDValue Op, APInt &KnownZero, APInt &KnownOne,
unsigned Depth = 0) const;
+ /// Determine which bits of Op are known to be either zero or one and return
+ /// them in the KnownZero/KnownOne bitsets. The DemandedElts argument allows
+ /// us to only collect the known bits that are shared by the requested vector
+ /// elements.
+ /// Targets can implement the computeKnownBitsForTargetNode method in the
+ /// TargetLowering class to allow target nodes to be understood.
+ void computeKnownBits(SDValue Op, APInt &KnownZero, APInt &KnownOne,
+ const APInt &DemandedElts, unsigned Depth = 0) const;
+
/// Test if the given value is known to have exactly one bit set. This differs
/// from computeKnownBits in that it doesn't necessarily determine which bit
/// is set.
OpenPOWER on IntegriCloud