Skip to content

Commit e4679cb

Browse files
Merge pull request #15397 from aschwaighofer/irgen_fix_mem_attr_witness_table_accessor_conditional_conformance
IRGen: Fix witness-table accessors for conditional conformances
2 parents ce0ef07 + 30da035 commit e4679cb

File tree

2 files changed

+6
-3
lines changed

2 files changed

+6
-3
lines changed

lib/IRGen/GenProto.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1039,6 +1039,7 @@ static llvm::Value *emitWitnessTableAccessorCall(
10391039
// If the conformance is generic, the accessor takes the metatype plus
10401040
// possible conditional conformances arguments.
10411041
llvm::CallInst *call;
1042+
bool requiresMemoryArguments = false;
10421043
if (conformance->witnessTableAccessorRequiresArguments()) {
10431044
// Emit the source metadata if we haven't yet.
10441045
if (!*srcMetadataCache) {
@@ -1051,13 +1052,14 @@ static llvm::Value *emitWitnessTableAccessorCall(
10511052

10521053
call = IGF.Builder.CreateCall(accessor,
10531054
{*srcMetadataCache, conditionalTables});
1054-
1055+
requiresMemoryArguments = true;
10551056
} else {
10561057
call = IGF.Builder.CreateCall(accessor, {});
10571058
}
10581059

10591060
call->setCallingConv(IGF.IGM.DefaultCC);
1060-
call->setDoesNotAccessMemory();
1061+
if (!requiresMemoryArguments)
1062+
call->setDoesNotAccessMemory();
10611063
call->setDoesNotThrow();
10621064

10631065
return call;

test/Inputs/conditional_conformance_basic_conformances.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public func single_concrete() {
9999
// CHECK-NEXT: [[A_P2_PTR:%.*]] = getelementptr inbounds i8**, i8*** [[CONDITIONAL_REQUIREMENTS]], i32 0
100100
// CHECK-NEXT: store i8** getelementptr inbounds ([1 x i8*], [1 x i8*]* @"$S42conditional_conformance_basic_conformances4IsP2VAA0F0AAWP", i32 0, i32 0), i8*** [[A_P2_PTR]], align 8
101101

102-
// CHECK-NEXT: [[Single_P1:%.*]] = call i8** @"$S42conditional_conformance_basic_conformances6SingleVyxGAA2P1A2A2P2RzlWa"(%swift.type* [[Single_TYPE]], i8*** [[CONDITIONAL_REQUIREMENTS]])
102+
// CHECK-NEXT: [[Single_P1:%.*]] = call i8** @"$S42conditional_conformance_basic_conformances6SingleVyxGAA2P1A2A2P2RzlWa"(%swift.type* [[Single_TYPE]], i8*** [[CONDITIONAL_REQUIREMENTS]]) [[ATTRS:#[0-9]+]]
103103
// CHECK-NEXT: store atomic i8** [[Single_P1]], i8*** @"$S42conditional_conformance_basic_conformances6SingleVyAA4IsP2VGACyxGAA2P1A2A0G0RzlWL" release, align 8
104104
// CHECK-NEXT: br label %cont
105105

@@ -304,3 +304,4 @@ protocol P5 {}
304304
struct SR7101<T> {}
305305
extension SR7101 : P5 where T == P4Typealias {}
306306

307+
// CHECK: attributes [[ATTRS]] = { nounwind }

0 commit comments

Comments
 (0)