landing-pad.ll 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. ; RUN: opt < %s -disable-output -jump-threading
  2. %class.E = type { i32 (...)**, %class.C }
  3. %class.C = type { %class.A }
  4. %class.A = type { i32 }
  5. %class.D = type { %class.F }
  6. %class.F = type { %class.E }
  7. %class.B = type { %class.D* }
  8. @_ZTV1D = unnamed_addr constant [3 x i8*] [i8* null, i8* bitcast ({ i8*, i8*, i8* }* @_ZTI1D to i8*), i8* bitcast (void (%class.D*)* @_ZN1D7doApplyEv to i8*)]
  9. @_ZTI1D = external unnamed_addr constant { i8*, i8*, i8* }
  10. define void @_ZN15EditCommandImpl5applyEv(%class.E* %this) uwtable align 2 {
  11. entry:
  12. %0 = bitcast %class.E* %this to void (%class.E*)***
  13. %vtable = load void (%class.E*)**, void (%class.E*)*** %0, align 8
  14. %1 = load void (%class.E*)*, void (%class.E*)** %vtable, align 8
  15. call void %1(%class.E* %this)
  16. ret void
  17. }
  18. define void @_ZN1DC1Ev(%class.D* nocapture %this) unnamed_addr uwtable align 2 {
  19. entry:
  20. call void @_ZN24CompositeEditCommandImplC2Ev()
  21. %0 = getelementptr inbounds %class.D, %class.D* %this, i64 0, i32 0, i32 0, i32 0
  22. store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1D, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8
  23. ret void
  24. }
  25. define void @_ZN1DC2Ev(%class.D* nocapture %this) unnamed_addr uwtable align 2 {
  26. entry:
  27. call void @_ZN24CompositeEditCommandImplC2Ev()
  28. %0 = getelementptr inbounds %class.D, %class.D* %this, i64 0, i32 0, i32 0, i32 0
  29. store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1D, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8
  30. ret void
  31. }
  32. declare void @_ZN24CompositeEditCommandImplC2Ev() #1
  33. define void @_ZN1D7doApplyEv(%class.D* nocapture %this) unnamed_addr nounwind readnone uwtable align 2 {
  34. entry:
  35. ret void
  36. }
  37. define void @_Z3fn1v() uwtable personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  38. entry:
  39. %call = call noalias i8* @_Znwm() #8
  40. invoke void @_ZN24CompositeEditCommandImplC2Ev()
  41. to label %_ZN1DC1Ev.exit unwind label %lpad
  42. _ZN1DC1Ev.exit: ; preds = %entry
  43. %0 = bitcast i8* %call to i32 (...)***
  44. store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @_ZTV1D, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8
  45. %_ref.i.i.i = getelementptr inbounds i8, i8* %call, i64 8
  46. %1 = bitcast i8* %_ref.i.i.i to i32*
  47. %2 = load i32, i32* %1, align 4
  48. %inc.i.i.i = add nsw i32 %2, 1
  49. store i32 %inc.i.i.i, i32* %1, align 4
  50. %3 = bitcast i8* %call to %class.D*
  51. invoke void @_ZN1D7doApplyEv(%class.D* %3)
  52. to label %_ZN15EditCommandImpl5applyEv.exit unwind label %lpad1
  53. _ZN15EditCommandImpl5applyEv.exit: ; preds = %_ZN1DC1Ev.exit
  54. invoke void @_ZN1D16deleteKeyPressedEv()
  55. to label %invoke.cont7 unwind label %lpad1
  56. invoke.cont7: ; preds = %_ZN15EditCommandImpl5applyEv.exit
  57. ret void
  58. lpad: ; preds = %entry
  59. %4 = landingpad { i8*, i32 }
  60. cleanup
  61. call void @_ZdlPv() #9
  62. unreachable
  63. lpad1: ; preds = %_ZN1DC1Ev.exit, %_ZN15EditCommandImpl5applyEv.exit
  64. %5 = landingpad { i8*, i32 }
  65. cleanup
  66. %6 = load i32, i32* %1, align 4
  67. %tobool.i.i.i = icmp eq i32 %6, 0
  68. br i1 %tobool.i.i.i, label %_ZN1BI1DED1Ev.exit, label %if.then.i.i.i
  69. if.then.i.i.i: ; preds = %lpad1
  70. br i1 undef, label %_ZN1BI1DED1Ev.exit, label %delete.notnull.i.i.i
  71. delete.notnull.i.i.i: ; preds = %if.then.i.i.i
  72. call void @_ZdlPv() #9
  73. unreachable
  74. _ZN1BI1DED1Ev.exit: ; preds = %lpad1, %if.then.i.i.i
  75. resume { i8*, i32 } undef
  76. terminate.lpad: ; No predecessors!
  77. %7 = landingpad { i8*, i32 }
  78. catch i8* null
  79. unreachable
  80. }
  81. define void @_ZN1BI1DEC1EPS0_(%class.B* nocapture %this, %class.D* %p1) unnamed_addr uwtable align 2 {
  82. entry:
  83. %m_ptr.i = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0
  84. store %class.D* %p1, %class.D** %m_ptr.i, align 8
  85. %_ref.i.i = getelementptr inbounds %class.D, %class.D* %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
  86. %0 = load i32, i32* %_ref.i.i, align 4
  87. %inc.i.i = add nsw i32 %0, 1
  88. store i32 %inc.i.i, i32* %_ref.i.i, align 4
  89. ret void
  90. }
  91. declare noalias i8* @_Znwm()
  92. declare i32 @__gxx_personality_v0(...)
  93. declare void @_ZdlPv()
  94. define %class.D* @_ZN1BI1DEptEv(%class.B* nocapture readonly %this) nounwind readonly uwtable align 2 {
  95. entry:
  96. %m_ptr = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0
  97. %0 = load %class.D*, %class.D** %m_ptr, align 8
  98. ret %class.D* %0
  99. }
  100. declare void @_ZN1D16deleteKeyPressedEv()
  101. define void @_ZN1BI1DED1Ev(%class.B* nocapture readonly %this) unnamed_addr uwtable align 2 {
  102. entry:
  103. %m_ptr.i = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0
  104. %0 = load %class.D*, %class.D** %m_ptr.i, align 8
  105. %_ref.i.i = getelementptr inbounds %class.D, %class.D* %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
  106. %1 = load i32, i32* %_ref.i.i, align 4
  107. %tobool.i.i = icmp eq i32 %1, 0
  108. br i1 %tobool.i.i, label %_ZN1BI1DED2Ev.exit, label %if.then.i.i
  109. if.then.i.i: ; preds = %entry
  110. br i1 undef, label %_ZN1BI1DED2Ev.exit, label %delete.notnull.i.i
  111. delete.notnull.i.i: ; preds = %if.then.i.i
  112. call void @_ZdlPv() #9
  113. unreachable
  114. _ZN1BI1DED2Ev.exit: ; preds = %entry, %if.then.i.i
  115. ret void
  116. }
  117. declare hidden void @__clang_call_terminate()
  118. define void @_ZN1BI1DED2Ev(%class.B* nocapture readonly %this) unnamed_addr uwtable align 2 {
  119. entry:
  120. %m_ptr = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0
  121. %0 = load %class.D*, %class.D** %m_ptr, align 8
  122. %_ref.i = getelementptr inbounds %class.D, %class.D* %0, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
  123. %1 = load i32, i32* %_ref.i, align 4
  124. %tobool.i = icmp eq i32 %1, 0
  125. br i1 %tobool.i, label %_ZN1AI1CE5derefEv.exit, label %if.then.i
  126. if.then.i: ; preds = %entry
  127. br i1 undef, label %_ZN1AI1CE5derefEv.exit, label %delete.notnull.i
  128. delete.notnull.i: ; preds = %if.then.i
  129. call void @_ZdlPv() #9
  130. unreachable
  131. _ZN1AI1CE5derefEv.exit: ; preds = %entry, %if.then.i
  132. ret void
  133. }
  134. define void @_ZN1AI1CE5derefEv(%class.A* nocapture readonly %this) nounwind uwtable align 2 {
  135. entry:
  136. %_ref = getelementptr inbounds %class.A, %class.A* %this, i64 0, i32 0
  137. %0 = load i32, i32* %_ref, align 4
  138. %tobool = icmp eq i32 %0, 0
  139. br i1 %tobool, label %if.end, label %if.then
  140. if.then: ; preds = %entry
  141. br i1 undef, label %if.end, label %delete.notnull
  142. delete.notnull: ; preds = %if.then
  143. call void @_ZdlPv() #9
  144. unreachable
  145. if.end: ; preds = %entry, %if.then
  146. ret void
  147. }
  148. define void @_ZN1BI1DEC2EPS0_(%class.B* nocapture %this, %class.D* %p1) unnamed_addr uwtable align 2 {
  149. entry:
  150. %m_ptr = getelementptr inbounds %class.B, %class.B* %this, i64 0, i32 0
  151. store %class.D* %p1, %class.D** %m_ptr, align 8
  152. %_ref.i = getelementptr inbounds %class.D, %class.D* %p1, i64 0, i32 0, i32 0, i32 1, i32 0, i32 0
  153. %0 = load i32, i32* %_ref.i, align 4
  154. %inc.i = add nsw i32 %0, 1
  155. store i32 %inc.i, i32* %_ref.i, align 4
  156. ret void
  157. }
  158. define void @_ZN1AI1CE3refEv(%class.A* nocapture %this) nounwind uwtable align 2 {
  159. entry:
  160. %_ref = getelementptr inbounds %class.A, %class.A* %this, i64 0, i32 0
  161. %0 = load i32, i32* %_ref, align 4
  162. %inc = add nsw i32 %0, 1
  163. store i32 %inc, i32* %_ref, align 4
  164. ret void
  165. }