Home | History | Annotate | Download | only in GVN
      1 ; RUN: opt -basicaa -gvn -S < %s | FileCheck %s
      2 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
      3 
      4 %"class.llvm::SmallVector" = type { %"class.llvm::SmallVectorImpl", [1 x %"union.llvm::SmallVectorBase::U"] }
      5 %"class.llvm::SmallVectorImpl" = type { %"class.llvm::SmallVectorTemplateBase" }
      6 %"class.llvm::SmallVectorTemplateBase" = type { %"class.llvm::SmallVectorTemplateCommon" }
      7 %"class.llvm::SmallVectorTemplateCommon" = type { %"class.llvm::SmallVectorBase" }
      8 %"class.llvm::SmallVectorBase" = type { i8*, i8*, i8*, %"union.llvm::SmallVectorBase::U" }
      9 %"union.llvm::SmallVectorBase::U" = type { x86_fp80 }
     10 
     11 ; Function Attrs: ssp uwtable
     12 define void @_Z4testv() #0 {
     13 ; CHECK: @_Z4testv()
     14 ; CHECK: invoke.cont:
     15 ; CHECK: br i1 true, label %new.notnull.i11, label %if.end.i14
     16 ; CHECK: Retry.i10:
     17 
     18 entry:
     19   %sv = alloca %"class.llvm::SmallVector", align 16
     20   %0 = bitcast %"class.llvm::SmallVector"* %sv to i8*
     21   call void @llvm.lifetime.start(i64 64, i8* %0) #1
     22   %BeginX.i.i.i.i.i.i = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
     23   %FirstEl.i.i.i.i.i.i = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0, i32 3
     24   %1 = bitcast %"union.llvm::SmallVectorBase::U"* %FirstEl.i.i.i.i.i.i to i8*
     25   store i8* %1, i8** %BeginX.i.i.i.i.i.i, align 16, !tbaa !4
     26   %EndX.i.i.i.i.i.i = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1
     27   store i8* %1, i8** %EndX.i.i.i.i.i.i, align 8, !tbaa !4
     28   %CapacityX.i.i.i.i.i.i = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0, i32 2
     29   %add.ptr.i.i.i.i2.i.i = getelementptr inbounds %"union.llvm::SmallVectorBase::U"* %FirstEl.i.i.i.i.i.i, i64 2
     30   %add.ptr.i.i.i.i.i.i = bitcast %"union.llvm::SmallVectorBase::U"* %add.ptr.i.i.i.i2.i.i to i8*
     31   store i8* %add.ptr.i.i.i.i.i.i, i8** %CapacityX.i.i.i.i.i.i, align 16, !tbaa !4
     32   %EndX.i = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1
     33   %2 = load i8** %EndX.i, align 8, !tbaa !4
     34   %CapacityX.i = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0, i32 2
     35   %cmp.i = icmp ult i8* %2, %add.ptr.i.i.i.i.i.i
     36   br i1 %cmp.i, label %Retry.i, label %if.end.i
     37 
     38 Retry.i:                                          ; preds = %.noexc, %entry
     39   %3 = phi i8* [ %2, %entry ], [ %.pre.i, %.noexc ]
     40   %new.isnull.i = icmp eq i8* %3, null
     41   br i1 %new.isnull.i, label %invoke.cont, label %new.notnull.i
     42 
     43 new.notnull.i:                                    ; preds = %Retry.i
     44   %4 = bitcast i8* %3 to i32*
     45   store i32 1, i32* %4, align 4, !tbaa !5
     46   br label %invoke.cont
     47 
     48 if.end.i:                                         ; preds = %entry
     49   %5 = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0
     50   invoke void @_ZN4llvm15SmallVectorBase8grow_podEmm(%"class.llvm::SmallVectorBase"* %5, i64 0, i64 4)
     51           to label %.noexc unwind label %lpad
     52 
     53 .noexc:                                           ; preds = %if.end.i
     54   %.pre.i = load i8** %EndX.i, align 8, !tbaa !4
     55   br label %Retry.i
     56 
     57 invoke.cont:                                      ; preds = %new.notnull.i, %Retry.i
     58   %add.ptr.i = getelementptr inbounds i8* %3, i64 4
     59   store i8* %add.ptr.i, i8** %EndX.i, align 8, !tbaa !4
     60   %6 = load i8** %CapacityX.i, align 16, !tbaa !4
     61   %cmp.i8 = icmp ult i8* %add.ptr.i, %6
     62   br i1 %cmp.i8, label %new.notnull.i11, label %if.end.i14
     63 
     64 Retry.i10:                                        ; preds = %if.end.i14
     65   %.pre.i13 = load i8** %EndX.i, align 8, !tbaa !4
     66   %new.isnull.i9 = icmp eq i8* %.pre.i13, null
     67   br i1 %new.isnull.i9, label %invoke.cont2, label %new.notnull.i11
     68 
     69 new.notnull.i11:                                  ; preds = %invoke.cont, %Retry.i10
     70   %7 = phi i8* [ %.pre.i13, %Retry.i10 ], [ %add.ptr.i, %invoke.cont ]
     71   %8 = bitcast i8* %7 to i32*
     72   store i32 2, i32* %8, align 4, !tbaa !5
     73   br label %invoke.cont2
     74 
     75 if.end.i14:                                       ; preds = %invoke.cont
     76   %9 = getelementptr inbounds %"class.llvm::SmallVector"* %sv, i64 0, i32 0, i32 0, i32 0, i32 0
     77   invoke void @_ZN4llvm15SmallVectorBase8grow_podEmm(%"class.llvm::SmallVectorBase"* %9, i64 0, i64 4)
     78           to label %Retry.i10 unwind label %lpad
     79 
     80 invoke.cont2:                                     ; preds = %new.notnull.i11, %Retry.i10
     81   %10 = phi i8* [ null, %Retry.i10 ], [ %7, %new.notnull.i11 ]
     82   %add.ptr.i12 = getelementptr inbounds i8* %10, i64 4
     83   store i8* %add.ptr.i12, i8** %EndX.i, align 8, !tbaa !4
     84   invoke void @_Z1gRN4llvm11SmallVectorIiLj8EEE(%"class.llvm::SmallVector"* %sv)
     85           to label %invoke.cont3 unwind label %lpad
     86 
     87 invoke.cont3:                                     ; preds = %invoke.cont2
     88   %11 = load i8** %BeginX.i.i.i.i.i.i, align 16, !tbaa !4
     89   %cmp.i.i.i.i19 = icmp eq i8* %11, %1
     90   br i1 %cmp.i.i.i.i19, label %_ZN4llvm11SmallVectorIiLj8EED1Ev.exit21, label %if.then.i.i.i20
     91 
     92 if.then.i.i.i20:                                  ; preds = %invoke.cont3
     93   call void @free(i8* %11) #1
     94   br label %_ZN4llvm11SmallVectorIiLj8EED1Ev.exit21
     95 
     96 _ZN4llvm11SmallVectorIiLj8EED1Ev.exit21:          ; preds = %invoke.cont3, %if.then.i.i.i20
     97   call void @llvm.lifetime.end(i64 64, i8* %0) #1
     98   ret void
     99 
    100 lpad:                                             ; preds = %if.end.i14, %if.end.i, %invoke.cont2
    101   %12 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
    102           cleanup
    103   %13 = load i8** %BeginX.i.i.i.i.i.i, align 16, !tbaa !4
    104   %cmp.i.i.i.i = icmp eq i8* %13, %1
    105   br i1 %cmp.i.i.i.i, label %eh.resume, label %if.then.i.i.i
    106 
    107 if.then.i.i.i:                                    ; preds = %lpad
    108   call void @free(i8* %13) #1
    109   br label %eh.resume
    110 
    111 eh.resume:                                        ; preds = %if.then.i.i.i, %lpad
    112   resume { i8*, i32 } %12
    113 }
    114 
    115 ; Function Attrs: nounwind
    116 declare void @llvm.lifetime.start(i64, i8* nocapture) #1
    117 
    118 declare i32 @__gxx_personality_v0(...)
    119 
    120 declare void @_Z1gRN4llvm11SmallVectorIiLj8EEE(%"class.llvm::SmallVector"*) #2
    121 
    122 ; Function Attrs: nounwind
    123 declare void @llvm.lifetime.end(i64, i8* nocapture) #1
    124 
    125 declare void @_ZN4llvm15SmallVectorBase8grow_podEmm(%"class.llvm::SmallVectorBase"*, i64, i64) #2
    126 
    127 ; Function Attrs: nounwind
    128 declare void @free(i8* nocapture) #3
    129 
    130 attributes #0 = { ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
    131 attributes #1 = { nounwind }
    132 attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
    133 attributes #3 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
    134 
    135 !0 = metadata !{metadata !"any pointer", metadata !1}
    136 !1 = metadata !{metadata !"omnipotent char", metadata !2}
    137 !2 = metadata !{metadata !"Simple C/C++ TBAA"}
    138 !3 = metadata !{metadata !"int", metadata !1}
    139 !4 = metadata !{metadata !0, metadata !0, i64 0}
    140 !5 = metadata !{metadata !3, metadata !3, i64 0}
    141