@@ -56,6 +56,41 @@ llvm::Constant *irgen::emitConstantInt(IRGenModule &IGM,
56
56
return llvm::ConstantInt::get (IGM.getLLVMContext (), value);
57
57
}
58
58
59
+ llvm::Constant *irgen::emitConstantZero (IRGenModule &IGM, BuiltinInst *BI) {
60
+ assert (IGM.getSILModule ().getBuiltinInfo (BI->getName ()).ID ==
61
+ BuiltinValueKind::ZeroInitializer);
62
+
63
+ auto helper = [&](CanType astType) -> llvm::Constant * {
64
+ if (auto type = astType->getAs <BuiltinIntegerType>()) {
65
+ APInt zero (type->getWidth ().getLeastWidth (), 0 );
66
+ return llvm::ConstantInt::get (IGM.getLLVMContext (), zero);
67
+ }
68
+
69
+ if (auto type = astType->getAs <BuiltinFloatType>()) {
70
+ const llvm::fltSemantics *sema = nullptr ;
71
+ switch (type->getFPKind ()) {
72
+ case BuiltinFloatType::IEEE16: sema = &APFloat::IEEEhalf (); break ;
73
+ case BuiltinFloatType::IEEE32: sema = &APFloat::IEEEsingle (); break ;
74
+ case BuiltinFloatType::IEEE64: sema = &APFloat::IEEEdouble (); break ;
75
+ case BuiltinFloatType::IEEE80: sema = &APFloat::x87DoubleExtended (); break ;
76
+ case BuiltinFloatType::IEEE128: sema = &APFloat::IEEEquad (); break ;
77
+ case BuiltinFloatType::PPC128: sema = &APFloat::PPCDoubleDouble (); break ;
78
+ }
79
+ auto zero = APFloat::getZero (*sema);
80
+ return llvm::ConstantFP::get (IGM.getLLVMContext (), zero);
81
+ }
82
+
83
+ llvm_unreachable (" SIL allowed an unknown type?" );
84
+ };
85
+
86
+ if (auto vector = BI->getType ().getAs <BuiltinVectorType>()) {
87
+ auto zero = helper (vector.getElementType ());
88
+ return llvm::ConstantVector::getSplat (vector->getNumElements (), zero);
89
+ }
90
+
91
+ return helper (BI->getType ().getASTType ());
92
+ }
93
+
59
94
llvm::Constant *irgen::emitConstantFP (IRGenModule &IGM, FloatLiteralInst *FLI) {
60
95
return llvm::ConstantFP::get (IGM.getLLVMContext (), FLI->getValue ());
61
96
}
@@ -94,6 +129,8 @@ static llvm::Constant *emitConstantValue(IRGenModule &IGM, SILValue operand) {
94
129
return emitAddrOfConstantString (IGM, SLI);
95
130
} else if (auto *BI = dyn_cast<BuiltinInst>(operand)) {
96
131
switch (IGM.getSILModule ().getBuiltinInfo (BI->getName ()).ID ) {
132
+ case BuiltinValueKind::ZeroInitializer:
133
+ return emitConstantZero (IGM, BI);
97
134
case BuiltinValueKind::PtrToInt: {
98
135
llvm::Constant *ptr = emitConstantValue (IGM, BI->getArguments ()[0 ]);
99
136
return llvm::ConstantExpr::getPtrToInt (ptr, IGM.IntPtrTy );
0 commit comments