diff options
| author | Akira Hatanaka <ahatanaka@apple.com> | 2018-03-20 01:47:58 +0000 |
|---|---|---|
| committer | Akira Hatanaka <ahatanaka@apple.com> | 2018-03-20 01:47:58 +0000 |
| commit | 797afe3a4ed475d26786a31ede9ac6a9e790608d (patch) | |
| tree | 4f2914b8f20f3294ead7d5335e2af0e2b2aed277 /clang/test | |
| parent | cbd498ac10427778a6133b9dc3a78c3a5e9ec6cd (diff) | |
| download | bcm5719-llvm-797afe3a4ed475d26786a31ede9ac6a9e790608d.tar.gz bcm5719-llvm-797afe3a4ed475d26786a31ede9ac6a9e790608d.zip | |
[CodeGen] Ignore OpaqueValueExprs that are unique references to their
source expressions when iterating over a PseudoObjectExpr's semantic
subexpression list.
Previously the loop in emitPseudoObjectExpr would emit the IR for each
OpaqueValueExpr that was in a PseudoObjectExpr's semantic-form
expression list and use the result when the OpaqueValueExpr later
appeared in other expressions. This caused an assertion failure when
AggExprEmitter tried to copy the result of an OpaqueValueExpr and the
copied type didn't have trivial copy/move constructors or assignment
operators.
This patch adds flag IsUnique to OpaqueValueExpr which indicates it is a
unique reference to its source expression (it is not used in multiple
places). The loop in emitPseudoObjectExpr ignores OpaqueValueExprs that
are unique and CodeGen visitors simply traverse the source expressions
of such OpaqueValueExprs.
rdar://problem/34363596
Differential Revision: https://reviews.llvm.org/D39562
llvm-svn: 327939
Diffstat (limited to 'clang/test')
| -rw-r--r-- | clang/test/CodeGenCXX/ms-property.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CodeGenObjC/objc-container-subscripting-1.m | 8 | ||||
| -rw-r--r-- | clang/test/CodeGenObjCXX/property-dot-copy-elision.mm | 39 | ||||
| -rw-r--r-- | clang/test/CodeGenObjCXX/property-objects.mm | 8 |
4 files changed, 48 insertions, 9 deletions
diff --git a/clang/test/CodeGenCXX/ms-property.cpp b/clang/test/CodeGenCXX/ms-property.cpp index 88a906d5fcd..4f01528dda8 100644 --- a/clang/test/CodeGenCXX/ms-property.cpp +++ b/clang/test/CodeGenCXX/ms-property.cpp @@ -75,11 +75,11 @@ int main(int argc, char **argv) { // CHECK: call void @"??$foo@H@@YAXHH@Z"(i32 %{{.+}}, i32 %{{.+}}) foo(argc, (int)argv[0][0]); // CHECK: [[P2:%.+]] = load %class.St*, %class.St** % - // CHECK: [[T_X:%.+]] = call i32 @"?get_x@Test1@@QEBAHXZ"(%class.Test1* %{{.+}}) // CHECK: [[P1:%.+]] = load %class.S*, %class.S** % // CHECK: [[P1_X_22_33:%.+]] = call i32 @"?GetX@S@@QEAAHHH@Z"(%class.S* [[P1]], i32 22, i32 33) // CHECK: [[CAST:%.+]] = sitofp i32 [[P1_X_22_33]] to double // CHECK: [[ARGC:%.+]] = load i32, i32* % + // CHECK: [[T_X:%.+]] = call i32 @"?get_x@Test1@@QEBAHXZ"(%class.Test1* %{{.+}}) // CHECK: [[CAST2:%.+]] = trunc i32 [[T_X]] to i8 // CHECK: call void @"?PutY@?$St@M@@QEAAXDHN@Z"(%class.St* [[P2]], i8 [[CAST2]], i32 [[ARGC]], double [[CAST]]) p2->y[t.X][argc] = p1->x[22][33]; diff --git a/clang/test/CodeGenObjC/objc-container-subscripting-1.m b/clang/test/CodeGenObjC/objc-container-subscripting-1.m index f9322fa63c1..18f2f8cf6ff 100644 --- a/clang/test/CodeGenObjC/objc-container-subscripting-1.m +++ b/clang/test/CodeGenObjC/objc-container-subscripting-1.m @@ -25,8 +25,8 @@ int main() { // CHECK-NEXT: store i8* [[CALL]], i8** [[OLDOBJ:%.*]], align 8 val = (array[10] = oldObject); -// CHECK: [[THREE:%.*]] = load {{%.*}} [[array:%.*]], align 8 -// CHECK-NEXT: [[FOUR:%.*]] = load i8*, i8** [[oldObject:%.*]], align 8 +// CHECK: [[FOUR:%.*]] = load i8*, i8** [[oldObject:%.*]], align 8 +// CHECK-NEXT: [[THREE:%.*]] = load {{%.*}} [[array:%.*]], align 8 // CHECK-NEXT: [[FIVE:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.2 // CHECK-NEXT: [[SIX:%.*]] = bitcast {{%.*}} [[THREE]] to i8* // CHECK-NEXT: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i32)*)(i8* [[SIX]], i8* [[FIVE]], i8* [[FOUR]], i32 10) @@ -45,9 +45,9 @@ int main() { val = (dictionary[key] = newObject); -// CHECK: [[TWELVE:%.*]] = load {{%.*}} [[DICTIONARY]], align 8 +// CHECK: [[FOURTEEN:%.*]] = load i8*, i8** [[NEWOBJECT:%.*]], align 8 +// CHECK-NEXT: [[TWELVE:%.*]] = load {{%.*}} [[DICTIONARY]], align 8 // CHECK-NEXT: [[THIRTEEN:%.*]] = load i8*, i8** [[KEY]], align 8 -// CHECK-NEXT: [[FOURTEEN:%.*]] = load i8*, i8** [[NEWOBJECT:%.*]], align 8 // CHECK-NEXT: [[SIXTEEN:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_.6 // CHECK-NEXT: [[SEVENTEEN:%.*]] = bitcast {{%.*}} [[TWELVE]] to i8* // CHECK-NEXT: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, i8*, i8*)*)(i8* [[SEVENTEEN]], i8* [[SIXTEEN]], i8* [[FOURTEEN]], i8* [[THIRTEEN]]) diff --git a/clang/test/CodeGenObjCXX/property-dot-copy-elision.mm b/clang/test/CodeGenObjCXX/property-dot-copy-elision.mm new file mode 100644 index 00000000000..0932ceecd7b --- /dev/null +++ b/clang/test/CodeGenObjCXX/property-dot-copy-elision.mm @@ -0,0 +1,39 @@ +// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -std=c++1z -fobjc-arc -o - %s | FileCheck %s + +struct S0 { + id f; +}; + +struct S1 { + S1(); + S1(S0); + id f; +}; + +@interface C +@property S1 f; +@end +@implementation C +@end + +// CHECK-LABEL: define void @_Z5test0P1C( +// CHECK: %{{.*}} = alloca % +// CHECK: %[[AGG_TMP:.*]] = alloca %[[STRUCT_S1:.*]], align +// CHECK: %[[AGG_TMP_1:.*]] = alloca %[[STRUCT_S0:.*]], align +// CHECK: call void @_ZN2S0C1Ev(%[[STRUCT_S0]]* %[[AGG_TMP_1]]) +// CHECK: call void @_ZN2S1C1E2S0(%[[STRUCT_S1]]* %[[AGG_TMP]], %[[STRUCT_S0]]* %[[AGG_TMP_1]]) +// CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %[[STRUCT_S1]]*)*)(i8* %{{.*}}, i8* %{{.*}}, %[[STRUCT_S1]]* %[[AGG_TMP]]) + +void test0(C *c) { + c.f = S0(); +} + +// CHECK: define void @_Z5test1P1C( +// CHECK: %{{.*}} = alloca % +// CHECK: %[[TEMP_LVALUE:.*]] = alloca %[[STRUCT_S1:.*]], align +// CHECK: call void @_ZN2S1C1Ev(%[[STRUCT_S1]]* %[[TEMP_LVALUE]]) +// CHECK: call void bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to void (i8*, i8*, %[[STRUCT_S1]]*)*)(i8* %{{.*}}, i8* %{{.*}}, %[[STRUCT_S1]]* %[[TEMP_LVALUE]]) + +void test1(C *c) { + c.f = S1(); +} diff --git a/clang/test/CodeGenObjCXX/property-objects.mm b/clang/test/CodeGenObjCXX/property-objects.mm index 8e0b6aebe14..62188e8bb23 100644 --- a/clang/test/CodeGenObjCXX/property-objects.mm +++ b/clang/test/CodeGenObjCXX/property-objects.mm @@ -119,11 +119,11 @@ void testB1(B *b) { // CHECK: define void @_Z6testB0P1B([[B:%.*]]* // CHECK: [[BVAR:%.*]] = alloca [[B]]*, align 8 // CHECK: [[TEMP:%.*]] = alloca [[B0:%.*]], align 8 -// CHECK: load [[B]]*, [[B]]** [[BVAR]] -// CHECK-NEXT: [[X:%.*]] = getelementptr inbounds [[B0]], [[B0]]* [[TEMP]], i32 0, i32 0 +// CHECK: [[X:%.*]] = getelementptr inbounds [[B0]], [[B0]]* [[TEMP]], i32 0, i32 0 // CHECK-NEXT: [[T0:%.*]] = call i32 @_Z9b_makeIntv() // CHECK-NEXT: [[T1:%.*]] = sext i32 [[T0]] to i64 // CHECK-NEXT: store i64 [[T1]], i64* [[X]], align 8 +// CHECK: load [[B]]*, [[B]]** [[BVAR]] // CHECK-NOT: call // CHECK: call void @llvm.memcpy // CHECK-NOT: call @@ -161,12 +161,12 @@ void testB2(B *b) { // CHECK: define void @_Z6testB2P1B([[B]]* // CHECK: [[BVAR:%.*]] = alloca [[B]]*, align 8 -// CHECK: load [[B]]*, [[B]]** [[BVAR]] -// CHECK-NOT: call +// CHECK: call void @llvm.dbg.declare( // CHECK: call void @_ZN2B3C1Ev( // CHECK-NEXT: [[T0:%.*]] = call i64 @_ZN2B3cv2B1Ev( // CHECK-NOT: call // CHECK: store i64 [[T0]], +// CHECK: load [[B]]*, [[B]]** [[BVAR]] // CHECK-NOT: call // CHECK: call void @llvm.memcpy // CHECK-NOT: call |

