@@ -66,42 +66,6 @@ llvm::Constant *irgen::emitConstantInt(IRGenModule &IGM,
66
66
return llvm::ConstantInt::get (IGM.getLLVMContext (), value);
67
67
}
68
68
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
-
105
69
llvm::Constant *irgen::emitConstantFP (IRGenModule &IGM, FloatLiteralInst *FLI) {
106
70
return llvm::ConstantFP::get (IGM.getLLVMContext (), FLI->getValue ());
107
71
}
@@ -311,8 +275,15 @@ Explosion irgen::emitConstantValue(IRGenModule &IGM, SILValue operand,
311
275
} else if (auto *BI = dyn_cast<BuiltinInst>(operand)) {
312
276
auto args = BI->getArguments ();
313
277
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
+ }
316
287
case BuiltinValueKind::PtrToInt: {
317
288
auto *ptr = emitConstantValue (IGM, args[0 ]).claimNextConstant ();
318
289
return llvm::ConstantExpr::getPtrToInt (ptr, IGM.IntPtrTy );
0 commit comments