From 26ebe936f3ba63a2365f660509026e11fa0d695a Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Mon, 1 Jun 2020 14:06:46 -0400 Subject: [PATCH] [InstCombine] fix use of base VectorType; NFC SimplifyDemandedVectorElts() bails out on ScalableVectorType anyway, but we can exit faster with the external check. Move this to a helper function because there are likely other vector folds that we can try here. --- .../Transforms/InstCombine/InstCombineInternal.h | 1 + .../Transforms/InstCombine/InstCombineSelect.cpp | 29 ++++++++++++++-------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h index a581966..341e803 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineInternal.h +++ b/llvm/lib/Transforms/InstCombine/InstCombineInternal.h @@ -879,6 +879,7 @@ private: /// Canonicalize the position of binops relative to shufflevector. Instruction *foldVectorBinop(BinaryOperator &Inst); + Instruction *foldVectorSelect(SelectInst &Sel); /// Given a binary operator, cast instruction, or select which has a PHI node /// as operand #0, see if we can fold the instruction into the PHI (which is diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp index 47297e0..d473925 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -2389,6 +2389,23 @@ static Instruction *foldSelectToCopysign(SelectInst &Sel, return CopySign; } +Instruction *InstCombiner::foldVectorSelect(SelectInst &Sel) { + auto *VecTy = dyn_cast(Sel.getType()); + if (!VecTy) + return nullptr; + + unsigned NumElts = VecTy->getNumElements(); + APInt UndefElts(NumElts, 0); + APInt AllOnesEltMask(APInt::getAllOnesValue(NumElts)); + if (Value *V = SimplifyDemandedVectorElts(&Sel, AllOnesEltMask, UndefElts)) { + if (V != &Sel) + return replaceInstUsesWith(Sel, V); + return &Sel; + } + + return nullptr; +} + Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { Value *CondVal = SI.getCondition(); Value *TrueVal = SI.getTrueValue(); @@ -2817,16 +2834,8 @@ Instruction *InstCombiner::visitSelectInst(SelectInst &SI) { return &SI; } - if (VectorType *VecTy = dyn_cast(SelType)) { - unsigned VWidth = VecTy->getNumElements(); - APInt UndefElts(VWidth, 0); - APInt AllOnesEltMask(APInt::getAllOnesValue(VWidth)); - if (Value *V = SimplifyDemandedVectorElts(&SI, AllOnesEltMask, UndefElts)) { - if (V != &SI) - return replaceInstUsesWith(SI, V); - return &SI; - } - } + if (Instruction *I = foldVectorSelect(SI)) + return I; // If we can compute the condition, there's no need for a select. // Like the above fold, we are attempting to reduce compile-time cost by -- 2.7.4