@@ -1746,6 +1746,25 @@ ConstantFolder::processWorkList() {
1746
1746
continue ;
1747
1747
}
1748
1748
1749
+ // See if we have a CondFailMessage that we can canonicalize.
1750
+ if (isApplyOfBuiltin (*I, BuiltinValueKind::CondFailMessage)) {
1751
+ // See if our operand is a string literal inst. In such a case, fold into
1752
+ // cond_fail instruction.
1753
+ if (auto *sli = dyn_cast<StringLiteralInst>(I->getOperand (1 ))) {
1754
+ if (sli->getEncoding () == StringLiteralInst::Encoding::UTF8) {
1755
+ SILBuilderWithScope builder (I);
1756
+ auto *cfi = builder.createCondFail (I->getLoc (), I->getOperand (0 ),
1757
+ sli->getValue ());
1758
+ WorkList.insert (cfi);
1759
+ recursivelyDeleteTriviallyDeadInstructions (
1760
+ I, /* force*/ true ,
1761
+ [&](SILInstruction *DeadI) { WorkList.remove (DeadI); });
1762
+ InvalidateInstructions = true ;
1763
+ }
1764
+ }
1765
+ continue ;
1766
+ }
1767
+
1749
1768
// Go through all users of the constant and try to fold them.
1750
1769
FoldedUsers.clear ();
1751
1770
for (auto Result : I->getResults ()) {
@@ -1784,29 +1803,12 @@ ConstantFolder::processWorkList() {
1784
1803
WorkList.insert (User);
1785
1804
}
1786
1805
1787
- // See if we have a CondFailMessage. If we do, see if we can transform
1788
- // it into a UTF8.
1789
- if (auto *bi = dyn_cast<BuiltinInst>(User)) {
1790
- if (auto kind = bi->getBuiltinKind ()) {
1791
- if (*kind == BuiltinValueKind::CondFailMessage) {
1792
- // See if our original instruction was a string literal inst.
1793
- if (auto *sli = dyn_cast<StringLiteralInst>(I)) {
1794
- if (sli->getEncoding () == StringLiteralInst::Encoding::UTF8) {
1795
- SILBuilderWithScope builder (bi);
1796
- auto *cfi = builder.createCondFail (
1797
- bi->getLoc (), bi->getOperand (0 ), sli->getValue ());
1798
- WorkList.insert (cfi);
1799
- recursivelyDeleteTriviallyDeadInstructions (
1800
- bi, /* force*/ true ,
1801
- [&](SILInstruction *DeadI) { WorkList.remove (DeadI); });
1802
- InvalidateInstructions = true ;
1803
- continue ;
1804
- }
1805
- }
1806
-
1807
- // If we weren't able to simplify into a cond_fail, add it to the
1808
- // folded user set to see if the condfail msg is dead.
1809
- FoldedUsers.insert (bi);
1806
+ // See if we have a CondFailMessage of a string_Literal. If we do, add
1807
+ // it to the worklist, so we can clean it up.
1808
+ if (isApplyOfBuiltin (*User, BuiltinValueKind::CondFailMessage)) {
1809
+ if (auto *sli = dyn_cast<StringLiteralInst>(I)) {
1810
+ if (sli->getEncoding () == StringLiteralInst::Encoding::UTF8) {
1811
+ WorkList.insert (User);
1810
1812
}
1811
1813
}
1812
1814
}
0 commit comments