Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
clang/test/CodeGenCXX/partial-destruction.cpp
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | namespace test0 { | ||||
// Partial destroy for initialization. | // Partial destroy for initialization. | ||||
// CHECK: landingpad { ptr, i32 } | // CHECK: landingpad { ptr, i32 } | ||||
// CHECK-NEXT: cleanup | // CHECK-NEXT: cleanup | ||||
// CHECK: [[PARTIAL_END:%.*]] = load ptr, ptr [[ENDVAR]] | // CHECK: [[PARTIAL_END:%.*]] = load ptr, ptr [[ENDVAR]] | ||||
// CHECK-NEXT: [[T0:%.*]] = icmp eq ptr [[E_BEGIN]], [[PARTIAL_END]] | // CHECK-NEXT: [[T0:%.*]] = icmp eq ptr [[E_BEGIN]], [[PARTIAL_END]] | ||||
// CHECK-NEXT: br i1 [[T0]], | // CHECK-NEXT: br i1 [[T0]], | ||||
// CHECK: [[E_AFTER:%.*]] = phi ptr [ [[PARTIAL_END]], {{%.*}} ], [ [[E_CUR:%.*]], {{%.*}} ] | // CHECK: [[E_AFTER:%.*]] = phi ptr [ [[PARTIAL_END]], {{%.*}} ], [ [[E_CUR:%.*]], {{%.*}} ] | ||||
// CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]], ptr [[E_AFTER]], i64 -1 | // CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]], ptr [[E_AFTER]], i64 -1 | ||||
// CHECKv03-NEXT: invoke void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | // CHECKv03-NEXT: call unwindabort void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | ||||
// CHECKv11-NEXT: call void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | // CHECKv11-NEXT: call void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | ||||
// CHECK: [[T0:%.*]] = icmp eq ptr [[E_CUR]], [[E_BEGIN]] | // CHECK: [[T0:%.*]] = icmp eq ptr [[E_CUR]], [[E_BEGIN]] | ||||
// CHECK-NEXT: br i1 [[T0]], | // CHECK-NEXT: br i1 [[T0]], | ||||
// Primary EH destructor. | // Primary EH destructor. | ||||
// CHECK: landingpad { ptr, i32 } | // CHECK: landingpad { ptr, i32 } | ||||
// CHECK-NEXT: cleanup | // CHECK-NEXT: cleanup | ||||
// CHECK: [[E0:%.*]] = getelementptr inbounds [10 x [[A]]], ptr [[AS]], i32 0, i32 0 | // CHECK: [[E0:%.*]] = getelementptr inbounds [10 x [[A]]], ptr [[AS]], i32 0, i32 0 | ||||
// CHECK-NEXT: [[E_END:%.*]] = getelementptr inbounds [[A]], ptr [[E0]], i64 10 | // CHECK-NEXT: [[E_END:%.*]] = getelementptr inbounds [[A]], ptr [[E0]], i64 10 | ||||
// CHECK-NEXT: br label | // CHECK-NEXT: br label | ||||
// Partial destructor for primary normal destructor. | // Partial destructor for primary normal destructor. | ||||
// FIXME: There's some really bad block ordering here which causes | // FIXME: There's some really bad block ordering here which causes | ||||
// the partial destroy for the primary normal destructor to fall | // the partial destroy for the primary normal destructor to fall | ||||
// within the primary EH destructor. | // within the primary EH destructor. | ||||
// CHECKv03: landingpad { ptr, i32 } | // CHECKv03: landingpad { ptr, i32 } | ||||
// CHECKv03-NEXT: cleanup | // CHECKv03-NEXT: cleanup | ||||
// CHECKv03: [[T0:%.*]] = icmp eq ptr [[ED_BEGIN]], [[ED_CUR]] | // CHECKv03: [[T0:%.*]] = icmp eq ptr [[ED_BEGIN]], [[ED_CUR]] | ||||
// CHECKv03-NEXT: br i1 [[T0]] | // CHECKv03-NEXT: br i1 [[T0]] | ||||
// CHECKv03: [[EDD_AFTER:%.*]] = phi ptr [ [[ED_CUR]], {{%.*}} ], [ [[EDD_CUR:%.*]], {{%.*}} ] | // CHECKv03: [[EDD_AFTER:%.*]] = phi ptr [ [[ED_CUR]], {{%.*}} ], [ [[EDD_CUR:%.*]], {{%.*}} ] | ||||
// CHECKv03-NEXT: [[EDD_CUR]] = getelementptr inbounds [[A]], ptr [[EDD_AFTER]], i64 -1 | // CHECKv03-NEXT: [[EDD_CUR]] = getelementptr inbounds [[A]], ptr [[EDD_AFTER]], i64 -1 | ||||
// CHECKv03-NEXT: invoke void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[EDD_CUR]]) | // CHECKv03-NEXT: call unwindabort void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[EDD_CUR]]) | ||||
// CHECKv03: [[T0:%.*]] = icmp eq ptr [[EDD_CUR]], [[ED_BEGIN]] | // CHECKv03: [[T0:%.*]] = icmp eq ptr [[EDD_CUR]], [[ED_BEGIN]] | ||||
// CHECKv03-NEXT: br i1 [[T0]] | // CHECKv03-NEXT: br i1 [[T0]] | ||||
// Back to the primary EH destructor. | // Back to the primary EH destructor. | ||||
// CHECK: [[E_AFTER:%.*]] = phi ptr [ [[E_END]], {{%.*}} ], [ [[E_CUR:%.*]], {{%.*}} ] | // CHECK: [[E_AFTER:%.*]] = phi ptr [ [[E_END]], {{%.*}} ], [ [[E_CUR:%.*]], {{%.*}} ] | ||||
// CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]], ptr [[E_AFTER]], i64 -1 | // CHECK-NEXT: [[E_CUR]] = getelementptr inbounds [[A]], ptr [[E_AFTER]], i64 -1 | ||||
// CHECKv03-NEXT: invoke void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | // CHECKv03-NEXT: call unwindabort void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | ||||
// CHECKv11-NEXT: call void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | // CHECKv11-NEXT: call void @_ZN5test01AD1Ev(ptr {{[^,]*}} [[E_CUR]]) | ||||
// CHECK: [[T0:%.*]] = icmp eq ptr [[E_CUR]], [[E0]] | // CHECK: [[T0:%.*]] = icmp eq ptr [[E_CUR]], [[E0]] | ||||
// CHECK-NEXT: br i1 [[T0]], | // CHECK-NEXT: br i1 [[T0]], | ||||
} | } | ||||
namespace test1 { | namespace test1 { | ||||
struct A { A(); A(int); ~A(); }; | struct A { A(); A(int); ~A(); }; | ||||
Show All 18 Lines | namespace test1 { | ||||
// CHECK-NEXT: call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[V]]) | // CHECK-NEXT: call void @_ZN5test11BD1Ev(ptr {{[^,]*}} [[V]]) | ||||
// CHECK-NEXT: ret void | // CHECK-NEXT: ret void | ||||
// FIXME: again, the block ordering is pretty bad here | // FIXME: again, the block ordering is pretty bad here | ||||
// CHECK: landingpad { ptr, i32 } | // CHECK: landingpad { ptr, i32 } | ||||
// CHECK-NEXT: cleanup | // CHECK-NEXT: cleanup | ||||
// CHECK: landingpad { ptr, i32 } | // CHECK: landingpad { ptr, i32 } | ||||
// CHECK-NEXT: cleanup | // CHECK-NEXT: cleanup | ||||
// CHECKv03: invoke void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[Y]]) | // CHECKv03: call unwindabort void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[Y]]) | ||||
// CHECKv03: invoke void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[X]]) | // CHECKv03: call unwindabort void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[X]]) | ||||
// CHECKv11: call void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[Y]]) | // CHECKv11: call void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[Y]]) | ||||
// CHECKv11: call void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[X]]) | // CHECKv11: call void @_ZN5test11AD1Ev(ptr {{[^,]*}} [[X]]) | ||||
} | } | ||||
namespace test2 { | namespace test2 { | ||||
struct A { A(); ~A(); }; | struct A { A(); ~A(); }; | ||||
void test() { | void test() { | ||||
Show All 17 Lines | void test() { | ||||
// Partial destruction landing pad. | // Partial destruction landing pad. | ||||
// CHECK: landingpad { ptr, i32 } | // CHECK: landingpad { ptr, i32 } | ||||
// CHECK-NEXT: cleanup | // CHECK-NEXT: cleanup | ||||
// CHECK: [[EMPTY:%.*]] = icmp eq ptr [[BEGIN]], [[CUR]] | // CHECK: [[EMPTY:%.*]] = icmp eq ptr [[BEGIN]], [[CUR]] | ||||
// CHECK-NEXT: br i1 [[EMPTY]], | // CHECK-NEXT: br i1 [[EMPTY]], | ||||
// CHECK: [[PAST:%.*]] = phi ptr [ [[CUR]], {{%.*}} ], [ [[DEL:%.*]], {{%.*}} ] | // CHECK: [[PAST:%.*]] = phi ptr [ [[CUR]], {{%.*}} ], [ [[DEL:%.*]], {{%.*}} ] | ||||
// CHECK-NEXT: [[DEL]] = getelementptr inbounds [[A]], ptr [[PAST]], i64 -1 | // CHECK-NEXT: [[DEL]] = getelementptr inbounds [[A]], ptr [[PAST]], i64 -1 | ||||
// CHECKv03-NEXT: invoke void @_ZN5test21AD1Ev(ptr {{[^,]*}} [[DEL]]) | // CHECKv03-NEXT: call unwindabort void @_ZN5test21AD1Ev(ptr {{[^,]*}} [[DEL]]) | ||||
// CHECKv11-NEXT: call void @_ZN5test21AD1Ev(ptr {{[^,]*}} [[DEL]]) | // CHECKv11-NEXT: call void @_ZN5test21AD1Ev(ptr {{[^,]*}} [[DEL]]) | ||||
// CHECK: [[T0:%.*]] = icmp eq ptr [[DEL]], [[BEGIN]] | // CHECK: [[T0:%.*]] = icmp eq ptr [[DEL]], [[BEGIN]] | ||||
// CHECK-NEXT: br i1 [[T0]], | // CHECK-NEXT: br i1 [[T0]], | ||||
} | } | ||||
} | } | ||||
// PR10351 | // PR10351 | ||||
▲ Show 20 Lines • Show All 43 Lines • Show Last 20 Lines |