Redesign the BuiltinFunctionRefInst to contain an Identifier instead of

a FuncDecl.  This makes it much more straight-forward for SIL passes to
introduce a new one - without doing name lookup in the builtin module!



Swift SVN r10694
This commit is contained in:
Chris Lattner
2013-11-30 01:49:36 +00:00
parent a5cf0fa60a
commit ad05efc481
18 changed files with 98 additions and 93 deletions

View File

@@ -1755,10 +1755,10 @@ builtin_function_ref
```````````````````` ````````````````````
:: ::
sil-instruction ::= 'builtin_function_ref' sil-decl-ref ':' sil-type sil-instruction ::= 'builtin_function_ref' sil-identifier ':' sil-type
%1 = builtin_function_ref #Builtin.foo : $@thin T -> U %1 = builtin_function_ref "foo" : $@thin T -> U
// #Builtin.foo must name a function in the Builtin module // "foo" must name a function in the Builtin module
// $@thin T -> U must be a thin function type // $@thin T -> U must be a thin function type
// %1 has type $@thin T -> U // %1 has type $@thin T -> U

View File

@@ -203,10 +203,9 @@ public:
} }
BuiltinFunctionRefInst *createBuiltinFunctionRef(SILLocation loc, BuiltinFunctionRefInst *createBuiltinFunctionRef(SILLocation loc,
FuncDecl *f, Identifier Id,
SILType ty) { SILType ty) {
return insert(new (F.getModule()) return insert(new (F.getModule()) BuiltinFunctionRefInst(loc, Id, ty));
BuiltinFunctionRefInst(loc, f, ty));
} }
FunctionRefInst *createFunctionRef(SILLocation loc, SILFunction *f) { FunctionRefInst *createFunctionRef(SILLocation loc, SILFunction *f) {
return insert(new (F.getModule()) return insert(new (F.getModule())

View File

@@ -234,7 +234,7 @@ void
SILCloner<ImplClass>::visitBuiltinFunctionRefInst(BuiltinFunctionRefInst *Inst){ SILCloner<ImplClass>::visitBuiltinFunctionRefInst(BuiltinFunctionRefInst *Inst){
doPostProcess(Inst, doPostProcess(Inst,
Builder.createBuiltinFunctionRef(getOpLocation(Inst->getLoc()), Builder.createBuiltinFunctionRef(getOpLocation(Inst->getLoc()),
Inst->getReferencedFunction(), Inst->getName(),
getOpType(Inst->getType()))); getOpType(Inst->getType())));
} }

View File

@@ -512,15 +512,15 @@ public:
/// BuiltinFunctionRefInst - Represents a reference to a primitive function from /// BuiltinFunctionRefInst - Represents a reference to a primitive function from
/// the Builtin module. /// the Builtin module.
class BuiltinFunctionRefInst : public SILInstruction { class BuiltinFunctionRefInst : public SILInstruction {
FuncDecl *Function; Identifier Name;
public: public:
BuiltinFunctionRefInst(SILLocation Loc, FuncDecl *Function, SILType Ty) BuiltinFunctionRefInst(SILLocation Loc, Identifier Name, SILType Ty)
: SILInstruction(ValueKind::BuiltinFunctionRefInst, Loc, Ty), : SILInstruction(ValueKind::BuiltinFunctionRefInst, Loc, Ty),
Function(Function) Name(Name)
{} {}
/// Return the referenced function. /// Return the referenced function.
FuncDecl *getReferencedFunction() const { return Function; } Identifier getName() const { return Name; }
SILType getType(unsigned i = 0) const { return ValueBase::getType(i); } SILType getType(unsigned i = 0) const { return ValueBase::getType(i); }

View File

@@ -1141,11 +1141,10 @@ Address IRGenModule::getAddrOfSILGlobalVariable(SILGlobalVariable *var) {
} }
void IRGenSILFunction::visitBuiltinFunctionRefInst(BuiltinFunctionRefInst *i) { void IRGenSILFunction::visitBuiltinFunctionRefInst(BuiltinFunctionRefInst *i) {
auto *FD = cast<FuncDecl>(i->getReferencedFunction()); setLoweredBuiltinValue(SILValue(i, 0), i->getName());
setLoweredBuiltinValue(SILValue(i, 0), FD->getName());
} }
void IRGenSILFunction::visitFunctionRefInst(swift::FunctionRefInst *i) { void IRGenSILFunction::visitFunctionRefInst(FunctionRefInst *i) {
// FIXME: pick the best available explosion level // FIXME: pick the best available explosion level
ExplosionKind explosionLevel = ExplosionKind::Minimal; ExplosionKind explosionLevel = ExplosionKind::Minimal;
llvm::Function *fnptr = llvm::Function *fnptr =

View File

@@ -1210,13 +1210,18 @@ bool SILParser::parseSILInstruction(SILBasicBlock *BB) {
break; break;
case ValueKind::BuiltinFunctionRefInst: { case ValueKind::BuiltinFunctionRefInst: {
SILType Ty; SILType Ty;
SILDeclRef FuncRef; if (P.Tok.getKind() != tok::string_literal) {
if (parseSILDeclRef(FuncRef) || P.diagnose(P.Tok, diag::expected_tok_in_sil_instr,"builtin_function_ref");
P.parseToken(tok::colon, diag::expected_tok_in_sil_instr, ":") || return true;
}
StringRef Str = P.Tok.getText();
Identifier Id = P.Context.getIdentifier(Str.substr(1, Str.size()-2));
P.consumeToken(tok::string_literal);
if (P.parseToken(tok::colon, diag::expected_tok_in_sil_instr, ":") ||
parseSILType(Ty)) parseSILType(Ty))
return true; return true;
ResultVal = B.createBuiltinFunctionRef(InstLoc, ResultVal = B.createBuiltinFunctionRef(InstLoc, Id, Ty);
cast<FuncDecl>(FuncRef.getDecl()), Ty);
break; break;
} }
case ValueKind::ProjectExistentialInst: case ValueKind::ProjectExistentialInst:

View File

@@ -371,11 +371,11 @@ SILGlobalAddrInst::SILGlobalAddrInst(SILLocation Loc, SILGlobalVariable *Global)
{} {}
const IntrinsicInfo &BuiltinFunctionRefInst::getIntrinsicInfo() const { const IntrinsicInfo &BuiltinFunctionRefInst::getIntrinsicInfo() const {
return getModule().getIntrinsicInfo(Function->getName()); return getModule().getIntrinsicInfo(getName());
} }
const BuiltinInfo &BuiltinFunctionRefInst::getBuiltinInfo() const { const BuiltinInfo &BuiltinFunctionRefInst::getBuiltinInfo() const {
return getModule().getBuiltinInfo(Function->getName()); return getModule().getBuiltinInfo(getName());
} }
static unsigned getWordsForBitWidth(unsigned bits) { static unsigned getWordsForBitWidth(unsigned bits) {

View File

@@ -43,6 +43,35 @@ struct ID {
int ResultNumber; int ResultNumber;
}; };
static void printEscapedString(raw_ostream &OS, StringRef value) {
OS << '"';
for (auto C : value) {
switch (C) {
case '\\': OS << "\\\\"; break;
case '\t': OS << "\\t"; break;
case '\n': OS << "\\n"; break;
case '\r': OS << "\\r"; break;
case '"': OS << "\\\""; break;
case '\'': OS << '\''; break; // no need to escape these
case '\0': OS << "\\0"; break;
default:
auto c = (unsigned char)C;
// Other ASCII control characters should get escaped.
if (c < 0x20) {
static const char hexdigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G'
};
OS << "\\x" << hexdigit[c >> 4] << hexdigit[c & 0xF];
} else {
OS << c;
}
break;
}
}
OS << '"';
}
enum SILColorKind { enum SILColorKind {
SC_Type, SC_Type,
}; };
@@ -555,8 +584,9 @@ public:
} }
void visitBuiltinFunctionRefInst(BuiltinFunctionRefInst *BFI) { void visitBuiltinFunctionRefInst(BuiltinFunctionRefInst *BFI) {
OS << "builtin_function_ref " << SILDeclRef(BFI->getReferencedFunction()) OS << "builtin_function_ref ";
<< " : " << BFI->getType(); printEscapedString(OS, BFI->getName().str());
OS << " : " << BFI->getType();
} }
void visitGlobalAddrInst(GlobalAddrInst *GAI) { void visitGlobalAddrInst(GlobalAddrInst *GAI) {
@@ -583,34 +613,8 @@ public:
OS << " // " << decimal; OS << " // " << decimal;
} }
void visitStringLiteralInst(StringLiteralInst *SLI) { void visitStringLiteralInst(StringLiteralInst *SLI) {
OS << "string_literal \""; OS << "string_literal ";
printEscapedString(OS, SLI->getValue());
auto value = SLI->getValue();
for (size_t i = 0, e = value.size(); i != e; ++i) {
switch (value[i]) {
case '\\': OS << "\\\\"; break;
case '\t': OS << "\\t"; break;
case '\n': OS << "\\n"; break;
case '\r': OS << "\\r"; break;
case '"': OS << "\\\""; break;
case '\'': OS << '\''; break; // no need to escape these
case '\0': OS << "\\0"; break;
default:
auto c = (unsigned char) value[i];
// Other ASCII control characters should get escaped.
if (c < 0x20) {
static const char hexdigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G'
};
OS << "\\x" << hexdigit[c >> 4] << hexdigit[c & 0xF];
} else {
OS << c;
}
break;
}
}
OS << "\"";
} }
void visitLoadInst(LoadInst *LI) { void visitLoadInst(LoadInst *LI) {
OS << "load " << getIDAndType(LI->getOperand()); OS << "load " << getIDAndType(LI->getOperand());

View File

@@ -366,8 +366,6 @@ public:
} }
void checkBuiltinFunctionRefInst(BuiltinFunctionRefInst *BFI) { void checkBuiltinFunctionRefInst(BuiltinFunctionRefInst *BFI) {
require(isa<BuiltinModule>(BFI->getReferencedFunction()->getDeclContext()),
"builtin_function_ref must refer to a function in the Builtin module");
auto fnType = requireObjectType(SILFunctionType, BFI, auto fnType = requireObjectType(SILFunctionType, BFI,
"result of builtin_function_ref"); "result of builtin_function_ref");
require(fnType->isThin(), require(fnType->isThin(),

View File

@@ -265,7 +265,7 @@ SILValue SILGenFunction::emitGlobalFunctionRef(SILLocation loc,
"emitting ref to local constant without context?!"); "emitting ref to local constant without context?!");
if (constant.hasDecl() && if (constant.hasDecl() &&
isa<BuiltinModule>(constant.getDecl()->getDeclContext())) { isa<BuiltinModule>(constant.getDecl()->getDeclContext())) {
return B.createBuiltinFunctionRef(loc, cast<FuncDecl>(constant.getDecl()), return B.createBuiltinFunctionRef(loc, constant.getDecl()->getName(),
constantInfo.getSILType()); constantInfo.getSILType());
} }
@@ -2537,7 +2537,8 @@ void SILGenFunction::emitGlobalAccessor(VarDecl *global,
// Emit a reference to Builtin.once. // Emit a reference to Builtin.once.
SILDeclRef builtinOnceConstant(builtinOnceDecl, SILDeclRef::Kind::Func); SILDeclRef builtinOnceConstant(builtinOnceDecl, SILDeclRef::Kind::Func);
auto builtinOnceSILTy = SGM.Types.getConstantType(builtinOnceConstant); auto builtinOnceSILTy = SGM.Types.getConstantType(builtinOnceConstant);
auto builtinOnce = B.createBuiltinFunctionRef(global, builtinOnceDecl, auto builtinOnce = B.createBuiltinFunctionRef(global,
builtinOnceDecl->getName(),
builtinOnceSILTy); builtinOnceSILTy);
SILType rawPointerSILTy SILType rawPointerSILTy

View File

@@ -634,8 +634,7 @@ bool SILDeserializer::readSILInstruction(SILFunction *Fn, SILBasicBlock *BB,
case ValueKind::BuiltinFunctionRefInst: { case ValueKind::BuiltinFunctionRefInst: {
// Format: FuncDecl and type. Use SILOneOperandLayout. // Format: FuncDecl and type. Use SILOneOperandLayout.
auto Ty = MF->getType(TyID); auto Ty = MF->getType(TyID);
ResultVal = Builder.createBuiltinFunctionRef(Loc, ResultVal = Builder.createBuiltinFunctionRef(Loc, MF->getIdentifier(ValID),
cast<FuncDecl>(MF->getDecl(ValID)),
getSILType(Ty, (SILValueCategory)TyCategory)); getSILType(Ty, (SILValueCategory)TyCategory));
break; break;
} }

View File

@@ -390,7 +390,7 @@ void SILSerializer::writeSILInstruction(const SILInstruction &SI) {
(unsigned)SI.getKind(), 0, (unsigned)SI.getKind(), 0,
S.addTypeRef(BFR->getType().getSwiftRValueType()), S.addTypeRef(BFR->getType().getSwiftRValueType()),
(unsigned)BFR->getType().getCategory(), (unsigned)BFR->getType().getCategory(),
S.addDeclRef(BFR->getReferencedFunction()), 0); S.addIdentifierRef(BFR->getName()), 0);
break; break;
} }
case ValueKind::GlobalAddrInst: { case ValueKind::GlobalAddrInst: {

View File

@@ -671,8 +671,8 @@ bb0(%0 : $Builtin.Int1, %1 : $Builtin.Int1):
%3 = alloc_box $Builtin.Int1 %3 = alloc_box $Builtin.Int1
store %0 to %2#1 : $*Builtin.Int1 store %0 to %2#1 : $*Builtin.Int1
store %1 to %3#1 : $*Builtin.Int1 store %1 to %3#1 : $*Builtin.Int1
// CHECK: builtin_function_ref #Builtin.cmp_eq_Int1 : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 // CHECK: builtin_function_ref "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 %7 = builtin_function_ref "cmp_eq_Int1" : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
%8 = load %2#1 : $*Builtin.Int1 %8 = load %2#1 : $*Builtin.Int1
%9 = load %3#1 : $*Builtin.Int1 %9 = load %3#1 : $*Builtin.Int1
%10 = apply %7(%8, %9) : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 %10 = apply %7(%8, %9) : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1

View File

@@ -5,9 +5,9 @@ import swift
// Compute an expression using a chain of arithmetic with overflow instructions: 2 * (2 + 3) - 3 // Compute an expression using a chain of arithmetic with overflow instructions: 2 * (2 + 3) - 3
sil @fold_arithmetic_with_overflow : $@thin () -> Builtin.Int64 { sil @fold_arithmetic_with_overflow : $@thin () -> Builtin.Int64 {
bb0: bb0:
%1 = builtin_function_ref #Builtin.int_sadd_with_overflow_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1) %1 = builtin_function_ref "int_sadd_with_overflow_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1)
%2 = builtin_function_ref #Builtin.int_smul_with_overflow_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1) %2 = builtin_function_ref "int_smul_with_overflow_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1)
%3 = builtin_function_ref #Builtin.int_ssub_with_overflow_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1) %3 = builtin_function_ref "int_ssub_with_overflow_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1)
%0 = integer_literal $Builtin.Int64, 2 %0 = integer_literal $Builtin.Int64, 2
%110 = integer_literal $Builtin.Int64, 3 %110 = integer_literal $Builtin.Int64, 3
%18 = apply %1(%0, %110) : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1) %18 = apply %1(%0, %110) : $@thin (Builtin.Int64, Builtin.Int64) -> (Builtin.Int64, Builtin.Int1)
@@ -19,9 +19,9 @@ bb0:
return %23 : $Builtin.Int64 return %23 : $Builtin.Int64
// CHECK-LABEL: sil @fold_arithmetic_with_overflow // CHECK-LABEL: sil @fold_arithmetic_with_overflow
// CHECK-NOT: builtin_function_ref #Builtin.int_sadd_with_overflow_Int64 // CHECK-NOT: builtin_function_ref "int_sadd_with_overflow_Int64"
// CHECK-NOT: builtin_function_ref #Builtin.int_smul_with_overflow_Int64 // CHECK-NOT: builtin_function_ref "int_smul_with_overflow_Int64"
// CHECK-NOT: builtin_function_ref #Builtin.int_ssub_with_overflow_Int64 // CHECK-NOT: builtin_function_ref "int_ssub_with_overflow_Int64"
// CHECK-NOT: integer_literal $Builtin.Int64, 2 // CHECK-NOT: integer_literal $Builtin.Int64, 2
// CHECK-NOT: integer_literal $Builtin.Int64, 3 // CHECK-NOT: integer_literal $Builtin.Int64, 3
// CHECK-NOT: integer_literal $Builtin.Int64, 0 // CHECK-NOT: integer_literal $Builtin.Int64, 0
@@ -34,19 +34,19 @@ bb0:
sil @fold_trunc : $@thin () -> Builtin.Int64 { sil @fold_trunc : $@thin () -> Builtin.Int64 {
bb0: bb0:
%0 = integer_literal $Builtin.Int128, 22 %0 = integer_literal $Builtin.Int128, 22
%1 = builtin_function_ref #Builtin.trunc_Int128_Int64 : $@thin Builtin.Int128 -> Builtin.Int64 %1 = builtin_function_ref "trunc_Int128_Int64" : $@thin Builtin.Int128 -> Builtin.Int64
%2 = apply %1(%0) : $@thin Builtin.Int128 -> Builtin.Int64 %2 = apply %1(%0) : $@thin Builtin.Int128 -> Builtin.Int64
br bb4(%2 : $Builtin.Int64) br bb4(%2 : $Builtin.Int64)
bb1: bb1:
%3 = integer_literal $Builtin.Int8, 23 %3 = integer_literal $Builtin.Int8, 23
%4 = builtin_function_ref #Builtin.sext_Int8_Int64 : $@thin Builtin.Int8 -> Builtin.Int64 %4 = builtin_function_ref "sext_Int8_Int64" : $@thin Builtin.Int8 -> Builtin.Int64
%5 = apply %4(%3) : $@thin Builtin.Int8 -> Builtin.Int64 %5 = apply %4(%3) : $@thin Builtin.Int8 -> Builtin.Int64
br bb4(%5 : $Builtin.Int64) br bb4(%5 : $Builtin.Int64)
bb2: bb2:
%6 = integer_literal $Builtin.Int8, 24 %6 = integer_literal $Builtin.Int8, 24
%7 = builtin_function_ref #Builtin.zext_Int8_Int64 : $@thin Builtin.Int8 -> Builtin.Int64 %7 = builtin_function_ref "zext_Int8_Int64" : $@thin Builtin.Int8 -> Builtin.Int64
%8 = apply %7(%6) : $@thin Builtin.Int8 -> Builtin.Int64 %8 = apply %7(%6) : $@thin Builtin.Int8 -> Builtin.Int64
br bb4(%8 : $Builtin.Int64) br bb4(%8 : $Builtin.Int64)
@@ -126,7 +126,7 @@ bb0:
sil @testChainingCCP : $@thin () -> Builtin.Int1 { sil @testChainingCCP : $@thin () -> Builtin.Int1 {
bb0: bb0:
%1 = builtin_function_ref #Builtin.trunc_Int64_Int1 : $@thin Builtin.Int64 -> Builtin.Int1 %1 = builtin_function_ref "trunc_Int64_Int1" : $@thin Builtin.Int64 -> Builtin.Int1
%2 = integer_literal $Builtin.Int64, 0 %2 = integer_literal $Builtin.Int64, 0
%3 = struct $Int64 (%2 : $Builtin.Int64) %3 = struct $Int64 (%2 : $Builtin.Int64)
%4 = struct_extract %3 : $Int64, #value %4 = struct_extract %3 : $Int64, #value
@@ -142,7 +142,7 @@ bb0:
sil @testDivision : $@thin () -> Builtin.Int8 { sil @testDivision : $@thin () -> Builtin.Int8 {
bb0: bb0:
%0 = builtin_function_ref #Builtin.sdiv_Int8 : $@thin (Builtin.Int8, Builtin.Int8) -> Builtin.Int8 %0 = builtin_function_ref "sdiv_Int8" : $@thin (Builtin.Int8, Builtin.Int8) -> Builtin.Int8
%1 = integer_literal $Builtin.Int8, 6 %1 = integer_literal $Builtin.Int8, 6
%2 = integer_literal $Builtin.Int8, 3 %2 = integer_literal $Builtin.Int8, 3
%3 = apply [transparent] %0(%1, %2) : $@thin (Builtin.Int8, Builtin.Int8) -> Builtin.Int8 %3 = apply [transparent] %0(%1, %2) : $@thin (Builtin.Int8, Builtin.Int8) -> Builtin.Int8
@@ -157,7 +157,7 @@ bb0:
sil @testRem : $@thin () -> Builtin.Int64 { sil @testRem : $@thin () -> Builtin.Int64 {
bb0: bb0:
%0 = builtin_function_ref #Builtin.urem_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 %0 = builtin_function_ref "urem_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64
%1 = integer_literal $Builtin.Int64, 10 %1 = integer_literal $Builtin.Int64, 10
%2 = integer_literal $Builtin.Int64, 2 %2 = integer_literal $Builtin.Int64, 2
%3 = apply [transparent] %0(%1, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 %3 = apply [transparent] %0(%1, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64
@@ -174,15 +174,15 @@ sil @testFoldingIntBinaryPredicates : $@thin () -> () {
bb0: bb0:
%1 = integer_literal $Builtin.Int1, 1 %1 = integer_literal $Builtin.Int1, 1
%2 = integer_literal $Builtin.Int1, 0 %2 = integer_literal $Builtin.Int1, 0
%3 = builtin_function_ref #Builtin.cmp_eq_Int1 : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 %3 = builtin_function_ref "cmp_eq_Int1" : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
%4 = apply %3(%1, %2) : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 %4 = apply %3(%1, %2) : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
%11 = integer_literal $Builtin.Int32, 21 %11 = integer_literal $Builtin.Int32, 21
%12 = integer_literal $Builtin.Int32, 12 %12 = integer_literal $Builtin.Int32, 12
%13 = builtin_function_ref #Builtin.cmp_ne_Int32 : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1 %13 = builtin_function_ref "cmp_ne_Int32" : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1
%14 = apply %13(%11, %12) : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1 %14 = apply %13(%11, %12) : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1
%15 = builtin_function_ref #Builtin.cmp_sgt_Int32 : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1 %15 = builtin_function_ref "cmp_sgt_Int32" : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1
%16 = apply %15(%12, %11) : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1 %16 = apply %15(%12, %11) : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1
%17 = builtin_function_ref #Builtin.cmp_ult_Int32 : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1 %17 = builtin_function_ref "cmp_ult_Int32" : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1
%18 = apply %17(%12, %11) : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1 %18 = apply %17(%12, %11) : $@thin (Builtin.Int32, Builtin.Int32) -> Builtin.Int1
%5 = tuple () %5 = tuple ()
return %5 : $() return %5 : $()
@@ -201,9 +201,9 @@ sil @fold_binary_bitwise : $@thin () -> Builtin.Int64 {
bb0: bb0:
%0 = integer_literal $Builtin.Int64, 1 // users: %7, %6, %5 %0 = integer_literal $Builtin.Int64, 1 // users: %7, %6, %5
%1 = integer_literal $Builtin.Int64, 0 // users: %7, %6, %5 %1 = integer_literal $Builtin.Int64, 0 // users: %7, %6, %5
%2 = builtin_function_ref #Builtin.and_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %5 %2 = builtin_function_ref "and_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %5
%3 = builtin_function_ref #Builtin.or_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %6 %3 = builtin_function_ref "or_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %6
%4 = builtin_function_ref #Builtin.xor_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %7 %4 = builtin_function_ref "xor_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %7
%5 = apply %2(%0, %1) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 %5 = apply %2(%0, %1) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64
%6 = apply %3(%0, %1) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 %6 = apply %3(%0, %1) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64
%7 = apply %4(%0, %1) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %8 %7 = apply %4(%0, %1) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %8
@@ -225,9 +225,9 @@ bb0:
%2 = integer_literal $Builtin.Int64, 3 // users: %11, %10, %9, %8 %2 = integer_literal $Builtin.Int64, 3 // users: %11, %10, %9, %8
%3 = integer_literal $Builtin.Int64, 1 // user: %12 %3 = integer_literal $Builtin.Int64, 1 // user: %12
%4 = integer_literal $Builtin.Int64, 5 // user: %12 %4 = integer_literal $Builtin.Int64, 5 // user: %12
%5 = builtin_function_ref #Builtin.ashr_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // users: %10, %8 %5 = builtin_function_ref "ashr_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // users: %10, %8
%6 = builtin_function_ref #Builtin.lshr_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // users: %11, %9 %6 = builtin_function_ref "lshr_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // users: %11, %9
%7 = builtin_function_ref #Builtin.shl_Int64 : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %12 %7 = builtin_function_ref "shl_Int64" : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 // user: %12
%8 = apply %5(%0, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 %8 = apply %5(%0, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64
%9 = apply %6(%0, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 %9 = apply %6(%0, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64
%10 = apply %5(%1, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64 %10 = apply %5(%1, %2) : $@thin (Builtin.Int64, Builtin.Int64) -> Builtin.Int64
@@ -250,10 +250,10 @@ sil @fold_float_operations : $@thin () -> Builtin.FPIEEE64 {
bb0: bb0:
%4 = float_literal $Builtin.FPIEEE64, 0x402E4CCCCCCCCCCD // 15.15 %4 = float_literal $Builtin.FPIEEE64, 0x402E4CCCCCCCCCCD // 15.15
%11 = float_literal $Builtin.FPIEEE64, 0x400A666666666666 // 3.2999999999999998 // user: %12 %11 = float_literal $Builtin.FPIEEE64, 0x400A666666666666 // 3.2999999999999998 // user: %12
%0 = builtin_function_ref #Builtin.fadd_FPIEEE64 : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64 %0 = builtin_function_ref "fadd_FPIEEE64" : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64
%1 = builtin_function_ref #Builtin.fdiv_FPIEEE64 : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64 %1 = builtin_function_ref "fdiv_FPIEEE64" : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64
%2 = builtin_function_ref #Builtin.fsub_FPIEEE64 : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64 %2 = builtin_function_ref "fsub_FPIEEE64" : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64
%3 = builtin_function_ref #Builtin.fmul_FPIEEE64 : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64 %3 = builtin_function_ref "fmul_FPIEEE64" : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64
%8 = apply %0(%4, %11) : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64 %8 = apply %0(%4, %11) : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64
%9 = apply %1(%4, %11) : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64 %9 = apply %1(%4, %11) : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64
%10 = apply %2(%4, %11) : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64 %10 = apply %2(%4, %11) : $@thin (Builtin.FPIEEE64, Builtin.FPIEEE64) -> Builtin.FPIEEE64

View File

@@ -4,7 +4,7 @@ import Builtin
// fold_sadd_with_overflow_Overflow // fold_sadd_with_overflow_Overflow
sil @fold_sadd_with_overflow_Overflow : $@thin (Builtin.RawPointer) -> Builtin.Int64 { sil @fold_sadd_with_overflow_Overflow : $@thin (Builtin.RawPointer) -> Builtin.Int64 {
bb0(%0 : $Builtin.RawPointer): bb0(%0 : $Builtin.RawPointer):
%1 = builtin_function_ref #Builtin.sadd_with_overflow_Int64 : $@thin (Builtin.Int64, Builtin.Int64, Builtin.Int1) -> (Builtin.Int64, Builtin.Int1) %1 = builtin_function_ref "sadd_with_overflow_Int64" : $@thin (Builtin.Int64, Builtin.Int64, Builtin.Int1) -> (Builtin.Int64, Builtin.Int1)
%2 = integer_literal $Builtin.Int64, 9223372036854775807 %2 = integer_literal $Builtin.Int64, 9223372036854775807
%3 = integer_literal $Builtin.Int64, 9223372036854775807 %3 = integer_literal $Builtin.Int64, 9223372036854775807
%21 = integer_literal $Builtin.Int1, 1 %21 = integer_literal $Builtin.Int1, 1

View File

@@ -538,7 +538,7 @@ bb0(%0 : $Bool, %1 : $Bool):
sil [transparent] @convertFromBultinIntegerLiteral : $@thin (Builtin.Int2048, Int64.metatype) -> Int64 { sil [transparent] @convertFromBultinIntegerLiteral : $@thin (Builtin.Int2048, Int64.metatype) -> Int64 {
bb0(%0 : $Builtin.Int2048, %1 : $Int64.metatype): bb0(%0 : $Builtin.Int2048, %1 : $Int64.metatype):
%2 = builtin_function_ref #Builtin.s_to_s_checked_trunc_Int2048_Int64 : $@thin Builtin.Int2048 -> (Builtin.Int64, Builtin.Int1) %2 = builtin_function_ref "s_to_s_checked_trunc_Int2048_Int64" : $@thin Builtin.Int2048 -> (Builtin.Int64, Builtin.Int1)
%3 = apply %2(%0) : $@thin Builtin.Int2048 -> (Builtin.Int64, Builtin.Int1) %3 = apply %2(%0) : $@thin Builtin.Int2048 -> (Builtin.Int64, Builtin.Int1)
%4 = tuple_extract %3 : $(Builtin.Int64, Builtin.Int1), 0 %4 = tuple_extract %3 : $(Builtin.Int64, Builtin.Int1), 0
%5 = struct $Int64 (%4 : $Builtin.Int64) %5 = struct $Int64 (%4 : $Builtin.Int64)

View File

@@ -5,7 +5,7 @@ import Builtin
sil @sil_test_static_report : $@thin (Builtin.RawPointer) -> Builtin.RawPointer { sil @sil_test_static_report : $@thin (Builtin.RawPointer) -> Builtin.RawPointer {
bb0(%0 : $Builtin.RawPointer): bb0(%0 : $Builtin.RawPointer):
%1 = integer_literal $Builtin.Int1, 1 %1 = integer_literal $Builtin.Int1, 1
%2 = builtin_function_ref #Builtin.staticReport : $@thin (Builtin.Int1, Builtin.Int1, Builtin.RawPointer) -> () %2 = builtin_function_ref "staticReport" : $@thin (Builtin.Int1, Builtin.Int1, Builtin.RawPointer) -> ()
%3 = apply %2(%1, %1, %0) : $@thin (Builtin.Int1, Builtin.Int1, Builtin.RawPointer) -> () // expected-error {{static report error}} %3 = apply %2(%1, %1, %0) : $@thin (Builtin.Int1, Builtin.Int1, Builtin.RawPointer) -> () // expected-error {{static report error}}
return %0 : $Builtin.RawPointer return %0 : $Builtin.RawPointer
} }

View File

@@ -664,8 +664,8 @@ bb0(%0 : $Builtin.Int1, %1 : $Builtin.Int1):
%3 = alloc_box $Builtin.Int1 %3 = alloc_box $Builtin.Int1
store %0 to %2#1 : $*Builtin.Int1 store %0 to %2#1 : $*Builtin.Int1
store %1 to %3#1 : $*Builtin.Int1 store %1 to %3#1 : $*Builtin.Int1
// CHECK: builtin_function_ref #Builtin.cmp_eq_Int1 : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 // CHECK: builtin_function_ref "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 %7 = builtin_function_ref "cmp_eq_Int1" : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1
%8 = load %2#1 : $*Builtin.Int1 %8 = load %2#1 : $*Builtin.Int1
%9 = load %3#1 : $*Builtin.Int1 %9 = load %3#1 : $*Builtin.Int1
%10 = apply %7(%8, %9) : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1 %10 = apply %7(%8, %9) : $@thin (Builtin.Int1, Builtin.Int1) -> Builtin.Int1