[DAG] Limit (sext_in_reg (zero_extend_vector_inreg x)) to exact sign extension
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 21 Mar 2021 14:00:59 +0000 (14:00 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Sun, 21 Mar 2021 14:01:37 +0000 (14:01 +0000)
As commented by @craig.topper on rG1ba5c550d418, we can't guarantee that we'll be extending zero bits, just sign bit. So, revert to the old code for zero_extend_vector_inreg cases.

llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index 16833c5..2f3826e 100644 (file)
@@ -11796,10 +11796,11 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
     unsigned N00Bits = N00.getScalarValueSizeInBits();
     unsigned DstElts = N0.getValueType().getVectorMinNumElements();
     unsigned SrcElts = N00.getValueType().getVectorMinNumElements();
+    bool IsZext = N0.getOpcode() == ISD::ZERO_EXTEND_VECTOR_INREG;
     APInt DemandedSrcElts = APInt::getLowBitsSet(SrcElts, DstElts);
     if ((N00Bits == ExtVTBits ||
-         (N00Bits - DAG.ComputeNumSignBits(N00, DemandedSrcElts)) <
-             ExtVTBits) &&
+         (!IsZext && (N00Bits - DAG.ComputeNumSignBits(N00, DemandedSrcElts)) <
+                         ExtVTBits)) &&
         (!LegalOperations ||
          TLI.isOperationLegal(ISD::SIGN_EXTEND_VECTOR_INREG, VT)))
       return DAG.getNode(ISD::SIGN_EXTEND_VECTOR_INREG, SDLoc(N), VT, N00);