Author: Florian Hahn Date: 2023-11-16T21:17:10Z New Revision: 6f3b88baa2ac9ec892ed3ad7dd64d0d537010bc5
URL: https://github.com/llvm/llvm-project/commit/6f3b88baa2ac9ec892ed3ad7dd64d0d537010bc5 DIFF: https://github.com/llvm/llvm-project/commit/6f3b88baa2ac9ec892ed3ad7dd64d0d537010bc5.diff LOG: [VPlan] Move trunc ([s|z]ext A) simplifications to simplifyRecipe. Split off simplification from D149903 as suggested. This should be effectively NFC until D149903 lands. Added: Modified: llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp Removed: ################################################################################ diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp index c55864de9c17086..0eaaa037ad5782f 100644 --- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp +++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp @@ -816,15 +816,28 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) { break; } case Instruction::Trunc: { - VPRecipeBase *Zext = R.getOperand(0)->getDefiningRecipe(); - if (!Zext || getOpcodeForRecipe(*Zext) != Instruction::ZExt) + VPRecipeBase *Ext = R.getOperand(0)->getDefiningRecipe(); + if (!Ext) break; - VPValue *A = Zext->getOperand(0); + unsigned ExtOpcode = getOpcodeForRecipe(*Ext); + if (ExtOpcode != Instruction::ZExt && ExtOpcode != Instruction::SExt) + break; + VPValue *A = Ext->getOperand(0); VPValue *Trunc = R.getVPSingleValue(); - Type *TruncToTy = TypeInfo.inferScalarType(Trunc); - if (TruncToTy && TruncToTy == TypeInfo.inferScalarType(A)) + Type *TruncTy = TypeInfo.inferScalarType(Trunc); + Type *ATy = TypeInfo.inferScalarType(A); + if (TruncTy == ATy) { Trunc->replaceAllUsesWith(A); - + } else if (ATy->getScalarSizeInBits() < TruncTy->getScalarSizeInBits()) { + auto *VPC = + new VPWidenCastRecipe(Instruction::CastOps(ExtOpcode), A, TruncTy); + VPC->insertBefore(&R); + Trunc->replaceAllUsesWith(VPC); + } else if (ATy->getScalarSizeInBits() > TruncTy->getScalarSizeInBits()) { + auto *VPC = new VPWidenCastRecipe(Instruction::Trunc, A, TruncTy); + VPC->insertBefore(&R); + Trunc->replaceAllUsesWith(VPC); + } #ifndef NDEBUG // Verify that the cached type info is for both A and its users is still // accurate by comparing it to freshly computed types. _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits