Skip to content

Commit 49351c4

Browse files
committed
SILOptimizer: extract the peephole optimization for Builtin.canBeClass into a separate utility.
1 parent 094494e commit 49351c4

File tree

4 files changed

+28
-24
lines changed

4 files changed

+28
-24
lines changed

include/swift/SILOptimizer/Utils/InstOptUtils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,10 @@ void endLifetimeAtLeakingBlocks(SILValue value,
715715
bool tryEliminateOnlyOwnershipUsedForwardingInst(
716716
SingleValueInstruction *forwardingInst, InstModCallbacks &callbacks);
717717

718+
/// Constant-fold the Builtin.canBeClass if the type is known.
719+
IntegerLiteralInst *optimizeBuiltinCanBeObjCClass(BuiltinInst *bi,
720+
SILBuilder &builder);
721+
718722
} // end namespace swift
719723

720724
#endif

lib/SILOptimizer/SILCombiner/SILCombiner.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,6 @@ class SILCombiner :
345345
#include "swift/SILOptimizer/PassManager/Passes.def"
346346

347347
/// Instruction visitor helpers.
348-
SILInstruction *optimizeBuiltinCanBeObjCClass(BuiltinInst *AI);
349348

350349
// Optimize the "isConcrete" builtin.
351350
SILInstruction *optimizeBuiltinIsConcrete(BuiltinInst *I);

lib/SILOptimizer/SILCombiner/SILCombinerBuiltinVisitors.cpp

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,28 +82,6 @@ SILInstruction *SILCombiner::optimizeBuiltinCompareEq(BuiltinInst *BI,
8282
APInt(1, Val));
8383
}
8484

85-
SILInstruction *SILCombiner::optimizeBuiltinCanBeObjCClass(BuiltinInst *BI) {
86-
assert(BI->hasSubstitutions() && "Expected substitutions for canBeClass");
87-
88-
auto const &Subs = BI->getSubstitutions();
89-
assert((Subs.getReplacementTypes().size() == 1) &&
90-
"Expected one substitution in call to canBeClass");
91-
92-
auto Ty = Subs.getReplacementTypes()[0]->getCanonicalType();
93-
switch (Ty->canBeClass()) {
94-
case TypeTraitResult::IsNot:
95-
return Builder.createIntegerLiteral(BI->getLoc(), BI->getType(),
96-
APInt(8, 0));
97-
case TypeTraitResult::Is:
98-
return Builder.createIntegerLiteral(BI->getLoc(), BI->getType(),
99-
APInt(8, 1));
100-
case TypeTraitResult::CanBe:
101-
return nullptr;
102-
}
103-
104-
llvm_unreachable("Unhandled TypeTraitResult in switch.");
105-
}
106-
10785
SILInstruction *SILCombiner::optimizeBuiltinIsConcrete(BuiltinInst *BI) {
10886
if (BI->getOperand(0)->getType().hasArchetype())
10987
return nullptr;
@@ -680,7 +658,7 @@ SILInstruction *SILCombiner::optimizeStringObject(BuiltinInst *BI) {
680658

681659
SILInstruction *SILCombiner::visitBuiltinInst(BuiltinInst *I) {
682660
if (I->getBuiltinInfo().ID == BuiltinValueKind::CanBeObjCClass)
683-
return optimizeBuiltinCanBeObjCClass(I);
661+
return optimizeBuiltinCanBeObjCClass(I, Builder);
684662
if (I->getBuiltinInfo().ID == BuiltinValueKind::IsConcrete)
685663
return optimizeBuiltinIsConcrete(I);
686664
if (I->getBuiltinInfo().ID == BuiltinValueKind::COWBufferForReading)

lib/SILOptimizer/Utils/InstOptUtils.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2249,3 +2249,26 @@ void swift::salvageDebugInfo(SILInstruction *I) {
22492249
}
22502250
}
22512251
}
2252+
2253+
IntegerLiteralInst *swift::optimizeBuiltinCanBeObjCClass(BuiltinInst *bi,
2254+
SILBuilder &builder) {
2255+
assert(bi->getBuiltinInfo().ID == BuiltinValueKind::CanBeObjCClass);
2256+
assert(bi->hasSubstitutions() && "Expected substitutions for canBeClass");
2257+
2258+
auto const &subs = bi->getSubstitutions();
2259+
assert((subs.getReplacementTypes().size() == 1) &&
2260+
"Expected one substitution in call to canBeClass");
2261+
2262+
auto ty = subs.getReplacementTypes()[0]->getCanonicalType();
2263+
switch (ty->canBeClass()) {
2264+
case TypeTraitResult::IsNot:
2265+
return builder.createIntegerLiteral(bi->getLoc(), bi->getType(),
2266+
APInt(8, 0));
2267+
case TypeTraitResult::Is:
2268+
return builder.createIntegerLiteral(bi->getLoc(), bi->getType(),
2269+
APInt(8, 1));
2270+
case TypeTraitResult::CanBe:
2271+
return nullptr;
2272+
}
2273+
llvm_unreachable("Unhandled TypeTraitResult in switch.");
2274+
}

0 commit comments

Comments
 (0)