@@ -1117,30 +1117,37 @@ X test15(bool b) { // http://wg21.link/p2025r2#ex-15
1117
1117
// CHECK-EH-11-NEXT: entry:
1118
1118
// CHECK-EH-11-NEXT: [[X:%.*]] = alloca [[CLASS_X:%.*]], align 1
1119
1119
// CHECK-EH-11-NEXT: [[AGG_TMP:%.*]] = alloca [[CLASS_X]], align 1
1120
+ // CHECK-EH-11-NEXT: [[REF_TMP:%.*]] = alloca [[CLASS_ANON:%.*]], align 4
1120
1121
// CHECK-EH-11-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[X]], i32 0, i32 0
1121
1122
// CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1122
1123
// CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X]])
1123
- // CHECK-EH-11-NEXT: invoke void @_ZN1XC1ERKS_(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP]], %class.X* noundef nonnull align 1 dereferenceable(1) [[X]])
1124
+ // CHECK-EH-11-NEXT: [[TMP1:%.*]] = bitcast %class.anon* [[REF_TMP]] to i8*
1125
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull [[TMP1]]) #[[ATTR7]]
1126
+ // CHECK-EH-11-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_ANON]], %class.anon* [[REF_TMP]], i32 0, i32 0
1127
+ // CHECK-EH-11-NEXT: store %class.X* [[X]], %class.X** [[TMP2]], align 4, !tbaa [[TBAA3:![0-9]+]]
1128
+ // CHECK-EH-11-NEXT: invoke fastcc void @"_ZZ6test16vENK3$_0clEv"(%class.X* nonnull sret([[CLASS_X]]) align 1 [[AGG_TMP]], %class.anon* noundef nonnull align 4 dereferenceable(4) [[REF_TMP]])
1124
1129
// CHECK-EH-11-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
1125
1130
// CHECK-EH-11: invoke.cont:
1126
1131
// CHECK-EH-11-NEXT: invoke void @_Z8ConsumeX1X(%class.X* noundef nonnull [[AGG_TMP]])
1127
1132
// CHECK-EH-11-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD1:%.*]]
1128
1133
// CHECK-EH-11: invoke.cont2:
1129
1134
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP]]) #[[ATTR7]]
1135
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull [[TMP1]]) #[[ATTR7]]
1130
1136
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X]]) #[[ATTR7]]
1131
1137
// CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1132
1138
// CHECK-EH-11-NEXT: ret void
1133
1139
// CHECK-EH-11: lpad:
1134
- // CHECK-EH-11-NEXT: [[TMP1 :%.*]] = landingpad { i8*, i32 }
1140
+ // CHECK-EH-11-NEXT: [[TMP3 :%.*]] = landingpad { i8*, i32 }
1135
1141
// CHECK-EH-11-NEXT: cleanup
1136
1142
// CHECK-EH-11-NEXT: br label [[EHCLEANUP:%.*]]
1137
1143
// CHECK-EH-11: lpad1:
1138
- // CHECK-EH-11-NEXT: [[TMP2 :%.*]] = landingpad { i8*, i32 }
1144
+ // CHECK-EH-11-NEXT: [[TMP4 :%.*]] = landingpad { i8*, i32 }
1139
1145
// CHECK-EH-11-NEXT: cleanup
1140
1146
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP]]) #[[ATTR7]]
1141
1147
// CHECK-EH-11-NEXT: br label [[EHCLEANUP]]
1142
1148
// CHECK-EH-11: ehcleanup:
1143
- // CHECK-EH-11-NEXT: [[DOTPN:%.*]] = phi { i8*, i32 } [ [[TMP2]], [[LPAD1]] ], [ [[TMP1]], [[LPAD]] ]
1149
+ // CHECK-EH-11-NEXT: [[DOTPN:%.*]] = phi { i8*, i32 } [ [[TMP4]], [[LPAD1]] ], [ [[TMP3]], [[LPAD]] ]
1150
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull [[TMP1]]) #[[ATTR7]]
1144
1151
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X]]) #[[ATTR7]]
1145
1152
// CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1146
1153
// CHECK-EH-11-NEXT: resume { i8*, i32 } [[DOTPN]]
@@ -1505,7 +1512,7 @@ X test18(int i) { // http://wg21.link/p2025r2#ex-11
1505
1512
// CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_RESULT:%.*]])
1506
1513
// CHECK-EH-11-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[L]], i32 0, i32 0
1507
1514
// CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1508
- // CHECK-EH-11-NEXT: invoke void @_ZN1XC1Ev (%class.X* noundef nonnull align 1 dereferenceable(1) [[L]])
1515
+ // CHECK-EH-11-NEXT: invoke fastcc void @"_ZZ6test19vENK3$_1clEv" (%class.X* nonnull sret([[CLASS_X]]) align 1 [[L]])
1509
1516
// CHECK-EH-11-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
1510
1517
// CHECK-EH-11: invoke.cont:
1511
1518
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[L]]) #[[ATTR7]]
@@ -1542,44 +1549,51 @@ X test20() { // http://wg21.link/p2025r2#ex-18
1542
1549
1543
1550
// CHECK-EH-11-LABEL: @_Z17test20instantiatev(
1544
1551
// CHECK-EH-11-NEXT: entry:
1545
- // CHECK-EH-11-NEXT: [[X_I2:%.*]] = alloca [[CLASS_X:%.*]], align 1
1546
- // CHECK-EH-11-NEXT: [[X_I:%.*]] = alloca [[CLASS_X]], align 1
1547
- // CHECK-EH-11-NEXT: [[AGG_TMP_ENSURED:%.*]] = alloca [[CLASS_X]], align 1
1552
+ // CHECK-EH-11-NEXT: [[AGG_TMP_ENSURED:%.*]] = alloca [[CLASS_X:%.*]], align 1
1548
1553
// CHECK-EH-11-NEXT: [[AGG_TMP_ENSURED1:%.*]] = alloca [[CLASS_X]], align 1
1554
+ // CHECK-EH-11-NEXT: call void @_Z6test20ILb1EE1Xv(%class.X* nonnull sret([[CLASS_X]]) align 1 [[AGG_TMP_ENSURED]])
1555
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED]]) #[[ATTR7]]
1556
+ // CHECK-EH-11-NEXT: call void @_Z6test20ILb0EE1Xv(%class.X* nonnull sret([[CLASS_X]]) align 1 [[AGG_TMP_ENSURED1]])
1557
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED1]]) #[[ATTR7]]
1558
+ // CHECK-EH-11-NEXT: ret void
1559
+
1560
+ // CHECK-EH-11: @_Z6test20ILb1EE1Xv
1561
+ // CHECK-EH-11-NEXT: entry:
1562
+ // CHECK-EH-11-NEXT: [[X_I:%.*]] = alloca [[CLASS_X:%.*]], align 1
1549
1563
// CHECK-EH-11-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[X_I]], i32 0, i32 0
1550
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]], !noalias !6
1551
- // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]), !noalias !6
1552
- // CHECK-EH-11-NEXT: invoke void @_ZN1XC1ERKS_(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED]], %class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1553
- // CHECK-EH-11-NEXT: to label [[_Z6TEST20ILB1EE1XV_EXIT:%.*]] unwind label [[LPAD_I:%.*]]
1554
- // CHECK-EH-11: common.resume:
1555
- // CHECK-EH-11-NEXT: [[COMMON_RESUME_OP:%.*]] = phi { i8*, i32 } [ [[TMP1:%.*]], [[LPAD_I]] ], [ [[TMP3:%.*]], [[LPAD_I3:%.*]] ]
1556
- // CHECK-EH-11-NEXT: resume { i8*, i32 } [[COMMON_RESUME_OP]]
1557
- // CHECK-EH-11: lpad.i:
1558
- // CHECK-EH-11-NEXT: [[TMP1]] = landingpad { i8*, i32 }
1564
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1565
+ // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1566
+ // CHECK-EH-11-NEXT: invoke void @_ZN1XC1ERKS_(%class.X* noundef nonnull align 1 dereferenceable(1) %agg.result, %class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1567
+ // CHECK-EH-11-NEXT: to label %[[INVOKE_CONT:.*]] unwind label %[[LPAD:.*]]
1568
+ // CHECK-EH-11: [[INVOKE_CONT]]:
1569
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1570
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1571
+ // CHECK-EH-11-NEXT: ret void
1572
+ // CHECK-EH-11: [[LPAD]]:
1573
+ // CHECK-EH-11-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
1559
1574
// CHECK-EH-11-NEXT: cleanup
1560
1575
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1561
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]], !noalias !6
1562
- // CHECK-EH-11-NEXT: br label [[COMMON_RESUME:%.*]]
1563
- // CHECK-EH-11: _Z6test20ILb1EE1Xv.exit:
1576
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1577
+ // CHECK-EH-11-NEXT: resume { i8*, i32 } [[TMP1]]
1578
+
1579
+ // CHECK-EH-11: @_Z6test20ILb0EE1Xv
1580
+ // CHECK-EH-11-NEXT: entry:
1581
+ // CHECK-EH-11-NEXT: [[X_I:%.*]] = alloca [[CLASS_X:%.*]], align 1
1582
+ // CHECK-EH-11-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[X_I]], i32 0, i32 0
1583
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1584
+ // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1585
+ // CHECK-EH-11-NEXT: invoke void @_ZN1XC1ERKS_(%class.X* noundef nonnull align 1 dereferenceable(1) %agg.result, %class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1586
+ // CHECK-EH-11-NEXT: to label %[[INVOKE_CONT:.*]] unwind label %[[LPAD:.*]]
1587
+ // CHECK-EH-11: [[INVOKE_CONT]]:
1564
1588
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1565
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]], !noalias !6
1566
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED]]) #[[ATTR7]]
1567
- // CHECK-EH-11-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[X_I2]], i32 0, i32 0
1568
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP2]]) #[[ATTR7]], !noalias !9
1569
- // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I2]]), !noalias !9
1570
- // CHECK-EH-11-NEXT: invoke void @_ZN1XC1ERKS_(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED1]], %class.X* noundef nonnull align 1 dereferenceable(1) [[X_I2]])
1571
- // CHECK-EH-11-NEXT: to label [[_Z6TEST20ILB0EE1XV_EXIT:%.*]] unwind label [[LPAD_I3]]
1572
- // CHECK-EH-11: lpad.i3:
1573
- // CHECK-EH-11-NEXT: [[TMP3]] = landingpad { i8*, i32 }
1574
- // CHECK-EH-11-NEXT: cleanup
1575
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I2]]) #[[ATTR7]]
1576
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP2]]) #[[ATTR7]], !noalias !9
1577
- // CHECK-EH-11-NEXT: br label [[COMMON_RESUME]]
1578
- // CHECK-EH-11: _Z6test20ILb0EE1Xv.exit:
1579
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I2]]) #[[ATTR7]]
1580
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP2]]) #[[ATTR7]], !noalias !9
1581
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED1]]) #[[ATTR7]]
1589
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1582
1590
// CHECK-EH-11-NEXT: ret void
1591
+ // CHECK-EH-11: [[LPAD]]:
1592
+ // CHECK-EH-11-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
1593
+ // CHECK-EH-11-NEXT: cleanup
1594
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1595
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1596
+ // CHECK-EH-11-NEXT: resume { i8*, i32 } [[TMP1]]
1583
1597
//
1584
1598
void test20instantiate () {
1585
1599
test20<true >();
@@ -1778,44 +1792,50 @@ X test25() {
1778
1792
1779
1793
// CHECK-EH-11-LABEL: @_Z17test25instantiatev(
1780
1794
// CHECK-EH-11-NEXT: entry:
1781
- // CHECK-EH-11-NEXT: [[X_I2:%.*]] = alloca [[CLASS_X:%.*]], align 1
1782
- // CHECK-EH-11-NEXT: [[X_I:%.*]] = alloca [[CLASS_X]], align 1
1783
- // CHECK-EH-11-NEXT: [[AGG_TMP_ENSURED:%.*]] = alloca [[CLASS_X]], align 1
1795
+ // CHECK-EH-11-NEXT: [[AGG_TMP_ENSURED:%.*]] = alloca [[CLASS_X:%.*]], align 1
1784
1796
// CHECK-EH-11-NEXT: [[AGG_TMP_ENSURED1:%.*]] = alloca [[CLASS_X]], align 1
1797
+ // CHECK-EH-11-NEXT: call void @_Z6test25ILb1EE1Xv(%class.X* nonnull sret([[CLASS_X]]) align 1 [[AGG_TMP_ENSURED]])
1798
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED]]) #[[ATTR7]]
1799
+ // CHECK-EH-11-NEXT: call void @_Z6test25ILb0EE1Xv(%class.X* nonnull sret([[CLASS_X]]) align 1 [[AGG_TMP_ENSURED1]])
1800
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED1]]) #[[ATTR7]]
1801
+ //
1802
+ // CHECK-EH-11: @_Z6test25ILb1EE1Xv
1803
+ // CHECK-EH-11-NEXT: entry:
1804
+ // CHECK-EH-11-NEXT: [[X_I:%.*]] = alloca [[CLASS_X:%.*]], align 1
1785
1805
// CHECK-EH-11-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[X_I]], i32 0, i32 0
1786
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]], !noalias !12
1787
- // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]), !noalias !12
1788
- // CHECK-EH-11-NEXT: invoke void @_ZN1XC1ERKS_(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED]], %class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1789
- // CHECK-EH-11-NEXT: to label [[_Z6TEST25ILB1EE1XV_EXIT:%.*]] unwind label [[LPAD_I:%.*]]
1790
- // CHECK-EH-11: common.resume:
1791
- // CHECK-EH-11-NEXT: [[COMMON_RESUME_OP:%.*]] = phi { i8*, i32 } [ [[TMP1:%.*]], [[LPAD_I]] ], [ [[TMP3:%.*]], [[LPAD_I3:%.*]] ]
1792
- // CHECK-EH-11-NEXT: resume { i8*, i32 } [[COMMON_RESUME_OP]]
1793
- // CHECK-EH-11: lpad.i:
1794
- // CHECK-EH-11-NEXT: [[TMP1]] = landingpad { i8*, i32 }
1806
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1807
+ // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1808
+ // CHECK-EH-11-NEXT: invoke void @_ZN1XC1ERKS_(%class.X* noundef nonnull align 1 dereferenceable(1) %agg.result, %class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1809
+ // CHECK-EH-11-NEXT: to label %[[INVOKE_CONT:.*]] unwind label %[[LPAD:.*]]
1810
+ // CHECK-EH-11: [[INVOKE_CONT]]:
1811
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1812
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1813
+ // CHECK-EH-11-NEXT: ret void
1814
+ // CHECK-EH-11: [[LPAD]]:
1815
+ // CHECK-EH-11-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
1795
1816
// CHECK-EH-11-NEXT: cleanup
1796
1817
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1797
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]], !noalias !12
1798
- // CHECK-EH-11-NEXT: br label [[COMMON_RESUME:%.*]]
1799
- // CHECK-EH-11: _Z6test25ILb1EE1Xv.exit:
1818
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1819
+ // CHECK-EH-11-NEXT: resume { i8*, i32 } [[TMP1]]
1820
+ //
1821
+ // CHECK-EH-11: @_Z6test25ILb0EE1Xv
1822
+ // CHECK-EH-11-NEXT: entry:
1823
+ // CHECK-EH-11-NEXT: [[X_I:%.*]] = alloca [[CLASS_X:%.*]], align 1
1824
+ // CHECK-EH-11-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[X_I]], i32 0, i32 0
1825
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1826
+ // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]])
1827
+ // CHECK-EH-11-NEXT: invoke void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) %agg.result)
1828
+ // CHECK-EH-11-NEXT: to label %[[INVOKE_CONT:.*]] unwind label %[[LPAD:.*]]
1829
+ // CHECK-EH-11: [[INVOKE_CONT]]:
1800
1830
// CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1801
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]], !noalias !12
1802
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED]]) #[[ATTR7]]
1803
- // CHECK-EH-11-NEXT: [[TMP2:%.*]] = getelementptr inbounds [[CLASS_X]], %class.X* [[X_I2]], i32 0, i32 0
1804
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[TMP2]]) #[[ATTR7]], !noalias !15
1805
- // CHECK-EH-11-NEXT: call void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I2]]), !noalias !15
1806
- // CHECK-EH-11-NEXT: invoke void @_ZN1XC1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED1]])
1807
- // CHECK-EH-11-NEXT: to label [[_Z6TEST25ILB0EE1XV_EXIT:%.*]] unwind label [[LPAD_I3]]
1808
- // CHECK-EH-11: lpad.i3:
1809
- // CHECK-EH-11-NEXT: [[TMP3]] = landingpad { i8*, i32 }
1810
- // CHECK-EH-11-NEXT: cleanup
1811
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I2]]) #[[ATTR7]]
1812
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP2]]) #[[ATTR7]], !noalias !15
1813
- // CHECK-EH-11-NEXT: br label [[COMMON_RESUME]]
1814
- // CHECK-EH-11: _Z6test25ILb0EE1Xv.exit:
1815
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I2]]) #[[ATTR7]]
1816
- // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP2]]) #[[ATTR7]], !noalias !15
1817
- // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[AGG_TMP_ENSURED1]]) #[[ATTR7]]
1831
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1818
1832
// CHECK-EH-11-NEXT: ret void
1833
+ // CHECK-EH-11: [[LPAD]]:
1834
+ // CHECK-EH-11-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
1835
+ // CHECK-EH-11-NEXT: cleanup
1836
+ // CHECK-EH-11-NEXT: call void @_ZN1XD1Ev(%class.X* noundef nonnull align 1 dereferenceable(1) [[X_I]]) #[[ATTR7]]
1837
+ // CHECK-EH-11-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[TMP0]]) #[[ATTR7]]
1838
+ // CHECK-EH-11-NEXT: resume { i8*, i32 } [[TMP1]]
1819
1839
//
1820
1840
void test25instantiate () {
1821
1841
test25<true >();
0 commit comments