mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
SIL: Remove 'ModuleInst'.
Module values could never be used for anything, and we have SILUndef now, so when SILGen sees a ModuleExpr, we can just emit 'undef'. Swift SVN r10548
This commit is contained in:
12
docs/SIL.rst
12
docs/SIL.rst
@@ -1624,18 +1624,6 @@ TODO: ``builtin_zero`` is a temporary hack to support our current AST-level
|
||||
default initialization implementation. Definitive assignment analysis in SIL
|
||||
will supersede this.
|
||||
|
||||
module
|
||||
``````
|
||||
::
|
||||
|
||||
sil-instruction ::= 'module' sil-decl-ref
|
||||
|
||||
%1 = module #M
|
||||
// #M must be a module name
|
||||
// %1 has type $module<M>
|
||||
|
||||
Creates a module value for the module ``M``.
|
||||
|
||||
Dynamic Dispatch
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
@@ -594,10 +594,6 @@ public:
|
||||
return insert(new (F.getModule()) ProtocolMetatypeInst(Loc, Metatype,Base));
|
||||
}
|
||||
|
||||
ModuleInst *createModule(SILLocation Loc, SILType ModuleType) {
|
||||
return insert(new (F.getModule()) ModuleInst(Loc, ModuleType));
|
||||
}
|
||||
|
||||
StrongRetainInst *createStrongRetain(SILLocation Loc, SILValue Operand) {
|
||||
return insert(new (F.getModule()) StrongRetainInst(Loc, Operand));
|
||||
}
|
||||
|
||||
@@ -621,14 +621,6 @@ SILCloner<ImplClass>::visitProtocolMetatypeInst(ProtocolMetatypeInst *Inst) {
|
||||
getOpValue(Inst->getOperand())));
|
||||
}
|
||||
|
||||
template<typename ImplClass>
|
||||
void
|
||||
SILCloner<ImplClass>::visitModuleInst(ModuleInst *Inst) {
|
||||
doPostProcess(Inst,
|
||||
Builder.createModule(getOpLocation(Inst->getLoc()),
|
||||
getOpType(Inst->getType())));
|
||||
}
|
||||
|
||||
template<typename ImplClass>
|
||||
void
|
||||
SILCloner<ImplClass>::visitTupleExtractInst(TupleExtractInst *Inst) {
|
||||
|
||||
@@ -1344,23 +1344,6 @@ public:
|
||||
: UnaryInstructionBase(Loc, Base, Metatype) {}
|
||||
};
|
||||
|
||||
/// ModuleInst - Represents a reference to a module as a value.
|
||||
class ModuleInst : public SILInstruction {
|
||||
public:
|
||||
|
||||
ModuleInst(SILLocation Loc, SILType ModuleType);
|
||||
|
||||
/// getType() is ok since this is known to only have one type.
|
||||
SILType getType(unsigned i = 0) const { return ValueBase::getType(i); }
|
||||
|
||||
ArrayRef<Operand> getAllOperands() const { return {}; }
|
||||
MutableArrayRef<Operand> getAllOperands() { return {}; }
|
||||
|
||||
static bool classof(const ValueBase *V) {
|
||||
return V->getKind() == ValueKind::ModuleInst;
|
||||
}
|
||||
};
|
||||
|
||||
/// Extract a numbered element out of a value of tuple type.
|
||||
class TupleExtractInst
|
||||
: public UnaryInstructionBase<ValueKind::TupleExtractInst>
|
||||
|
||||
@@ -106,7 +106,6 @@ ABSTRACT_VALUE(SILInstruction, ValueBase)
|
||||
INST(FloatLiteralInst, SILInstruction, None)
|
||||
INST(StringLiteralInst, SILInstruction, None)
|
||||
INST(BuiltinZeroInst, SILInstruction, None)
|
||||
INST(ModuleInst, SILInstruction, None)
|
||||
|
||||
// Dynamic Dispatch
|
||||
ABSTRACT_VALUE(MethodInst, SILInstruction)
|
||||
|
||||
@@ -539,7 +539,6 @@ public:
|
||||
void visitStructExtractInst(StructExtractInst *i);
|
||||
void visitStructElementAddrInst(StructElementAddrInst *i);
|
||||
void visitRefElementAddrInst(RefElementAddrInst *i);
|
||||
void visitModuleInst(ModuleInst *i);
|
||||
|
||||
void visitClassMethodInst(ClassMethodInst *i);
|
||||
void visitSuperMethodInst(SuperMethodInst *i);
|
||||
@@ -2044,12 +2043,6 @@ void IRGenSILFunction::visitRefElementAddrInst(swift::RefElementAddrInst *i) {
|
||||
setLoweredAddress(SILValue(i, 0), field);
|
||||
}
|
||||
|
||||
void IRGenSILFunction::visitModuleInst(swift::ModuleInst *i) {
|
||||
// Currently, module values are always empty.
|
||||
Explosion empty(ExplosionKind::Maximal);
|
||||
setLoweredExplosion(SILValue(i, 0), empty);
|
||||
}
|
||||
|
||||
void IRGenSILFunction::visitLoadInst(swift::LoadInst *i) {
|
||||
Explosion lowered(ExplosionKind::Maximal);
|
||||
Address source = getLoweredAddress(i->getOperand());
|
||||
|
||||
@@ -923,7 +923,6 @@ bool SILParser::parseSILOpcode(ValueKind &Opcode, SourceLoc &OpcodeLoc,
|
||||
.Case("mark_uninitialized", ValueKind::MarkUninitializedInst)
|
||||
.Case("mark_function_escape", ValueKind::MarkFunctionEscapeInst)
|
||||
.Case("metatype", ValueKind::MetatypeInst)
|
||||
.Case("module", ValueKind::ModuleInst)
|
||||
.Case("object_pointer_to_ref", ValueKind::ObjectPointerToRefInst)
|
||||
.Case("partial_apply", ValueKind::PartialApplyInst)
|
||||
.Case("pointer_to_address", ValueKind::PointerToAddressInst)
|
||||
@@ -2100,21 +2099,6 @@ bool SILParser::parseSILInstruction(SILBasicBlock *BB) {
|
||||
ArrayRef<ProtocolConformance*>());
|
||||
break;
|
||||
}
|
||||
case ValueKind::ModuleInst: {
|
||||
Identifier ModuleName;
|
||||
SourceLoc ModuleLoc;
|
||||
// Parse reference to a module.
|
||||
if (P.parseToken(tok::sil_pound, diag::expected_sil_constant) ||
|
||||
parseSILIdentifier(ModuleName, ModuleLoc, diag::expected_sil_constant))
|
||||
return true;
|
||||
llvm::PointerUnion<ValueDecl*, Module *> Res = lookupTopDecl(P, ModuleName);
|
||||
assert(Res.is<Module*>() && "Expect a module name in ModuleInst");
|
||||
auto Mod = Res.get<Module*>();
|
||||
ResultVal = B.createModule(InstLoc,
|
||||
SILType::getPrimitiveObjectType(
|
||||
ModuleType::get(Mod)->getCanonicalType()));
|
||||
break;
|
||||
}
|
||||
case ValueKind::DynamicMethodBranchInst: {
|
||||
SILDeclRef Member;
|
||||
Identifier BBName, BBName2;
|
||||
|
||||
@@ -550,9 +550,6 @@ TupleInst::TupleInst(SILLocation Loc, SILType Ty, ArrayRef<SILValue> Elems)
|
||||
MetatypeInst::MetatypeInst(SILLocation Loc, SILType Metatype)
|
||||
: SILInstruction(ValueKind::MetatypeInst, Loc, Metatype) {}
|
||||
|
||||
ModuleInst::ModuleInst(SILLocation Loc, SILType ModuleType)
|
||||
: SILInstruction(ValueKind::ModuleInst, Loc, ModuleType) {}
|
||||
|
||||
ProjectExistentialInst::ProjectExistentialInst(SILLocation Loc,
|
||||
SILValue Operand,
|
||||
SILType SelfTy)
|
||||
|
||||
@@ -893,9 +893,6 @@ public:
|
||||
void visitMetatypeInst(MetatypeInst *MI) {
|
||||
OS << "metatype " << MI->getType();
|
||||
}
|
||||
void visitModuleInst(ModuleInst *MI) {
|
||||
OS << "module #" << MI->getType().castTo<ModuleType>()->getModule()->Name;
|
||||
}
|
||||
|
||||
void visitStrongRetainInst(StrongRetainInst *RI) {
|
||||
OS << "strong_retain " << getIDAndType(RI->getOperand());
|
||||
|
||||
@@ -586,10 +586,6 @@ public:
|
||||
CanType(MI->getType().castTo<MetaTypeType>()->getInstanceType()),
|
||||
"protocol_metatype result must be metatype of operand type");
|
||||
}
|
||||
void checkModuleInst(ModuleInst *MI) {
|
||||
require(MI->getType(0).is<ModuleType>(),
|
||||
"module instruction must be of module type");
|
||||
}
|
||||
|
||||
void checkStrongRetainInst(StrongRetainInst *RI) {
|
||||
requireReferenceValue(RI->getOperand(), "Operand of strong_retain");
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "swift/Basic/SourceManager.h"
|
||||
#include "swift/Basic/type_traits.h"
|
||||
#include "swift/SIL/SILArgument.h"
|
||||
#include "swift/SIL/SILUndef.h"
|
||||
#include "swift/SIL/TypeLowering.h"
|
||||
#include "Initialization.h"
|
||||
#include "LValue.h"
|
||||
@@ -1167,8 +1168,9 @@ RValue RValueEmitter::visitDotSyntaxBaseIgnoredExpr(
|
||||
}
|
||||
|
||||
RValue RValueEmitter::visitModuleExpr(ModuleExpr *E, SGFContext C) {
|
||||
SILValue module =
|
||||
SGF.B.createModule(E, SGF.getLoweredLoadableType(E->getType()));
|
||||
// Produce an undef value. The module value should never actually be used.
|
||||
SILValue module = SILUndef::get(SGF.getLoweredLoadableType(E->getType()),
|
||||
SGF.SGM.M);
|
||||
return RValue(SGF, ManagedValue(module, ManagedValue::Unmanaged), E);
|
||||
}
|
||||
|
||||
|
||||
@@ -748,13 +748,6 @@ bool SILDeserializer::readSILInstruction(SILFunction *Fn, SILBasicBlock *BB,
|
||||
ResultVal = Builder.createMarkFunctionEscape(Loc, OpList);
|
||||
break;
|
||||
}
|
||||
case ValueKind::ModuleInst: {
|
||||
// Has IdentifierID for the module reference. Use SILOneTypeLayout.
|
||||
auto Mod = MF->getModule(MF->getIdentifier(TyID));
|
||||
ResultVal = Builder.createModule(Loc,
|
||||
getSILType(ModuleType::get(Mod), SILValueCategory::Object));
|
||||
break;
|
||||
}
|
||||
// Checked Conversion instructions.
|
||||
case ValueKind::UnconditionalCheckedCastInst: {
|
||||
SILValue Val = getLocalValue(ValID, ValResNum,
|
||||
|
||||
@@ -663,16 +663,6 @@ void SILSerializer::writeSILInstruction(const SILInstruction &SI) {
|
||||
(unsigned)MI->getType().getCategory());
|
||||
break;
|
||||
}
|
||||
case ValueKind::ModuleInst: {
|
||||
// Has IdentifierID for the module reference. Use SILOneTypeLayout.
|
||||
const ModuleInst *MI = cast<ModuleInst>(&SI);
|
||||
ModuleType *MT = MI->getType().castTo<ModuleType>();
|
||||
SILOneTypeLayout::emitRecord(Out, ScratchRecord,
|
||||
SILAbbrCodes[SILOneTypeLayout::Code],
|
||||
(unsigned)SI.getKind(),
|
||||
S.addModuleRef(MT->getModule()), 0);
|
||||
break;
|
||||
}
|
||||
case ValueKind::ProjectExistentialInst: {
|
||||
const ProjectExistentialInst *PEI = cast<ProjectExistentialInst>(&SI);
|
||||
SILOneTypeOneOperandLayout::emitRecord(Out, ScratchRecord,
|
||||
|
||||
@@ -528,7 +528,6 @@ bb0(%0 : $Builtin.RawPointer, %1 : $Builtin.Int64):
|
||||
%3 = alloc_box $Builtin.Int64 // CHECK: alloc_box
|
||||
%4 = store %0 to %2#1 : $*Builtin.RawPointer
|
||||
%5 = store %1 to %3#1 : $*Builtin.Int64
|
||||
// %6 = module #Builtin
|
||||
%7 = load %2#1 : $*Builtin.RawPointer // CHECK: load
|
||||
%8 = load %3#1 : $*Builtin.Int64 // CHECK: load
|
||||
// CHECK: index_raw_pointer {{%.*}} : $Builtin.RawPointer, {{%.*}} : $Builtin.Int64
|
||||
@@ -672,7 +671,6 @@ bb0(%0 : $Builtin.Int1, %1 : $Builtin.Int1):
|
||||
%3 = alloc_box $Builtin.Int1
|
||||
store %0 to %2#1 : $*Builtin.Int1
|
||||
store %1 to %3#1 : $*Builtin.Int1
|
||||
%6 = module #Builtin // CHECK: module #Builtin
|
||||
// CHECK: builtin_function_ref #Builtin.cmp_eq_Int1 : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
|
||||
%7 = builtin_function_ref #Builtin.cmp_eq_Int1 : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
|
||||
%8 = load %2#1 : $*Builtin.Int1
|
||||
@@ -988,7 +986,6 @@ bb0(%0 : $Int64, %1 : $Int64, %2 : $Foo):
|
||||
%8 = alloc_stack $Foo // var self // users: %15, %14, %9
|
||||
store %2 to %8#1 : $*Foo
|
||||
%10 = metatype $Int64.metatype
|
||||
%11 = module #Builtin
|
||||
%12 = integer_literal $Builtin.Int64, 0 // user: %13
|
||||
%13 = struct $Int64 (%12 : $Builtin.Int64) // user: %18
|
||||
destroy_addr %8#1 : $*Foo
|
||||
|
||||
@@ -456,7 +456,6 @@ bb0(%0 : $Builtin.RawPointer, %1 : $Builtin.Int64):
|
||||
%3 = alloc_box $Builtin.Int64
|
||||
%4 = store %0 to %2#1 : $*Builtin.RawPointer
|
||||
%5 = store %1 to %3#1 : $*Builtin.Int64
|
||||
// %6 = module #Builtin
|
||||
%7 = load %2#1 : $*Builtin.RawPointer
|
||||
%8 = load %3#1 : $*Builtin.Int64
|
||||
// CHECK: index_raw_pointer {{%.*}} : $Builtin.RawPointer, {{%.*}} : $Builtin.Int64
|
||||
@@ -666,7 +665,6 @@ bb0(%0 : $Builtin.Int1, %1 : $Builtin.Int1):
|
||||
%3 = alloc_box $Builtin.Int1
|
||||
store %0 to %2#1 : $*Builtin.Int1
|
||||
store %1 to %3#1 : $*Builtin.Int1
|
||||
%6 = module #Builtin // CHECK: module #Builtin
|
||||
// CHECK: builtin_function_ref #Builtin.cmp_eq_Int1 : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
|
||||
%7 = builtin_function_ref #Builtin.cmp_eq_Int1 : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
|
||||
%8 = load %2#1 : $*Builtin.Int1
|
||||
@@ -953,7 +951,6 @@ bb0(%0 : $Int64, %1 : $Int64, %2 : $Foo):
|
||||
%8 = alloc_stack $Foo // var self // users: %15, %14, %9
|
||||
store %2 to %8#1 : $*Foo
|
||||
%10 = metatype $Int64.metatype
|
||||
%11 = module #Builtin
|
||||
%12 = integer_literal $Builtin.Int64, 0 // user: %13
|
||||
%13 = struct $Int64 (%12 : $Builtin.Int64) // user: %18
|
||||
destroy_addr %8#1 : $*Foo
|
||||
|
||||
Reference in New Issue
Block a user