Skip to content

Commit 58d163b

Browse files
authored
Merge pull request swiftlang#31528 from davezarzycki/pr31528
[SILOpt] Add ZeroInitializer to isValidStaticInitializerInst
2 parents 619d0b0 + 9bd6b02 commit 58d163b

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

lib/IRGen/GenConstant.cpp

+37
Original file line numberDiff line numberDiff line change
@@ -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+
5994
llvm::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);

lib/IRGen/GenConstant.h

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ namespace irgen {
2727
/// Construct a ConstantInt from an IntegerLiteralInst.
2828
llvm::Constant *emitConstantInt(IRGenModule &IGM, IntegerLiteralInst *ILI);
2929

30+
/// Construct a zero from a zero intializer BuiltinInst.
31+
llvm::Constant *emitConstantZero(IRGenModule &IGM, BuiltinInst *Bi);
32+
3033
/// Construct a ConstantFP from a FloatLiteralInst.
3134
llvm::Constant *emitConstantFP(IRGenModule &IGM, FloatLiteralInst *FLI);
3235

lib/SIL/IR/SILGlobalVariable.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ bool SILGlobalVariable::isValidStaticInitializerInst(const SILInstruction *I,
109109
case SILInstructionKind::BuiltinInst: {
110110
auto *bi = cast<BuiltinInst>(I);
111111
switch (M.getBuiltinInfo(bi->getName()).ID) {
112+
case BuiltinValueKind::ZeroInitializer: {
113+
auto type = bi->getType().getASTType();
114+
if (auto vector = dyn_cast<BuiltinVectorType>(type))
115+
type = vector.getElementType();
116+
return isa<BuiltinIntegerType>(type) || isa<BuiltinFloatType>(type);
117+
}
112118
case BuiltinValueKind::PtrToInt:
113119
if (isa<LiteralInst>(bi->getArguments()[0]))
114120
return true;
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// RUN: %target-swift-frontend -O -parse-stdlib -emit-ir -module-name ZeroInit -verify %s | %FileCheck %s
2+
3+
import Swift
4+
5+
@frozen
6+
public struct TestInt {
7+
@usableFromInline
8+
var _value : Builtin.Int32
9+
@_transparent
10+
public init() {
11+
_value = Builtin.zeroInitializer()
12+
}
13+
}
14+
15+
@frozen
16+
public struct TestFloat {
17+
@usableFromInline
18+
var _value : Builtin.FPIEEE32
19+
@_transparent
20+
public init() {
21+
_value = Builtin.zeroInitializer()
22+
}
23+
}
24+
25+
@frozen
26+
public struct TestVector {
27+
@usableFromInline
28+
var _value : Builtin.Vec4xFPIEEE32
29+
@_transparent
30+
public init() {
31+
_value = Builtin.zeroInitializer()
32+
}
33+
}
34+
35+
public struct Foo {
36+
public static var x : TestInt = TestInt()
37+
public static var y : TestFloat = TestFloat()
38+
public static var z : TestVector = TestVector()
39+
}
40+
41+
// CHECK: @"$s8ZeroInit3FooV1xAA7TestIntVvpZ" ={{.*}} global %T8ZeroInit7TestIntV zeroinitializer
42+
// CHECK: @"$s8ZeroInit3FooV1yAA9TestFloatVvpZ" ={{.*}} global %T8ZeroInit9TestFloatV zeroinitializer
43+
// CHECK: @"$s8ZeroInit3FooV1zAA10TestVectorVvpZ" ={{.*}} global %T8ZeroInit10TestVectorV zeroinitializer
44+
// CHECK-NOT: swift_once

0 commit comments

Comments
 (0)