From: Simon Pilgrim Date: Mon, 8 Jul 2019 11:00:39 +0000 (+0000) Subject: [TargetLowering] SimplifyDemandedBits - just call computeKnownBits for BUILD_VECTOR... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a9563933b22bd8b5ffd34c493e1fdaac75470002;p=llvm [TargetLowering] SimplifyDemandedBits - just call computeKnownBits for BUILD_VECTOR cases. Don't do this locally, computeKnownBits does this better (and can handle non-constant cases as well). A next step would be to actually simplify non-constant elements - building on what we already do in SimplifyDemandedVectorElts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365309 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/lib/CodeGen/SelectionDAG/TargetLowering.cpp index 2ee15a0f4a1..bbde8e97df3 100644 --- a/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -639,29 +639,9 @@ bool TargetLowering::SimplifyDemandedBits( break; } case ISD::BUILD_VECTOR: - // Collect the known bits that are shared by every constant vector element. - Known.Zero.setAllBits(); Known.One.setAllBits(); - for (SDValue SrcOp : Op->ops()) { - if (!isa(SrcOp)) { - // We can only handle all constant values - bail out with no known bits. - Known = KnownBits(BitWidth); - return false; - } - Known2.One = cast(SrcOp)->getAPIntValue(); - Known2.Zero = ~Known2.One; - - // BUILD_VECTOR can implicitly truncate sources, we must handle this. - if (Known2.One.getBitWidth() != BitWidth) { - assert(Known2.getBitWidth() > BitWidth && - "Expected BUILD_VECTOR implicit truncation"); - Known2 = Known2.trunc(BitWidth); - } - - // Known bits are the values that are shared by every element. - // TODO: support per-element known bits. - Known.One &= Known2.One; - Known.Zero &= Known2.Zero; - } + // Collect the known bits that are shared by every demanded element. + // TODO: Call SimplifyDemandedBits for non-constant demanded elements. + Known = TLO.DAG.computeKnownBits(Op, DemandedElts, Depth); return false; // Don't fall through, will infinitely loop. case ISD::LOAD: { LoadSDNode *LD = cast(Op);