Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / Hexagon / bug14859-iv-cleanup-lpad.ll
blobe0417e73400255d07c73062e2ce8f3c73a55f914
1 ; RUN: llc -march=hexagon -O3 < %s
2 ; REQUIRES: asserts
4 target triple = "hexagon"
6 %s.0 = type { ptr, i32, %s.1 }
7 %s.1 = type { %s.2, ptr, ptr, i32 }
8 %s.2 = type { ptr, i32, i8, i8, i16, i32, i32, ptr, ptr, ptr }
9 %s.3 = type { ptr, i32, i32, ptr }
10 %s.4 = type { ptr, i32, ptr }
11 %s.5 = type { ptr, i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
12 %s.6 = type { ptr, %s.1 }
13 %s.7 = type { %s.8, i8 }
14 %s.8 = type { ptr }
16 define ptr @f0(ptr %a0, ptr nocapture %a1, i32 %a2, i32 signext %a3) align 2 personality ptr @f11 {
17 b0:
18   %v0 = alloca %s.7, align 4
19   %v1 = getelementptr inbounds %s.0, ptr %a0, i32 0, i32 1
20   store i32 0, ptr %v1, align 4, !tbaa !0
21   call void @f2(ptr %v0, ptr %a0, i1 zeroext true)
22   %v2 = getelementptr inbounds %s.7, ptr %v0, i32 0, i32 1
23   %v3 = load i8, ptr %v2, align 4, !tbaa !4, !range !6
24   %v4 = icmp ne i8 %v3, 0
25   %v5 = icmp sgt i32 %a2, 0
26   %v6 = and i1 %v4, %v5
27   br i1 %v6, label %b2, label %b1
29 b1:                                               ; preds = %b0
30   br label %b16
32 b2:                                               ; preds = %b0
33   %v9 = load ptr, ptr %a0, align 4, !tbaa !7
34   %v10 = getelementptr i8, ptr %v9, i32 -12
35   %v12 = load i32, ptr %v10, align 4
36   %v14 = add i32 %v12, 32
37   %v15 = getelementptr inbounds i8, ptr %a0, i32 %v14
38   %v17 = load ptr, ptr %v15, align 4, !tbaa !9
39   %v18 = invoke signext i32 @f3(ptr %v17)
40           to label %b3 unwind label %b7
42 b3:                                               ; preds = %b2
43   br label %b4
45 b4:                                               ; preds = %b13, %b3
46   %v19 = phi i32 [ %v68, %b13 ], [ %v18, %b3 ]
47   %v20 = phi i32 [ %v55, %b13 ], [ %a2, %b3 ]
48   %v21 = phi ptr [ %v59, %b13 ], [ %a1, %b3 ]
49   %v22 = icmp eq i32 %v19, -1
50   br i1 %v22, label %b15, label %b10
52 b5:                                               ; preds = %b16, %b9
53   %v23 = landingpad { ptr, i32 }
54           cleanup
55   %v24 = extractvalue { ptr, i32 } %v23, 0
56   %v25 = extractvalue { ptr, i32 } %v23, 1
57   br label %b18
59 b6:                                               ; preds = %b13
60   %v26 = landingpad { ptr, i32 }
61           catch ptr null
62   br label %b8
64 b7:                                               ; preds = %b11, %b2
65   %v27 = phi ptr [ %v21, %b11 ], [ %a1, %b2 ]
66   %v28 = landingpad { ptr, i32 }
67           catch ptr null
68   br label %b8
70 b8:                                               ; preds = %b7, %b6
71   %v29 = phi ptr [ %v59, %b6 ], [ %v27, %b7 ]
72   %v30 = phi { ptr, i32 } [ %v26, %b6 ], [ %v28, %b7 ]
73   %v31 = extractvalue { ptr, i32 } %v30, 0
74   %v32 = call ptr @f9(ptr %v31) #0
75   %v33 = load ptr, ptr %a0, align 4, !tbaa !7
76   %v34 = getelementptr i8, ptr %v33, i32 -12
77   %v36 = load i32, ptr %v34, align 4
78   %v37 = getelementptr inbounds i8, ptr %a0, i32 %v36
79   %v39 = add i32 %v36, 8
80   %v40 = getelementptr inbounds i8, ptr %a0, i32 %v39
81   %v41 = load i8, ptr %v40, align 1, !tbaa !11
82   %v42 = or i8 %v41, 4
83   invoke void @f6(ptr %v37, i8 zeroext %v42, i1 zeroext true)
84           to label %b9 unwind label %b14
86 b9:                                               ; preds = %b8
87   invoke void @f10()
88           to label %b16 unwind label %b5
90 b10:                                              ; preds = %b4
91   %v43 = icmp eq i32 %v19, %a3
92   br i1 %v43, label %b11, label %b12
94 b11:                                              ; preds = %b10
95   %v44 = load i32, ptr %v1, align 4, !tbaa !0
96   %v45 = add nsw i32 %v44, 1
97   store i32 %v45, ptr %v1, align 4, !tbaa !0
98   %v46 = load ptr, ptr %a0, align 4, !tbaa !7
99   %v47 = getelementptr i8, ptr %v46, i32 -12
100   %v49 = load i32, ptr %v47, align 4
101   %v50 = add i32 %v49, 32
102   %v51 = getelementptr inbounds i8, ptr %a0, i32 %v50
103   %v53 = load ptr, ptr %v51, align 4, !tbaa !9
104   %v54 = invoke signext i32 @f4(ptr %v53)
105           to label %b16 unwind label %b7
107 b12:                                              ; preds = %b10
108   %v55 = add nsw i32 %v20, -1
109   %v56 = icmp slt i32 %v55, 1
110   br i1 %v56, label %b15, label %b13
112 b13:                                              ; preds = %b12
113   %v57 = load i32, ptr %v1, align 4, !tbaa !0
114   %v58 = add nsw i32 %v57, 1
115   store i32 %v58, ptr %v1, align 4, !tbaa !0
116   %v59 = getelementptr inbounds i32, ptr %v21, i32 1
117   store i32 %v19, ptr %v21, align 4, !tbaa !13
118   %v60 = load ptr, ptr %a0, align 4, !tbaa !7
119   %v61 = getelementptr i8, ptr %v60, i32 -12
120   %v63 = load i32, ptr %v61, align 4
121   %v64 = add i32 %v63, 32
122   %v65 = getelementptr inbounds i8, ptr %a0, i32 %v64
123   %v67 = load ptr, ptr %v65, align 4, !tbaa !9
124   %v68 = invoke signext i32 @f5(ptr %v67)
125           to label %b4 unwind label %b6
127 b14:                                              ; preds = %b8
128   %v69 = landingpad { ptr, i32 }
129           cleanup
130   %v70 = extractvalue { ptr, i32 } %v69, 0
131   %v71 = extractvalue { ptr, i32 } %v69, 1
132   invoke void @f10()
133           to label %b18 unwind label %b20
135 b15:                                              ; preds = %b12, %b4
136   %v72 = phi i8 [ 2, %b12 ], [ 1, %b4 ]
137   br label %b16
139 b16:                                              ; preds = %b15, %b11, %b9, %b1
140   %v73 = phi ptr [ %a0, %b1 ], [ %a0, %b11 ], [ %a0, %b9 ], [ %a0, %b15 ]
141   %v74 = phi i8 [ 0, %b1 ], [ 0, %b11 ], [ 0, %b9 ], [ %v72, %b15 ]
142   %v75 = phi ptr [ %a1, %b1 ], [ %v21, %b11 ], [ %v29, %b9 ], [ %v21, %b15 ]
143   store i32 0, ptr %v75, align 4, !tbaa !13
144   %v76 = load ptr, ptr %a0, align 4, !tbaa !7
145   %v77 = getelementptr i8, ptr %v76, i32 -12
146   %v79 = load i32, ptr %v77, align 4
147   %v80 = getelementptr inbounds i8, ptr %v73, i32 %v79
148   %v82 = load i32, ptr %v1, align 4, !tbaa !0
149   %v83 = icmp eq i32 %v82, 0
150   %v84 = or i8 %v74, 2
151   %v85 = select i1 %v83, i8 %v84, i8 %v74
152   invoke void @f7(ptr %v80, i8 zeroext %v85, i1 zeroext false)
153           to label %b17 unwind label %b5
155 b17:                                              ; preds = %b16
156   call void @f1(ptr %v0)
157   ret ptr %a0
159 b18:                                              ; preds = %b14, %b5
160   %v87 = phi ptr [ %v24, %b5 ], [ %v70, %b14 ]
161   %v88 = phi i32 [ %v25, %b5 ], [ %v71, %b14 ]
162   invoke void @f1(ptr %v0)
163           to label %b19 unwind label %b20
165 b19:                                              ; preds = %b18
166   %v90 = insertvalue { ptr, i32 } undef, ptr %v87, 0
167   %v91 = insertvalue { ptr, i32 } %v90, i32 %v88, 1
168   resume { ptr, i32 } %v91
170 b20:                                              ; preds = %b18, %b14
171   %v92 = landingpad { ptr, i32 }
172           catch ptr null
173   call void @f8() #1
174   unreachable
177 declare void @f1(ptr nocapture) unnamed_addr align 2
179 declare void @f2(ptr nocapture, ptr, i1 zeroext) unnamed_addr align 2
181 declare signext i32 @f3(ptr) align 2
183 declare signext i32 @f4(ptr) align 2
185 declare signext i32 @f5(ptr) align 2
187 declare void @f6(ptr, i8 zeroext, i1 zeroext) align 2
189 declare void @f7(ptr, i8 zeroext, i1 zeroext) align 2
191 declare void @f8()
193 declare ptr @f9(ptr)
195 declare void @f10()
197 declare i32 @f11(...)
199 attributes #0 = { nounwind }
200 attributes #1 = { noreturn nounwind }
202 !0 = !{!1, !1, i64 0}
203 !1 = !{!"int", !2}
204 !2 = !{!"omnipotent char", !3}
205 !3 = !{!"Simple C/C++ TBAA"}
206 !4 = !{!5, !5, i64 0}
207 !5 = !{!"bool", !2}
208 !6 = !{i8 0, i8 2}
209 !7 = !{!8, !8, i64 0}
210 !8 = !{!"vtable pointer", !3}
211 !9 = !{!10, !10, i64 0}
212 !10 = !{!"any pointer", !2}
213 !11 = !{!12, !12, i64 0}
214 !12 = !{!"_ZTSNSt5_IosbIiE8_IostateE", !2}
215 !13 = !{!14, !14, i64 0}
216 !14 = !{!"wchar_t", !2}