Home | History | Annotate | Download | only in Inline
      1 ; RUN: opt < %s -inline -S | FileCheck %s
      2 
      3 @a = global i32 4
      4 @_ZTIi = external global i8*
      5 
      6 ; CHECK-LABEL: callSimpleFunction
      7 ; CHECK: call i32 @simpleFunction
      8 define i32 @callSimpleFunction(i32 %idx, i32 %limit) {
      9 entry:
     10   %cmp = icmp sge i32 %idx, %limit
     11   br i1 %cmp, label %if.then, label %if.end
     12 
     13 if.then:
     14   %s = call i32 @simpleFunction(i32 %idx)
     15   store i32 %s, i32* @a
     16   unreachable
     17 
     18 if.end:
     19   ret i32 %idx
     20 }
     21 
     22 ; CHECK-LABEL: callSmallFunction
     23 ; CHECK-NOT: call i32 @smallFunction
     24 define i32 @callSmallFunction(i32 %idx, i32 %limit) {
     25 entry:
     26   %cmp = icmp sge i32 %idx, %limit
     27   br i1 %cmp, label %if.then, label %if.end
     28 
     29 if.then:
     30   %s = call i32 @smallFunction(i32 %idx)
     31   store i32 %s, i32* @a
     32   unreachable
     33 
     34 if.end:
     35   ret i32 %idx
     36 }
     37 
     38 ; CHECK-LABEL: throwSimpleException
     39 ; CHECK: invoke i32 @simpleFunction
     40 define i32 @throwSimpleException(i32 %idx, i32 %limit) #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
     41 entry:
     42   %cmp = icmp sge i32 %idx, %limit
     43   br i1 %cmp, label %if.then, label %if.end
     44 
     45 if.then:                                          ; preds = %entry
     46   %exception = call i8* @__cxa_allocate_exception(i64 1) #0
     47   invoke i32 @simpleFunction(i32 %idx)
     48           to label %invoke.cont unwind label %lpad
     49 
     50 invoke.cont:                                      ; preds = %if.then
     51   call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi  to i8*), i8* null) #1
     52   unreachable
     53 
     54 lpad:                                             ; preds = %if.then
     55   %ll = landingpad { i8*, i32 }
     56           cleanup
     57   ret i32 %idx
     58 
     59 if.end:                                           ; preds = %entry
     60   ret i32 %idx
     61 }
     62 
     63 ; CHECK-LABEL: throwSmallException
     64 ; CHECK-NOT: invoke i32 @smallFunction
     65 define i32 @throwSmallException(i32 %idx, i32 %limit) #0 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
     66 entry:
     67   %cmp = icmp sge i32 %idx, %limit
     68   br i1 %cmp, label %if.then, label %if.end
     69 
     70 if.then:                                          ; preds = %entry
     71   %exception = call i8* @__cxa_allocate_exception(i64 1) #0
     72   invoke i32 @smallFunction(i32 %idx)
     73           to label %invoke.cont unwind label %lpad
     74 
     75 invoke.cont:                                      ; preds = %if.then
     76   call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi  to i8*), i8* null) #1
     77   unreachable
     78 
     79 lpad:                                             ; preds = %if.then
     80   %ll = landingpad { i8*, i32 }
     81           cleanup
     82   ret i32 %idx
     83 
     84 if.end:                                           ; preds = %entry
     85   ret i32 %idx
     86 }
     87 
     88 define i32 @simpleFunction(i32 %a) #0 {
     89 entry:
     90   %a1 = load volatile i32, i32* @a
     91   %x1 = add i32 %a1,  %a1
     92   %a2 = load volatile i32, i32* @a
     93   %x2 = add i32 %x1, %a2
     94   %a3 = load volatile i32, i32* @a
     95   %x3 = add i32 %x2, %a3
     96   %a4 = load volatile i32, i32* @a
     97   %x4 = add i32 %x3, %a4
     98   %a5 = load volatile i32, i32* @a
     99   %x5 = add i32 %x4, %a5
    100   %a6 = load volatile i32, i32* @a
    101   %x6 = add i32 %x5, %a6
    102   %a7 = load volatile i32, i32* @a
    103   %x7 = add i32 %x6, %a6
    104   %a8 = load volatile i32, i32* @a
    105   %x8 = add i32 %x7, %a8
    106   %a9 = load volatile i32, i32* @a
    107   %x9 = add i32 %x8, %a9
    108   %a10 = load volatile i32, i32* @a
    109   %x10 = add i32 %x9, %a10
    110   %a11 = load volatile i32, i32* @a
    111   %x11 = add i32 %x10, %a11
    112   %a12 = load volatile i32, i32* @a
    113   %x12 = add i32 %x11, %a12
    114   %add = add i32 %x12, %a
    115   ret i32 %add
    116 }
    117 
    118 define i32 @smallFunction(i32 %a) {
    119 entry:
    120   %r = load volatile i32, i32* @a
    121   ret i32 %r
    122 }
    123 
    124 attributes #0 = { nounwind }
    125 attributes #1 = { noreturn }
    126 
    127 declare i8* @__cxa_allocate_exception(i64)
    128 declare i32 @__gxx_personality_v0(...)
    129 declare void @__cxa_throw(i8*, i8*, i8*)
    130 
    131