Skip to content

Commit 4df7b77

Browse files
authored
Merge pull request #26607 from gottesmm/pr-1c9cabc6c1a3d71a9ec4a485ec4173414d279d96
2 parents 175464a + dff965f commit 4df7b77

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

lib/SILOptimizer/Utils/ConstantFolding.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1784,6 +1784,33 @@ ConstantFolder::processWorkList() {
17841784
WorkList.insert(User);
17851785
}
17861786

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);
1810+
}
1811+
}
1812+
}
1813+
17871814
// Initialize ResultsInError as a None optional.
17881815
//
17891816
// We are essentially using this optional to represent 3 states: true,

test/SILOptimizer/constant_propagation.sil

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -988,3 +988,19 @@ bb0:
988988
%2 = builtin "ptrtoint_Int32"(%1 : $Builtin.RawPointer) : $Builtin.Int32
989989
return %2 : $Builtin.Int32
990990
}
991+
992+
// Make sure that we perform the transformation, but do not eliminate the int1,
993+
// since we do not know what it is.
994+
//
995+
// CHECK-LABEL: sil @cond_fail_test : $@convention(thin) (Builtin.Int1) -> () {
996+
// CHECK-NOT: builtin
997+
// CHECK: cond_fail
998+
// CHECK-NOT: builtin
999+
// CHECK: } // end sil function 'cond_fail_test'
1000+
sil @cond_fail_test : $@convention(thin) (Builtin.Int1) -> () {
1001+
bb0(%0 : $Builtin.Int1):
1002+
%1 = string_literal utf8 "constant"
1003+
%2 = builtin "condfail_message"(%0 : $Builtin.Int1, %1 : $Builtin.RawPointer) : $()
1004+
%9999 = tuple()
1005+
return %9999 : $()
1006+
}

0 commit comments

Comments
 (0)