@@ -1526,55 +1526,71 @@ constantFoldGlobalStringTablePointerBuiltin(BuiltinInst *bi,
15261526}
15271527
15281528// / Initialize the worklist to all of the constant instructions.
1529- void ConstantFolder::initializeWorklist (SILFunction &F) {
1530- for (auto &BB : F) {
1531- for (auto &I : BB) {
1529+ void ConstantFolder::initializeWorklist (SILFunction &f) {
1530+ for (auto &block : f) {
1531+ for (auto ii = block.begin (), ie = block.end (); ii != ie; ) {
1532+ auto *inst = &*ii;
1533+ ++ii;
1534+
1535+ // TODO: Eliminate trivially dead instructions here.
1536+
15321537 // If `I` is a floating-point literal instruction where the literal is
15331538 // inf, it means the input has a literal that overflows even
15341539 // MaxBuiltinFloatType. Diagnose this error, but allow this instruction
15351540 // to be folded, if needed.
1536- if (auto floatLit = dyn_cast<FloatLiteralInst>(&I )) {
1541+ if (auto * floatLit = dyn_cast<FloatLiteralInst>(inst )) {
15371542 APFloat fpVal = floatLit->getValue ();
15381543 if (EnableDiagnostics && fpVal.isInfinity ()) {
15391544 SmallString<10 > litStr;
15401545 tryExtractLiteralText (floatLit, litStr);
1541- diagnose (I. getModule ().getASTContext (), I. getLoc ().getSourceLoc (),
1546+ diagnose (inst-> getModule ().getASTContext (), inst-> getLoc ().getSourceLoc (),
15421547 diag::warning_float_overflows_maxbuiltin, litStr,
15431548 fpVal.isNegative ());
15441549 }
15451550 }
15461551
1547- if (isFoldable (&I ) && I. hasUsesOfAnyResult ()) {
1548- WorkList.insert (&I );
1552+ if (isFoldable (inst ) && inst-> hasUsesOfAnyResult ()) {
1553+ WorkList.insert (inst );
15491554 continue ;
15501555 }
15511556
15521557 // - Should we replace calls to assert_configuration by the assert
15531558 // configuration and fold calls to any cond_unreachable.
15541559 if (AssertConfiguration != SILOptions::DisableReplacement &&
1555- (isApplyOfBuiltin (I, BuiltinValueKind::AssertConf) ||
1556- isApplyOfBuiltin (I, BuiltinValueKind::CondUnreachable))) {
1557- WorkList.insert (&I);
1560+ (isApplyOfBuiltin (*inst, BuiltinValueKind::AssertConf) ||
1561+ isApplyOfBuiltin (*inst, BuiltinValueKind::CondUnreachable))) {
1562+ WorkList.insert (inst);
1563+ continue ;
1564+ }
1565+
1566+ if (isApplyOfBuiltin (*inst, BuiltinValueKind::GlobalStringTablePointer)) {
1567+ WorkList.insert (inst);
15581568 continue ;
15591569 }
15601570
1561- if (isApplyOfBuiltin (I, BuiltinValueKind::GlobalStringTablePointer)) {
1562- WorkList.insert (&I);
1571+ if (isa<CheckedCastBranchInst>(inst) ||
1572+ isa<CheckedCastAddrBranchInst>(inst) ||
1573+ isa<UnconditionalCheckedCastInst>(inst) ||
1574+ isa<UnconditionalCheckedCastAddrInst>(inst)) {
1575+ WorkList.insert (inst);
15631576 continue ;
15641577 }
15651578
1566- if (isa<CheckedCastBranchInst>(&I) ||
1567- isa<CheckedCastAddrBranchInst>(&I) ||
1568- isa<UnconditionalCheckedCastInst>(&I) ||
1569- isa<UnconditionalCheckedCastAddrInst>(&I)) {
1570- WorkList.insert (&I);
1579+ if (isApplyOfStringConcat (*inst)) {
1580+ WorkList.insert (inst);
15711581 continue ;
15721582 }
15731583
1574- if (!isApplyOfStringConcat (I)) {
1584+ // If we have nominal type literals like struct, tuple, enum visit them
1585+ // like we do in the worklist to see if we can fold any projection
1586+ // manipulation operations.
1587+ if (isa<StructInst>(inst) || isa<TupleInst>(inst)) {
1588+ // TODO: Enum.
1589+ WorkList.insert (inst);
15751590 continue ;
15761591 }
1577- WorkList.insert (&I);
1592+
1593+ // ...
15781594 }
15791595 }
15801596}
0 commit comments