@@ -56,6 +56,41 @@ llvm::Constant *irgen::emitConstantInt(IRGenModule &IGM,
5656 return llvm::ConstantInt::get (IGM.getLLVMContext (), value);
5757}
5858
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+
5994llvm::Constant *irgen::emitConstantFP (IRGenModule &IGM, FloatLiteralInst *FLI) {
6095 return llvm::ConstantFP::get (IGM.getLLVMContext (), FLI->getValue ());
6196}
@@ -94,6 +129,8 @@ static llvm::Constant *emitConstantValue(IRGenModule &IGM, SILValue operand) {
94129 return emitAddrOfConstantString (IGM, SLI);
95130 } else if (auto *BI = dyn_cast<BuiltinInst>(operand)) {
96131 switch (IGM.getSILModule ().getBuiltinInfo (BI->getName ()).ID ) {
132+ case BuiltinValueKind::ZeroInitializer:
133+ return emitConstantZero (IGM, BI);
97134 case BuiltinValueKind::PtrToInt: {
98135 llvm::Constant *ptr = emitConstantValue (IGM, BI->getArguments ()[0 ]);
99136 return llvm::ConstantExpr::getPtrToInt (ptr, IGM.IntPtrTy );
0 commit comments