summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2018-08-14 10:04:14 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2018-08-14 10:04:14 +0000
commit7bae71a209e8c82e1e13afb4fdc9f057186e69b7 (patch)
treef1ad877a60a5dd18976d452dcde59e4726ca9538 /llvm/lib/IR
parent8fd44bb915cc62615240c8b8fde2e5fb3f3e2d82 (diff)
downloadbcm5719-llvm-7bae71a209e8c82e1e13afb4fdc9f057186e69b7.tar.gz
bcm5719-llvm-7bae71a209e8c82e1e13afb4fdc9f057186e69b7.zip
Fix MSVC "compiler limit: blocks nested too deeply" error. NFCI.
MSVC only accepts if-else chains up to 127 blocks long. I've had to merge a number of intrinsic cases together to get back below this limit, resulting in some duplication of string matches; this shouldn't cause any notable increase in runtime (and even then only for old IR, nothing that clang currently emits). llvm-svn: 339666
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/AutoUpgrade.cpp54
1 files changed, 19 insertions, 35 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 17993bbdbf5..8fbf6f424ee 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -1691,41 +1691,25 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
C = ConstantInt::getNullValue(Builder.getInt16Ty());
Rep = Builder.CreateICmpEQ(Rep, C);
Rep = Builder.CreateZExt(Rep, Builder.getInt32Ty());
- } else if (IsX86 && (Name == "sse.add.ss" || Name == "sse2.add.sd")) {
+ } else if (IsX86 && (Name == "sse.add.ss" || Name == "sse2.add.sd" ||
+ Name == "sse.sub.ss" || Name == "sse2.sub.sd" ||
+ Name == "sse.mul.ss" || Name == "sse2.mul.sd" ||
+ Name == "sse.div.ss" || Name == "sse2.div.sd")) {
Type *I32Ty = Type::getInt32Ty(C);
Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
ConstantInt::get(I32Ty, 0));
Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
ConstantInt::get(I32Ty, 0));
- Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
- Builder.CreateFAdd(Elt0, Elt1),
- ConstantInt::get(I32Ty, 0));
- } else if (IsX86 && (Name == "sse.sub.ss" || Name == "sse2.sub.sd")) {
- Type *I32Ty = Type::getInt32Ty(C);
- Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
- ConstantInt::get(I32Ty, 0));
- Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
- ConstantInt::get(I32Ty, 0));
- Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
- Builder.CreateFSub(Elt0, Elt1),
- ConstantInt::get(I32Ty, 0));
- } else if (IsX86 && (Name == "sse.mul.ss" || Name == "sse2.mul.sd")) {
- Type *I32Ty = Type::getInt32Ty(C);
- Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
- ConstantInt::get(I32Ty, 0));
- Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
- ConstantInt::get(I32Ty, 0));
- Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
- Builder.CreateFMul(Elt0, Elt1),
- ConstantInt::get(I32Ty, 0));
- } else if (IsX86 && (Name == "sse.div.ss" || Name == "sse2.div.sd")) {
- Type *I32Ty = Type::getInt32Ty(C);
- Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
- ConstantInt::get(I32Ty, 0));
- Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
- ConstantInt::get(I32Ty, 0));
- Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
- Builder.CreateFDiv(Elt0, Elt1),
+ Value *EltOp;
+ if (Name.contains(".add."))
+ EltOp = Builder.CreateFAdd(Elt0, Elt1);
+ else if (Name.contains(".sub."))
+ EltOp = Builder.CreateFSub(Elt0, Elt1);
+ else if (Name.contains(".mul."))
+ EltOp = Builder.CreateFMul(Elt0, Elt1);
+ else
+ EltOp = Builder.CreateFDiv(Elt0, Elt1);
+ Rep = Builder.CreateInsertElement(CI->getArgOperand(0), EltOp,
ConstantInt::get(I32Ty, 0));
} else if (IsX86 && Name.startswith("avx512.mask.pcmp")) {
// "avx512.mask.pcmpeq." or "avx512.mask.pcmpgt."
@@ -2097,14 +2081,14 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep,
CI->getArgOperand(1));
} else if (IsX86 && (Name.startswith("sse2.paddus") ||
+ Name.startswith("sse2.psubus") ||
Name.startswith("avx2.paddus") ||
- Name.startswith("avx512.mask.paddus"))) {
- Rep = UpgradeX86AddSubSatIntrinsics(Builder, *CI, true /*IsAdd*/);
- } else if (IsX86 && (Name.startswith("sse2.psubus") ||
Name.startswith("avx2.psubus") ||
+ Name.startswith("avx512.mask.paddus") ||
Name.startswith("avx512.mask.psubus"))) {
- Rep = UpgradeX86AddSubSatIntrinsics(Builder, *CI, false /*IsAdd*/);
- }else if (IsX86 && Name.startswith("avx512.mask.palignr.")) {
+ bool IsAdd = Name.contains(".paddus");
+ Rep = UpgradeX86AddSubSatIntrinsics(Builder, *CI, IsAdd);
+ } else if (IsX86 && Name.startswith("avx512.mask.palignr.")) {
Rep = UpgradeX86ALIGNIntrinsics(Builder, CI->getArgOperand(0),
CI->getArgOperand(1),
CI->getArgOperand(2),
OpenPOWER on IntegriCloud