Skip to content

IRGen: Value witness functions don't need shared linkage #20492

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 10, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 6 additions & 21 deletions lib/IRGen/Linking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -337,24 +337,6 @@ std::string LinkEntity::mangleAsString() const {
llvm_unreachable("bad entity kind!");
}

/// Get SIL-linkage for something that's not required to be visible
/// and doesn't actually need to be uniqued.
static SILLinkage getNonUniqueSILLinkage(FormalLinkage linkage,
ForDefinition_t forDefinition) {
switch (linkage) {
case FormalLinkage::PublicUnique:
case FormalLinkage::PublicNonUnique:
return (forDefinition ? SILLinkage::Shared : SILLinkage::PublicExternal);

case FormalLinkage::HiddenUnique:
return (forDefinition ? SILLinkage::Shared : SILLinkage::HiddenExternal);

case FormalLinkage::Private:
return SILLinkage::Private;
}
llvm_unreachable("bad formal linkage");
}

SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const {
// For when `this` is a protocol conformance of some kind.
auto getLinkageAsConformance = [&] {
Expand Down Expand Up @@ -446,9 +428,12 @@ SILLinkage LinkEntity::getLinkage(ForDefinition_t forDefinition) const {
llvm_unreachable("bad kind");

// ...but we don't actually expose individual value witnesses (right now).
case Kind::ValueWitness:
return getNonUniqueSILLinkage(getDeclLinkage(getType().getAnyNominal()),
forDefinition);
case Kind::ValueWitness: {
auto *nominal = getType().getAnyNominal();
if (getDeclLinkage(nominal) == FormalLinkage::PublicNonUnique)
return SILLinkage::Shared;
return forDefinition ? SILLinkage::Private : SILLinkage::PrivateExternal;
}

// Foreign type metadata candidates are always shared; the runtime
// does the uniquing.
Expand Down
2 changes: 1 addition & 1 deletion test/DebugInfo/LoadableByAddress-allockstack.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,4 @@ struct h<i>{
}
}

// CHECK: define linkonce_odr hidden %swift.opaque* @"$s4main1mVwCP"
// CHECK: define internal %swift.opaque* @"$s4main1mVwCP"
2 changes: 1 addition & 1 deletion test/IRGen/big_types_corner_cases_as_library.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public struct BigStruct {
var i8 : Int32 = 8
}

// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden %swift.opaque* @"$s33big_types_corner_cases_as_library9BigStructVwCP"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal %swift.opaque* @"$s33big_types_corner_cases_as_library9BigStructVwCP"
// CHECK: [[RETVAL:%.*]] = bitcast %T33big_types_corner_cases_as_library9BigStructV* {{.*}} to %swift.opaque*
// CHECK: ret %swift.opaque* [[RETVAL]]
let bigStructGlobalArray : [BigStruct] = [
Expand Down
6 changes: 3 additions & 3 deletions test/IRGen/enum.sil
Original file line number Diff line number Diff line change
Expand Up @@ -2688,7 +2688,7 @@ entry(%x : $*MyOptional):
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds i8*, i8** [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSinglePayload(%swift.type* [[METADATA]], [[WORD]] 0, i8** [[T_LAYOUT]], i32 3)

// CHECK-64-LABEL: define linkonce_odr hidden void @"$s4enum17StructWithWeakVarVwxs"(%swift.opaque* noalias %dest, i32 %index, %swift.type* %StructWithWeakVar)
// CHECK-64-LABEL: define internal void @"$s4enum17StructWithWeakVarVwxs"(%swift.opaque* noalias %dest, i32 %index, %swift.type* %StructWithWeakVar)
// -- TODO: some pointless masking here.
// -- TODO: should use EnumPayload word-chunking.
// CHECK-64: %1 = zext i32 %index to i128
Expand All @@ -2701,7 +2701,7 @@ entry(%x : $*MyOptional):
// -- 0x1__0000_0000_0000_0000
// CHECK-64: %6 = or i128 %5, 18446744073709551616

// CHECK-LABEL: define linkonce_odr hidden i32 @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwug"(%swift.opaque* noalias %value
// CHECK-LABEL: define internal i32 @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwug"(%swift.opaque* noalias %value
// CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value to %T4enum40MultiPayloadLessThan32BitsWithEmptyCasesO*
// CHECK: [[VAL01:%.*]] = bitcast %T4enum40MultiPayloadLessThan32BitsWithEmptyCasesO* [[VAL00]] to i8*
// CHECK: [[VAL02:%.*]] = load {{.*}} [[VAL01]]
Expand All @@ -2716,7 +2716,7 @@ entry(%x : $*MyOptional):
// CHECK: [[VAL11:%.*]] = select i1 [[VAL10]], i32 [[VAL09]], i32 [[VAL06]]
// CHECK: ret i32 [[VAL11]]

// CHECK-LABEL: define linkonce_odr hidden void @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwui"(%swift.opaque* noalias %value, i32 %tag
// CHECK-LABEL: define internal void @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwui"(%swift.opaque* noalias %value, i32 %tag
// CHECK: entry:
// CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value
// CHECK: [[VAL01:%.*]] = icmp uge i32 %tag, 2
Expand Down
2 changes: 1 addition & 1 deletion test/IRGen/enum_objc.sil
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,4 @@ x:
}

// Weak existentials allow extra inhabitants if not @objc, therefore StructWithWeakVar must emit:
// CHECK: define linkonce_odr hidden void @"$s9enum_objc17StructWithWeakVarVwxs"
// CHECK: define internal void @"$s9enum_objc17StructWithWeakVarVwxs"
62 changes: 31 additions & 31 deletions test/IRGen/enum_value_semantics.sil
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- NoPayload getExtraInhabitants
// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics9NoPayloadOwxg"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics9NoPayloadOwxg"
// CHECK: [[VALUE:%.*]] = load i8, i8* {{%.*}}, align 1
// CHECK-NEXT: [[ZEXT:%.*]] = zext i8 [[VALUE]] to i32
// CHECK-NEXT: [[SUB:%.*]] = sub i32 [[ZEXT]], 3
Expand All @@ -208,7 +208,7 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- NoPayload getEnumTag
// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics9NoPayloadOwug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics9NoPayloadOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics9NoPayloadO*
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics9NoPayloadO, %T20enum_value_semantics9NoPayloadO* [[SELF]], i32 0, i32 0
// CHECK-NEXT: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]], align 1
Expand All @@ -217,12 +217,12 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- NoPayload destructiveProjectEnumData
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics9NoPayloadOwup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics9NoPayloadOwup"
// CHECK: ret void


// -- NoPayload destructiveInjectEnumTag
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics9NoPayloadOwui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics9NoPayloadOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics9NoPayloadO*
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics9NoPayloadO, %T20enum_value_semantics9NoPayloadO* [[SELF]], i32 0, i32 0
Expand All @@ -236,32 +236,32 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- SingletonPayload getEnumTag
// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics16SingletonPayloadOwug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics16SingletonPayloadOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics16SingletonPayloadO*
// CHECK-NEXT: ret i32 0


// -- SingletonPayload destructiveProjectEnumData
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics16SingletonPayloadOwup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics16SingletonPayloadOwup"
// CHECK: ret void


// -- SingletonPayload destructiveInjectEnumTag
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics16SingletonPayloadOwui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics16SingletonPayloadOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics16SingletonPayloadO*
// CHECK-NEXT: ret void


// -- SinglePayloadTrivial getEnumTag
// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics20SinglePayloadTrivialOwug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics20SinglePayloadTrivialOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics20SinglePayloadTrivialO*
// CHECK: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
// CHECK: [[TAG:%.*]] = call i32 %getEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 3, %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* @"$sBi64_N", i32 0, i32 1))
// CHECK: ret i32 [[TAG]]


// -- SinglePayloadTrivial destructiveProjectEnumData
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics20SinglePayloadTrivialOwup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics20SinglePayloadTrivialOwup"
// CHECK: ret void


Expand All @@ -271,15 +271,15 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- SinglePayloadTrivial destructiveInjectEnumTag
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics20SinglePayloadTrivialOwui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics20SinglePayloadTrivialOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics20SinglePayloadTrivialO*
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 %tag, i32 3, %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* @"$sBi64_N", i32 0, i32 1))
// CHECK-NEXT: ret void


// -- SinglePayloadNontrivial destroyBuffer
// CHECK: define linkonce_odr hidden void @"$s20enum_value_semantics23SinglePayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %SinglePayloadNontrivial) {{.*}} {
// CHECK: define internal void @"$s20enum_value_semantics23SinglePayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %SinglePayloadNontrivial) {{.*}} {
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T20enum_value_semantics23SinglePayloadNontrivialO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics23SinglePayloadNontrivialO* [[ADDR]] to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
Expand Down Expand Up @@ -309,7 +309,7 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- MultiPayloadTrivial getEnumTag
// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics19MultiPayloadTrivialOwug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics19MultiPayloadTrivialOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadTrivialO*
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics19MultiPayloadTrivialO* [[SELF]] to i64*

Expand All @@ -334,12 +334,12 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret i32 [[TAG]]

// -- MultiPayloadTrivial destructiveProjectEnumData
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics19MultiPayloadTrivialOwup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics19MultiPayloadTrivialOwup"
// CHECK: ret void


// -- MultiPayloadTrivial destructiveInjectEnumTag
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics19MultiPayloadTrivialOwui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics19MultiPayloadTrivialOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadTrivialO*
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 2
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
Expand Down Expand Up @@ -379,7 +379,7 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- MultiPayloadNoEmptyCases getEnumTag
// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics24MultiPayloadNoEmptyCasesO*
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics24MultiPayloadNoEmptyCasesO* [[SELF]] to i64*
// CHECK-NEXT: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, i64* [[PAYLOAD]], align 8
Expand All @@ -393,12 +393,12 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret i32 [[EXTRA_TAG]]

// -- MultiPayloadNoEmptyCases destructiveProjectEnumData
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwup"
// CHECK: ret void


// -- MultiPayloadNoEmptyCases destructiveInjectEnumTag
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics24MultiPayloadNoEmptyCasesO*
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i1

Expand All @@ -415,7 +415,7 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- MultiPayloadEmptyPayload getEnumTag
// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics017MultiPayloadEmptyE0Owug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics017MultiPayloadEmptyE0Owug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics017MultiPayloadEmptyE0O*

// -- Load the tag from the extra tag area
Expand All @@ -426,12 +426,12 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- MultiPayloadEmptyPayload destructiveProjectEnumData
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics017MultiPayloadEmptyE0Owup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics017MultiPayloadEmptyE0Owup"
// CHECK: ret void


// -- MultiPayloadEmptyPayload destructiveInjectEnumTag
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics017MultiPayloadEmptyE0Owui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics017MultiPayloadEmptyE0Owui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics017MultiPayloadEmptyE0O*

// -- Store the tag in the extra tag area
Expand All @@ -447,7 +447,7 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- MultiPayloadNontrivial destroyBuffer
// CHECK: define linkonce_odr hidden void @"$s20enum_value_semantics22MultiPayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivial)
// CHECK: define internal void @"$s20enum_value_semantics22MultiPayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivial)
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T20enum_value_semantics22MultiPayloadNontrivialO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics22MultiPayloadNontrivialO* [[ADDR]] to { i64, i64 }*
// CHECK-NEXT: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
Expand All @@ -466,18 +466,18 @@ bb0(%0 : $SinglePayloadNontrivial):
//


// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics19MultiPayloadGenericOwug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics19MultiPayloadGenericOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadGenericO*
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
// CHECK-NEXT: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>")
// CHECK-NEXT: ret i32 [[TAG]]


// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics19MultiPayloadGenericOwup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics19MultiPayloadGenericOwup"
// CHECK: ret void


// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics19MultiPayloadGenericOwui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics19MultiPayloadGenericOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadGenericO*
// CHECK: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
// CHECK-NEXT: call void @swift_storeEnumTagMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>", i32 %tag)
Expand All @@ -490,7 +490,7 @@ bb0(%0 : $SinglePayloadNontrivial):


// -- MultiPayloadNontrivialSpareBits destroyBuffer
// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwxx"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwxx"
// CHECK-SAME: (%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivialSpareBits) {{.*}} {
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO* [[ADDR]] to { i64, i64 }*
Expand All @@ -502,7 +502,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret void


// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO*

// -- Load the payload
Expand All @@ -529,7 +529,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[TAG:%.*]] = select i1 [[IS_PAYLOAD]], i32 [[NO_PAYLOAD_TAG2]], i32 [[SPARE_TAG]]
// CHECK-NEXT: ret i32 [[TAG]]

// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwup"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to { i64, i64 }*

// -- Load the payload
Expand All @@ -550,7 +550,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret void


// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO*
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 3
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
Expand Down Expand Up @@ -609,7 +609,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret void


// CHECK-LABEL: define linkonce_odr hidden i32 @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owug"
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O*

// -- Load the payload
Expand All @@ -634,7 +634,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret i32 [[RESULT]]


// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owup"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owup"
// CHECK: [[PAYLOAD_ADDR:%.*]] = bitcast %swift.opaque* %value to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// -- 0x7fffffffffffffff
Expand All @@ -644,7 +644,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret void


// CHECK-LABEL: define linkonce_odr hidden void @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owui"
// CHECK-LABEL: define internal void @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O*
// CHECK-NEXT: [[SPARE_TAG_TMP3:%.*]] = and i32 %tag, 1

Expand Down
Loading