[PATCH] [X86 DAG] Lower vselects with a constant condition as blend+imm if possible
Andrea Di Biagio
Andrea_DiBiagio at sn.scee.net
Wed May 14 04:39:19 PDT 2014
Hi Filipe,
I have a minor comment/suggestion (see below).
================
Comment at: lib/Target/X86/X86ISelLowering.cpp:7974
@@ -7963,1 +7973,3 @@
+static bool BUILD_VECTORtoBlendMask(SDValue BuildVector, unsigned &MaskValue,
+ SelectionDAG &DAG) {
----------------
This function could be simplified a bit if
`BuildVector` is known to always be a build_vector dag node of all ConstantSDNode (or UNDEF) elements.
I think you can easily add it as a precondition; the caller can verify if a node is a build_vector of constants (or undef values) by simply calling function
`ISD::isBuildVectorOfConstantSDNodes`.
Also, given that argument 'BuildVector' can only be a build_vector dag node, you can change the signature of this function to something like:
static bool BUILD_VECTORtoBlendMask(BuildVectorSDNode *BuildVector, unsigned &MaskValue, SelectionDAG &DAG)
This is to make explicit that BuildVector can only be a `BuildVectorSDNode`.
Under the assumption that BuildVector is a build_vector of constants or UNDEFs, then
lines in the range [7992-8008] can be simplified and replaced by the folling 5 lines.
int Lane1Cond = -1, Lane2Cond = -1;
if (isa<ConstantSDNode>(EltCond))
Lane1Cond = cast<ConstantSDNode>(EltCond)->isNullValue();
if (isa<ConstantSDNode>(SndLaneEltCond))
Lane2Cond = cast<ConstantSDNode>(SndLaneEltCond)->isNullValue();
The function will return false only if `Lane1Cond != Lane2Cond` && `Lane1Cond` and `Lane2Cond` both are >= 0.
http://reviews.llvm.org/D3752
More information about the llvm-commits
mailing list