@@ -66,42 +66,6 @@ llvm::Constant *irgen::emitConstantInt(IRGenModule &IGM,
6666 return llvm::ConstantInt::get (IGM.getLLVMContext (), value);
6767}
6868
69- llvm::Constant *irgen::emitConstantZero (IRGenModule &IGM, BuiltinInst *BI) {
70- assert (IGM.getSILModule ().getBuiltinInfo (BI->getName ()).ID ==
71- BuiltinValueKind::ZeroInitializer);
72-
73- auto helper = [&](CanType astType) -> llvm::Constant * {
74- if (auto type = astType->getAs <BuiltinIntegerType>()) {
75- APInt zero (type->getWidth ().getLeastWidth (), 0 );
76- return llvm::ConstantInt::get (IGM.getLLVMContext (), zero);
77- }
78-
79- if (auto type = astType->getAs <BuiltinFloatType>()) {
80- const llvm::fltSemantics *sema = nullptr ;
81- switch (type->getFPKind ()) {
82- case BuiltinFloatType::IEEE16: sema = &APFloat::IEEEhalf (); break ;
83- case BuiltinFloatType::IEEE32: sema = &APFloat::IEEEsingle (); break ;
84- case BuiltinFloatType::IEEE64: sema = &APFloat::IEEEdouble (); break ;
85- case BuiltinFloatType::IEEE80: sema = &APFloat::x87DoubleExtended (); break ;
86- case BuiltinFloatType::IEEE128: sema = &APFloat::IEEEquad (); break ;
87- case BuiltinFloatType::PPC128: sema = &APFloat::PPCDoubleDouble (); break ;
88- }
89- auto zero = APFloat::getZero (*sema);
90- return llvm::ConstantFP::get (IGM.getLLVMContext (), zero);
91- }
92-
93- llvm_unreachable (" SIL allowed an unknown type?" );
94- };
95-
96- if (auto vector = BI->getType ().getAs <BuiltinVectorType>()) {
97- auto zero = helper (vector.getElementType ());
98- auto count = llvm::ElementCount::getFixed (vector->getNumElements ());
99- return llvm::ConstantVector::getSplat (count, zero);
100- }
101-
102- return helper (BI->getType ().getASTType ());
103- }
104-
10569llvm::Constant *irgen::emitConstantFP (IRGenModule &IGM, FloatLiteralInst *FLI) {
10670 return llvm::ConstantFP::get (IGM.getLLVMContext (), FLI->getValue ());
10771}
@@ -311,8 +275,15 @@ Explosion irgen::emitConstantValue(IRGenModule &IGM, SILValue operand,
311275 } else if (auto *BI = dyn_cast<BuiltinInst>(operand)) {
312276 auto args = BI->getArguments ();
313277 switch (IGM.getSILModule ().getBuiltinInfo (BI->getName ()).ID ) {
314- case BuiltinValueKind::ZeroInitializer:
315- return emitConstantZero (IGM, BI);
278+ case BuiltinValueKind::ZeroInitializer: {
279+ auto &resultTI = cast<LoadableTypeInfo>(IGM.getTypeInfo (BI->getType ()));
280+ auto schema = resultTI.getSchema ();
281+ Explosion out;
282+ for (auto &elt : schema) {
283+ out.add (llvm::Constant::getNullValue (elt.getScalarType ()));
284+ }
285+ return out;
286+ }
316287 case BuiltinValueKind::PtrToInt: {
317288 auto *ptr = emitConstantValue (IGM, args[0 ]).claimNextConstant ();
318289 return llvm::ConstantExpr::getPtrToInt (ptr, IGM.IntPtrTy );
0 commit comments