Krzysztof Parzyszek | 046090d | 2018-03-12 14:01:28 +0000 | [diff] [blame] | 1 | ; RUN: llc -march=hexagon -O2 < %s |
| 2 | ; REQUIRES: asserts |
| 3 | ; Check for successful compilation. |
| 4 | |
| 5 | target triple = "hexagon-unknown--elf" |
| 6 | |
| 7 | %s.0 = type { i32 (...)** } |
| 8 | %s.1 = type { i32 } |
| 9 | %s.2 = type { %s.1 } |
| 10 | |
| 11 | @g0 = global { i32, i32 } { i32 ptrtoint (i32 (%s.1*)* @f0 to i32), i32 0 }, align 4 |
| 12 | @g1 = global i32 0, align 4 |
| 13 | @g2 = global %s.0 zeroinitializer, align 4 |
| 14 | @g3 = global { i32, i32 } { i32 1, i32 0 }, align 4 |
| 15 | @g4 = global i32 0, align 4 |
| 16 | @g5 = global i32 0, align 4 |
| 17 | @g6 = global i32 0, align 4 |
| 18 | @g7 = private unnamed_addr constant [53 x i8] c"REF: ISO/IEC 14882:1998, 8.2.3 Pointers to members.\0A\00", align 1 |
| 19 | @g8 = private unnamed_addr constant [6 x i8] c"%s\0A%s\00", align 1 |
| 20 | @g9 = private unnamed_addr constant [43 x i8] c"Can we assign a pointer to member function\00", align 1 |
| 21 | @g10 = private unnamed_addr constant [49 x i8] c" to a function member of the second base class?\0A\00", align 1 |
| 22 | @g11 = external global i32 |
| 23 | @g12 = private unnamed_addr constant [46 x i8] c"Can we assign a pointer to member to a member\00", align 1 |
| 24 | @g13 = private unnamed_addr constant [29 x i8] c" of the second base class?\0A\00", align 1 |
| 25 | @g14 = private unnamed_addr constant [7 x i8] c"%s\0A%s\0A\00", align 1 |
| 26 | @g15 = private unnamed_addr constant [51 x i8] c"Testing dereferencing a pointer to member function\00", align 1 |
| 27 | @g16 = private unnamed_addr constant [24 x i8] c"in a complex expression\00", align 1 |
| 28 | @g17 = linkonce_odr unnamed_addr constant [3 x i8*] [i8* null, i8* bitcast ({ i8*, i8* }* @g20 to i8*), i8* bitcast (i32 (%s.0*)* @f9 to i8*)] |
| 29 | @g18 = external global i8* |
| 30 | @g19 = linkonce_odr constant [3 x i8] c"1S\00" |
| 31 | @g20 = linkonce_odr constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8*, i8** @g18, i32 2) to i8*), i8* getelementptr inbounds ([3 x i8], [3 x i8]* @g19, i32 0, i32 0) } |
| 32 | |
| 33 | ; Function Attrs: nounwind readnone |
| 34 | define linkonce_odr i32 @f0(%s.1* nocapture readnone %a0) #0 align 2 { |
| 35 | b0: |
| 36 | ret i32 11 |
| 37 | } |
| 38 | |
| 39 | ; Function Attrs: nounwind readnone |
| 40 | define %s.0* @f1() #0 { |
| 41 | b0: |
| 42 | ret %s.0* @g2 |
| 43 | } |
| 44 | |
| 45 | define internal fastcc void @f2() { |
| 46 | b0: |
| 47 | %v0 = load i32, i32* @g5, align 4, !tbaa !0 |
| 48 | %v1 = add nsw i32 %v0, 5 |
| 49 | store i32 %v1, i32* @g5, align 4, !tbaa !0 |
| 50 | %v2 = load { i32, i32 }, { i32, i32 }* @g3, align 4, !tbaa !4 |
| 51 | %v3 = extractvalue { i32, i32 } %v2, 1 |
| 52 | %v4 = getelementptr inbounds i8, i8* bitcast (%s.0* @g2 to i8*), i32 %v3 |
| 53 | %v5 = bitcast i8* %v4 to %s.0* |
| 54 | %v6 = extractvalue { i32, i32 } %v2, 0 |
| 55 | %v7 = and i32 %v6, 1 |
| 56 | %v8 = icmp eq i32 %v7, 0 |
| 57 | br i1 %v8, label %b2, label %b1 |
| 58 | |
| 59 | b1: ; preds = %b0 |
| 60 | %v9 = bitcast i8* %v4 to i8** |
| 61 | %v10 = load i8*, i8** %v9, align 4, !tbaa !5 |
| 62 | %v11 = add i32 %v6, -1 |
| 63 | %v12 = getelementptr i8, i8* %v10, i32 %v11 |
| 64 | %v13 = bitcast i8* %v12 to i32 (%s.0*)** |
| 65 | %v14 = load i32 (%s.0*)*, i32 (%s.0*)** %v13, align 4 |
| 66 | br label %b3 |
| 67 | |
| 68 | b2: ; preds = %b0 |
| 69 | %v15 = inttoptr i32 %v6 to i32 (%s.0*)* |
| 70 | br label %b3 |
| 71 | |
| 72 | b3: ; preds = %b2, %b1 |
| 73 | %v16 = phi i32 (%s.0*)* [ %v14, %b1 ], [ %v15, %b2 ] |
| 74 | %v17 = tail call i32 %v16(%s.0* %v5) |
| 75 | store i32 %v17, i32* @g6, align 4, !tbaa !0 |
| 76 | ret void |
| 77 | } |
| 78 | |
| 79 | ; Function Attrs: nounwind readnone |
| 80 | define i32 @f3() #0 { |
| 81 | b0: |
| 82 | %v0 = alloca %s.2, align 4 |
| 83 | %v1 = alloca %s.2, align 4 |
| 84 | tail call void @f4() |
| 85 | tail call void @f5() |
| 86 | tail call void (i8*, ...) @f6(i8* getelementptr inbounds ([53 x i8], [53 x i8]* @g7, i32 0, i32 0)) |
| 87 | tail call void (i8*, ...) @f6(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @g8, i32 0, i32 0), i8* getelementptr inbounds ([43 x i8], [43 x i8]* @g9, i32 0, i32 0), i8* getelementptr inbounds ([49 x i8], [49 x i8]* @g10, i32 0, i32 0)) |
| 88 | %v2 = load { i32, i32 }, { i32, i32 }* @g0, align 4, !tbaa !4 |
| 89 | %v3 = extractvalue { i32, i32 } %v2, 1 |
| 90 | %v4 = bitcast %s.2* %v0 to i8* |
| 91 | %v5 = getelementptr inbounds i8, i8* %v4, i32 %v3 |
| 92 | %v6 = bitcast i8* %v5 to %s.2* |
| 93 | %v7 = extractvalue { i32, i32 } %v2, 0 |
| 94 | %v8 = and i32 %v7, 1 |
| 95 | %v9 = icmp eq i32 %v8, 0 |
| 96 | br i1 %v9, label %b1, label %b2 |
| 97 | |
| 98 | b1: ; preds = %b0 |
| 99 | %v10 = inttoptr i32 %v7 to i32 (%s.2*)* |
| 100 | br label %b2 |
| 101 | |
| 102 | b2: ; preds = %b1, %b0 |
| 103 | %v11 = phi i32 (%s.2*)* [ %v10, %b1 ], [ undef, %b0 ] |
| 104 | %v12 = call i32 %v11(%s.2* %v6) |
| 105 | %v13 = icmp eq i32 %v12, 11 |
| 106 | br i1 %v13, label %b4, label %b3 |
| 107 | |
| 108 | b3: ; preds = %b2 |
| 109 | store i32 1, i32* @g11, align 4, !tbaa !0 |
| 110 | br label %b4 |
| 111 | |
| 112 | b4: ; preds = %b3, %b2 |
| 113 | %v14 = call i32 @f7() |
| 114 | call void @f5() |
| 115 | call void (i8*, ...) @f6(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @g8, i32 0, i32 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* @g12, i32 0, i32 0), i8* getelementptr inbounds ([29 x i8], [29 x i8]* @g13, i32 0, i32 0)) |
| 116 | %v15 = getelementptr inbounds %s.2, %s.2* %v1, i32 0, i32 0, i32 0 |
| 117 | store i32 11, i32* %v15, align 4, !tbaa !7 |
| 118 | %v16 = load i32, i32* @g1, align 4, !tbaa !4 |
| 119 | %v17 = bitcast %s.2* %v1 to i8* |
| 120 | %v18 = getelementptr inbounds i8, i8* %v17, i32 %v16 |
| 121 | %v19 = bitcast i8* %v18 to i32* |
| 122 | %v20 = load i32, i32* %v19, align 4, !tbaa !0 |
| 123 | %v21 = icmp eq i32 %v20, 11 |
| 124 | br i1 %v21, label %b6, label %b5 |
| 125 | |
| 126 | b5: ; preds = %b4 |
| 127 | store i32 1, i32* @g11, align 4, !tbaa !0 |
| 128 | br label %b6 |
| 129 | |
| 130 | b6: ; preds = %b5, %b4 |
| 131 | %v22 = call i32 @f7() |
| 132 | call void @f5() |
| 133 | call void (i8*, ...) @f6(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @g14, i32 0, i32 0), i8* getelementptr inbounds ([51 x i8], [51 x i8]* @g15, i32 0, i32 0), i8* getelementptr inbounds ([24 x i8], [24 x i8]* @g16, i32 0, i32 0)) |
| 134 | %v23 = load i32, i32* @g4, align 4, !tbaa !0 |
| 135 | %v24 = icmp eq i32 %v23, 11 |
| 136 | br i1 %v24, label %b8, label %b7 |
| 137 | |
| 138 | b7: ; preds = %b6 |
| 139 | store i32 1, i32* @g11, align 4, !tbaa !0 |
| 140 | br label %b8 |
| 141 | |
| 142 | b8: ; preds = %b7, %b6 |
| 143 | %v25 = call i32 @f7() |
| 144 | call void @f5() |
| 145 | call void (i8*, ...) @f6(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @g14, i32 0, i32 0), i8* getelementptr inbounds ([51 x i8], [51 x i8]* @g15, i32 0, i32 0), i8* getelementptr inbounds ([24 x i8], [24 x i8]* @g16, i32 0, i32 0)) |
| 146 | %v26 = load i32, i32* @g6, align 4, !tbaa !0 |
| 147 | %v27 = icmp eq i32 %v26, 11 |
| 148 | br i1 %v27, label %b10, label %b9 |
| 149 | |
| 150 | b9: ; preds = %b8 |
| 151 | store i32 1, i32* @g11, align 4, !tbaa !0 |
| 152 | br label %b10 |
| 153 | |
| 154 | b10: ; preds = %b9, %b8 |
| 155 | %v28 = call i32 @f7() |
| 156 | %v29 = call i32 @f8(i32 4) |
| 157 | ret i32 %v29 |
| 158 | } |
| 159 | |
| 160 | ; Function Attrs: nounwind readnone |
| 161 | declare void @f4() #0 |
| 162 | |
| 163 | ; Function Attrs: nounwind readnone |
| 164 | declare void @f5() #0 |
| 165 | |
| 166 | ; Function Attrs: nounwind readnone |
| 167 | declare void @f6(i8*, ...) #0 |
| 168 | |
| 169 | ; Function Attrs: nounwind readnone |
| 170 | declare i32 @f7() #0 |
| 171 | |
| 172 | ; Function Attrs: nounwind readnone |
| 173 | declare i32 @f8(i32) #0 |
| 174 | |
| 175 | ; Function Attrs: nounwind readnone |
| 176 | define linkonce_odr i32 @f9(%s.0* nocapture readnone %a0) unnamed_addr #0 align 2 { |
| 177 | b0: |
| 178 | ret i32 11 |
| 179 | } |
| 180 | |
| 181 | define internal void @f10() { |
| 182 | b0: |
| 183 | store i32 (...)** bitcast (i8** getelementptr inbounds ([3 x i8*], [3 x i8*]* @g17, i32 0, i32 2) to i32 (...)**), i32 (...)*** getelementptr inbounds (%s.0, %s.0* @g2, i32 0, i32 0), align 4, !tbaa !5 |
| 184 | %v0 = load { i32, i32 }, { i32, i32 }* @g3, align 4, !tbaa !4 |
| 185 | %v1 = extractvalue { i32, i32 } %v0, 1 |
| 186 | %v2 = getelementptr inbounds i8, i8* bitcast (%s.0* @g2 to i8*), i32 %v1 |
| 187 | %v3 = bitcast i8* %v2 to %s.0* |
| 188 | %v4 = extractvalue { i32, i32 } %v0, 0 |
| 189 | %v5 = and i32 %v4, 1 |
| 190 | %v6 = icmp eq i32 %v5, 0 |
| 191 | br i1 %v6, label %b2, label %b1 |
| 192 | |
| 193 | b1: ; preds = %b0 |
| 194 | %v7 = bitcast i8* %v2 to i8** |
| 195 | %v8 = load i8*, i8** %v7, align 4, !tbaa !5 |
| 196 | %v9 = add i32 %v4, -1 |
| 197 | %v10 = getelementptr i8, i8* %v8, i32 %v9 |
| 198 | %v11 = bitcast i8* %v10 to i32 (%s.0*)** |
| 199 | %v12 = load i32 (%s.0*)*, i32 (%s.0*)** %v11, align 4 |
| 200 | br label %b3 |
| 201 | |
| 202 | b2: ; preds = %b0 |
| 203 | %v13 = inttoptr i32 %v4 to i32 (%s.0*)* |
| 204 | br label %b3 |
| 205 | |
| 206 | b3: ; preds = %b2, %b1 |
| 207 | %v14 = phi i32 (%s.0*)* [ %v12, %b1 ], [ %v13, %b2 ] |
| 208 | %v15 = tail call i32 %v14(%s.0* %v3) |
| 209 | store i32 %v15, i32* @g4, align 4, !tbaa !0 |
| 210 | tail call fastcc void @f2() |
| 211 | ret void |
| 212 | } |
| 213 | |
| 214 | attributes #0 = { nounwind readnone } |
| 215 | |
| 216 | !0 = !{!1, !1, i64 0} |
| 217 | !1 = !{!"int", !2, i64 0} |
| 218 | !2 = !{!"omnipotent char", !3, i64 0} |
| 219 | !3 = !{!"Simple C/C++ TBAA"} |
| 220 | !4 = !{!2, !2, i64 0} |
| 221 | !5 = !{!6, !6, i64 0} |
| 222 | !6 = !{!"vtable pointer", !3, i64 0} |
| 223 | !7 = !{!8, !1, i64 0} |
| 224 | !8 = !{!"_ZTS2B2", !1, i64 0} |