summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/IR/AutoUpgrade.cpp18
-rw-r--r--llvm/lib/Target/X86/X86IntrinsicsInfo.h8
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp46
3 files changed, 27 insertions, 45 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index ae88a285a0e..1864ad29b30 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -282,14 +282,8 @@ static bool ShouldUpgradeX86Intrinsic(Function *F, StringRef Name) {
Name.startswith("avx512.mask.pror.") || // Added in 7.0
Name.startswith("avx512.mask.prolv.") || // Added in 7.0
Name.startswith("avx512.mask.prol.") || // Added in 7.0
- Name == "avx512.mask.padds.b.128" || // Added in 8.0
- Name == "avx512.mask.padds.b.256" || // Added in 8.0
- Name == "avx512.mask.padds.w.128" || // Added in 8.0
- Name == "avx512.mask.padds.w.256" || // Added in 8.0
- Name == "avx512.mask.psubs.b.128" || // Added in 8.0
- Name == "avx512.mask.psubs.b.256" || // Added in 8.0
- Name == "avx512.mask.psubs.w.128" || // Added in 8.0
- Name == "avx512.mask.psubs.w.256" || // Added in 8.0
+ Name.startswith("avx512.mask.padds.") || // Added in 8.0
+ Name.startswith("avx512.mask.psubs.") || // Added in 8.0
Name == "sse.cvtsi2ss" || // Added in 7.0
Name == "sse.cvtsi642ss" || // Added in 7.0
Name == "sse2.cvtsi2sd" || // Added in 7.0
@@ -1417,10 +1411,14 @@ static bool upgradeAVX512MaskToSelect(StringRef Name, IRBuilder<> &Builder,
IID = Intrinsic::x86_sse2_padds_b;
else if (VecWidth == 256 && EltWidth == 8)
IID = Intrinsic::x86_avx2_padds_b;
+ else if (VecWidth == 512 && EltWidth == 8)
+ IID = Intrinsic::x86_avx512_padds_b_512;
else if (VecWidth == 128 && EltWidth == 16)
IID = Intrinsic::x86_sse2_padds_w;
else if (VecWidth == 256 && EltWidth == 16)
IID = Intrinsic::x86_avx2_padds_w;
+ else if (VecWidth == 512 && EltWidth == 16)
+ IID = Intrinsic::x86_avx512_padds_w_512;
else
llvm_unreachable("Unexpected intrinsic");
} else if (Name.startswith("psubs.")) {
@@ -1428,10 +1426,14 @@ static bool upgradeAVX512MaskToSelect(StringRef Name, IRBuilder<> &Builder,
IID = Intrinsic::x86_sse2_psubs_b;
else if (VecWidth == 256 && EltWidth == 8)
IID = Intrinsic::x86_avx2_psubs_b;
+ else if (VecWidth == 512 && EltWidth == 8)
+ IID = Intrinsic::x86_avx512_psubs_b_512;
else if (VecWidth == 128 && EltWidth == 16)
IID = Intrinsic::x86_sse2_psubs_w;
else if (VecWidth == 256 && EltWidth == 16)
IID = Intrinsic::x86_avx2_psubs_w;
+ else if (VecWidth == 512 && EltWidth == 16)
+ IID = Intrinsic::x86_avx512_psubs_w_512;
else
llvm_unreachable("Unexpected intrinsic");
} else
diff --git a/llvm/lib/Target/X86/X86IntrinsicsInfo.h b/llvm/lib/Target/X86/X86IntrinsicsInfo.h
index 95f17f76298..a9ee3182aaa 100644
--- a/llvm/lib/Target/X86/X86IntrinsicsInfo.h
+++ b/llvm/lib/Target/X86/X86IntrinsicsInfo.h
@@ -673,8 +673,6 @@ static const IntrinsicData IntrinsicsWithoutChain[] = {
X86ISD::FMULS_RND, 0),
X86_INTRINSIC_DATA(avx512_mask_mul_ss_round, INTR_TYPE_SCALAR_MASK_RM,
X86ISD::FMULS_RND, 0),
- X86_INTRINSIC_DATA(avx512_mask_padds_b_512, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0),
- X86_INTRINSIC_DATA(avx512_mask_padds_w_512, INTR_TYPE_2OP_MASK, X86ISD::ADDS, 0),
X86_INTRINSIC_DATA(avx512_mask_pmov_db_128, INTR_TYPE_1OP_MASK,
X86ISD::VTRUNC, 0),
X86_INTRINSIC_DATA(avx512_mask_pmov_db_256, INTR_TYPE_1OP_MASK,
@@ -789,8 +787,6 @@ static const IntrinsicData IntrinsicsWithoutChain[] = {
X86ISD::MULTISHIFT, 0),
X86_INTRINSIC_DATA(avx512_mask_pmultishift_qb_512, INTR_TYPE_2OP_MASK,
X86ISD::MULTISHIFT, 0),
- X86_INTRINSIC_DATA(avx512_mask_psubs_b_512, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0),
- X86_INTRINSIC_DATA(avx512_mask_psubs_w_512, INTR_TYPE_2OP_MASK, X86ISD::SUBS, 0),
X86_INTRINSIC_DATA(avx512_mask_range_pd_128, INTR_TYPE_3OP_MASK, X86ISD::VRANGE, 0),
X86_INTRINSIC_DATA(avx512_mask_range_pd_256, INTR_TYPE_3OP_MASK, X86ISD::VRANGE, 0),
X86_INTRINSIC_DATA(avx512_mask_range_pd_512, INTR_TYPE_3OP_MASK, X86ISD::VRANGE, X86ISD::VRANGE_RND),
@@ -926,6 +922,8 @@ static const IntrinsicData IntrinsicsWithoutChain[] = {
X86_INTRINSIC_DATA(avx512_packsswb_512, INTR_TYPE_2OP, X86ISD::PACKSS, 0),
X86_INTRINSIC_DATA(avx512_packusdw_512, INTR_TYPE_2OP, X86ISD::PACKUS, 0),
X86_INTRINSIC_DATA(avx512_packuswb_512, INTR_TYPE_2OP, X86ISD::PACKUS, 0),
+ X86_INTRINSIC_DATA(avx512_padds_b_512, INTR_TYPE_2OP, X86ISD::ADDS, 0),
+ X86_INTRINSIC_DATA(avx512_padds_w_512, INTR_TYPE_2OP, X86ISD::ADDS, 0),
X86_INTRINSIC_DATA(avx512_permvar_df_256, VPERM_2OP, X86ISD::VPERMV, 0),
X86_INTRINSIC_DATA(avx512_permvar_df_512, VPERM_2OP, X86ISD::VPERMV, 0),
X86_INTRINSIC_DATA(avx512_permvar_di_256, VPERM_2OP, X86ISD::VPERMV, 0),
@@ -1008,6 +1006,8 @@ static const IntrinsicData IntrinsicsWithoutChain[] = {
X86_INTRINSIC_DATA(avx512_psrlv_w_128, INTR_TYPE_2OP, ISD::SRL, 0),
X86_INTRINSIC_DATA(avx512_psrlv_w_256, INTR_TYPE_2OP, ISD::SRL, 0),
X86_INTRINSIC_DATA(avx512_psrlv_w_512, INTR_TYPE_2OP, ISD::SRL, 0),
+ X86_INTRINSIC_DATA(avx512_psubs_b_512, INTR_TYPE_2OP, X86ISD::SUBS, 0),
+ X86_INTRINSIC_DATA(avx512_psubs_w_512, INTR_TYPE_2OP, X86ISD::SUBS, 0),
X86_INTRINSIC_DATA(avx512_pternlog_d_128, INTR_TYPE_4OP, X86ISD::VPTERNLOG, 0),
X86_INTRINSIC_DATA(avx512_pternlog_d_256, INTR_TYPE_4OP, X86ISD::VPTERNLOG, 0),
X86_INTRINSIC_DATA(avx512_pternlog_d_512, INTR_TYPE_4OP, X86ISD::VPTERNLOG, 0),
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 7773c3d234e..1d0cd11f941 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -245,8 +245,7 @@ Instruction *InstCombiner::SimplifyAnyMemSet(AnyMemSetInst *MI) {
static Value *simplifyX86AddsSubs(const IntrinsicInst &II,
InstCombiner::BuilderTy &Builder) {
- bool IsAddition = false;
- bool IsMasked = false;
+ bool IsAddition;
switch (II.getIntrinsicID()) {
default: llvm_unreachable("Unexpected intrinsic!");
@@ -254,21 +253,17 @@ static Value *simplifyX86AddsSubs(const IntrinsicInst &II,
case Intrinsic::x86_sse2_padds_w:
case Intrinsic::x86_avx2_padds_b:
case Intrinsic::x86_avx2_padds_w:
- IsAddition = true; IsMasked = false;
+ case Intrinsic::x86_avx512_padds_b_512:
+ case Intrinsic::x86_avx512_padds_w_512:
+ IsAddition = true;
break;
case Intrinsic::x86_sse2_psubs_b:
case Intrinsic::x86_sse2_psubs_w:
case Intrinsic::x86_avx2_psubs_b:
case Intrinsic::x86_avx2_psubs_w:
- IsAddition = false; IsMasked = false;
- break;
- case Intrinsic::x86_avx512_mask_padds_b_512:
- case Intrinsic::x86_avx512_mask_padds_w_512:
- IsAddition = true; IsMasked = true;
- break;
- case Intrinsic::x86_avx512_mask_psubs_b_512:
- case Intrinsic::x86_avx512_mask_psubs_w_512:
- IsAddition = false; IsMasked = true;
+ case Intrinsic::x86_avx512_psubs_b_512:
+ case Intrinsic::x86_avx512_psubs_w_512:
+ IsAddition = false;
break;
}
@@ -278,7 +273,7 @@ static Value *simplifyX86AddsSubs(const IntrinsicInst &II,
auto SVT = VT->getElementType();
unsigned NumElems = VT->getNumElements();
- if (!Arg0 || !Arg1 || (IsMasked && !isa<Constant>(II.getOperand(2))))
+ if (!Arg0 || !Arg1)
return nullptr;
SmallVector<Constant *, 64> Result;
@@ -306,21 +301,7 @@ static Value *simplifyX86AddsSubs(const IntrinsicInst &II,
Result.push_back(Constant::getIntegerValue(SVT, ResultElem));
}
- Value *ResultVec = ConstantVector::get(Result);
-
- if (II.getNumArgOperands() == 4) { // For masked intrinsics.
- Value *Src = II.getOperand(2);
- auto Mask = II.getOperand(3);
- if (auto *C = dyn_cast<Constant>(Mask))
- if (C->isAllOnesValue())
- return ResultVec;
- auto *MaskTy = VectorType::get(
- Builder.getInt1Ty(), cast<IntegerType>(Mask->getType())->getBitWidth());
- Mask = Builder.CreateBitCast(Mask, MaskTy);
- ResultVec = Builder.CreateSelect(Mask, ResultVec, Src);
- }
-
- return ResultVec;
+ return ConstantVector::get(Result);
}
static Value *simplifyX86immShift(const IntrinsicInst &II,
@@ -2614,14 +2595,13 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
case Intrinsic::x86_avx2_padds_w:
case Intrinsic::x86_avx2_psubs_b:
case Intrinsic::x86_avx2_psubs_w:
- case Intrinsic::x86_avx512_mask_padds_b_512:
- case Intrinsic::x86_avx512_mask_padds_w_512:
- case Intrinsic::x86_avx512_mask_psubs_b_512:
- case Intrinsic::x86_avx512_mask_psubs_w_512:
+ case Intrinsic::x86_avx512_padds_b_512:
+ case Intrinsic::x86_avx512_padds_w_512:
+ case Intrinsic::x86_avx512_psubs_b_512:
+ case Intrinsic::x86_avx512_psubs_w_512:
if (Value *V = simplifyX86AddsSubs(*II, Builder))
return replaceInstUsesWith(*II, V);
break;
-
// Constant fold ashr( <A x Bi>, Ci ).
// Constant fold lshr( <A x Bi>, Ci ).
OpenPOWER on IntegriCloud