Skip to content

Commit dff965f

Browse files
committed
[constant-folding] Teach constant folding how to transform Builtin.cond_fail => cond_fail.
When this was originally implemented, this transform was put into SILCombine. This patch also puts it into constant folding so we can also perform the transform at -Onone. My hunch is that the reason why this isn't happening with the -Onone serialization change is that we were relying only this code being specialized before serialization in the stdlib. But transparent functions are now not optimized until after serialization, so it isn't done. Rather than mess with that, I just added the support here.
1 parent 50d21fd commit dff965f

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)