Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit 922ac36

Browse files
committed
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). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339666 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 17454e6 commit 922ac36

File tree

1 file changed

+19
-35
lines changed

1 file changed

+19
-35
lines changed

lib/IR/AutoUpgrade.cpp

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,41 +1691,25 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
16911691
C = ConstantInt::getNullValue(Builder.getInt16Ty());
16921692
Rep = Builder.CreateICmpEQ(Rep, C);
16931693
Rep = Builder.CreateZExt(Rep, Builder.getInt32Ty());
1694-
} else if (IsX86 && (Name == "sse.add.ss" || Name == "sse2.add.sd")) {
1694+
} else if (IsX86 && (Name == "sse.add.ss" || Name == "sse2.add.sd" ||
1695+
Name == "sse.sub.ss" || Name == "sse2.sub.sd" ||
1696+
Name == "sse.mul.ss" || Name == "sse2.mul.sd" ||
1697+
Name == "sse.div.ss" || Name == "sse2.div.sd")) {
16951698
Type *I32Ty = Type::getInt32Ty(C);
16961699
Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
16971700
ConstantInt::get(I32Ty, 0));
16981701
Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
16991702
ConstantInt::get(I32Ty, 0));
1700-
Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
1701-
Builder.CreateFAdd(Elt0, Elt1),
1702-
ConstantInt::get(I32Ty, 0));
1703-
} else if (IsX86 && (Name == "sse.sub.ss" || Name == "sse2.sub.sd")) {
1704-
Type *I32Ty = Type::getInt32Ty(C);
1705-
Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
1706-
ConstantInt::get(I32Ty, 0));
1707-
Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
1708-
ConstantInt::get(I32Ty, 0));
1709-
Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
1710-
Builder.CreateFSub(Elt0, Elt1),
1711-
ConstantInt::get(I32Ty, 0));
1712-
} else if (IsX86 && (Name == "sse.mul.ss" || Name == "sse2.mul.sd")) {
1713-
Type *I32Ty = Type::getInt32Ty(C);
1714-
Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
1715-
ConstantInt::get(I32Ty, 0));
1716-
Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
1717-
ConstantInt::get(I32Ty, 0));
1718-
Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
1719-
Builder.CreateFMul(Elt0, Elt1),
1720-
ConstantInt::get(I32Ty, 0));
1721-
} else if (IsX86 && (Name == "sse.div.ss" || Name == "sse2.div.sd")) {
1722-
Type *I32Ty = Type::getInt32Ty(C);
1723-
Value *Elt0 = Builder.CreateExtractElement(CI->getArgOperand(0),
1724-
ConstantInt::get(I32Ty, 0));
1725-
Value *Elt1 = Builder.CreateExtractElement(CI->getArgOperand(1),
1726-
ConstantInt::get(I32Ty, 0));
1727-
Rep = Builder.CreateInsertElement(CI->getArgOperand(0),
1728-
Builder.CreateFDiv(Elt0, Elt1),
1703+
Value *EltOp;
1704+
if (Name.contains(".add."))
1705+
EltOp = Builder.CreateFAdd(Elt0, Elt1);
1706+
else if (Name.contains(".sub."))
1707+
EltOp = Builder.CreateFSub(Elt0, Elt1);
1708+
else if (Name.contains(".mul."))
1709+
EltOp = Builder.CreateFMul(Elt0, Elt1);
1710+
else
1711+
EltOp = Builder.CreateFDiv(Elt0, Elt1);
1712+
Rep = Builder.CreateInsertElement(CI->getArgOperand(0), EltOp,
17291713
ConstantInt::get(I32Ty, 0));
17301714
} else if (IsX86 && Name.startswith("avx512.mask.pcmp")) {
17311715
// "avx512.mask.pcmpeq." or "avx512.mask.pcmpgt."
@@ -2097,14 +2081,14 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
20972081
Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep,
20982082
CI->getArgOperand(1));
20992083
} else if (IsX86 && (Name.startswith("sse2.paddus") ||
2084+
Name.startswith("sse2.psubus") ||
21002085
Name.startswith("avx2.paddus") ||
2101-
Name.startswith("avx512.mask.paddus"))) {
2102-
Rep = UpgradeX86AddSubSatIntrinsics(Builder, *CI, true /*IsAdd*/);
2103-
} else if (IsX86 && (Name.startswith("sse2.psubus") ||
21042086
Name.startswith("avx2.psubus") ||
2087+
Name.startswith("avx512.mask.paddus") ||
21052088
Name.startswith("avx512.mask.psubus"))) {
2106-
Rep = UpgradeX86AddSubSatIntrinsics(Builder, *CI, false /*IsAdd*/);
2107-
}else if (IsX86 && Name.startswith("avx512.mask.palignr.")) {
2089+
bool IsAdd = Name.contains(".paddus");
2090+
Rep = UpgradeX86AddSubSatIntrinsics(Builder, *CI, IsAdd);
2091+
} else if (IsX86 && Name.startswith("avx512.mask.palignr.")) {
21082092
Rep = UpgradeX86ALIGNIntrinsics(Builder, CI->getArgOperand(0),
21092093
CI->getArgOperand(1),
21102094
CI->getArgOperand(2),

0 commit comments

Comments
 (0)