Home | History | Annotate | Download | only in Hexagon
      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}
    225