Merge pull request #15454 from aschwaighofer/irgen_fix_mem_attr_witness_table_accessor_conditional_conformance_4.1
[4.1] IRGen: Fix witness-table accessors for conditional conformances
diff --git a/lib/IRGen/GenProto.cpp b/lib/IRGen/GenProto.cpp
index 902bcc7..49012e0 100644
--- a/lib/IRGen/GenProto.cpp
+++ b/lib/IRGen/GenProto.cpp
@@ -1064,6 +1064,7 @@
// If the conformance is generic, the accessor takes the metatype plus
// possible conditional conformances arguments.
llvm::CallInst *call;
+ bool requiresMemoryArguments = false;
if (conformance->witnessTableAccessorRequiresArguments()) {
// Emit the source metadata if we haven't yet.
if (!*srcMetadataCache) {
@@ -1076,13 +1077,14 @@
call = IGF.Builder.CreateCall(
accessor, {*srcMetadataCache, conditionalTables, numConditionalTables});
-
+ requiresMemoryArguments = true;
} else {
call = IGF.Builder.CreateCall(accessor, {});
}
call->setCallingConv(IGF.IGM.DefaultCC);
- call->setDoesNotAccessMemory();
+ if (!requiresMemoryArguments)
+ call->setDoesNotAccessMemory();
call->setDoesNotThrow();
return call;
diff --git a/test/Inputs/conditional_conformance_basic_conformances.swift b/test/Inputs/conditional_conformance_basic_conformances.swift
index 58f355e..748f547 100644
--- a/test/Inputs/conditional_conformance_basic_conformances.swift
+++ b/test/Inputs/conditional_conformance_basic_conformances.swift
@@ -102,7 +102,7 @@
// CHECK-NEXT: [[A_P2_PTR:%.*]] = getelementptr inbounds i8**, i8*** [[CONDITIONAL_REQUIREMENTS]], i32 0
// CHECK-NEXT: store i8** getelementptr inbounds ([0 x i8*], [0 x i8*]* @_T042conditional_conformance_basic_conformances4IsP2VAA0F0AAWP, i32 0, i32 0), i8*** [[A_P2_PTR]], align 8
-// CHECK-NEXT: [[Single_P1:%.*]] = call i8** @_T042conditional_conformance_basic_conformances6SingleVyxGAA2P1A2A2P2RzlWa(%swift.type* [[Single_TYPE]], i8*** [[CONDITIONAL_REQUIREMENTS]], i64 1)
+// CHECK-NEXT: [[Single_P1:%.*]] = call i8** @_T042conditional_conformance_basic_conformances6SingleVyxGAA2P1A2A2P2RzlWa(%swift.type* [[Single_TYPE]], i8*** [[CONDITIONAL_REQUIREMENTS]], i64 1) [[ATTRS:#[0-9]+]]
// CHECK-NEXT: store atomic i8** [[Single_P1]], i8*** @_T042conditional_conformance_basic_conformances6SingleVyAA4IsP2VGACyxGAA2P1A2A0G0RzlWL release, align 8
// CHECK-NEXT: br label %cont
@@ -323,3 +323,5 @@
func dynamicCastToP1(_ value: Any) -> P1? {
return value as? P1
}
+
+// CHECK: attributes [[ATTRS]] = { nounwind }