Home | History | Annotate | Download | only in CodeGenPrepare
      1 ; RUN: opt -codegenprepare  < %s  -mtriple=aarch64-none-linux-gnu -S  | FileCheck %s
      2 
      3 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
      4 target triple = "aarch64--linux-gnu"
      5 
      6 ; Expect to skip merging two empty blocks (sw.bb and sw.bb2) into sw.epilog
      7 ; as both of them are unlikely executed.
      8 define i32 @f_switch(i32 %c)  {
      9 ; CHECK-LABEL: @f_switch
     10 ; CHECK-LABEL: entry:
     11 ; CHECK: i32 10, label %sw.bb
     12 ; CHECK: i32 20, label %sw.bb2
     13 entry:
     14   switch i32 %c, label %sw.default [
     15     i32 10, label %sw.bb
     16     i32 20, label %sw.bb2
     17     i32 30, label %sw.bb3
     18     i32 40, label %sw.bb4
     19   ], !prof !0
     20 
     21 sw.bb:                                            ; preds = %entry
     22   br label %sw.epilog
     23 
     24 sw.bb2:                                           ; preds = %entry
     25   br label %sw.epilog
     26 
     27 sw.bb3:                                           ; preds = %entry
     28   call void bitcast (void (...)* @callcase3 to void ()*)()
     29   br label %sw.epilog
     30 
     31 sw.bb4:                                           ; preds = %entry
     32   call void bitcast (void (...)* @callcase4 to void ()*)()
     33   br label %sw.epilog
     34 
     35 sw.default:                                       ; preds = %entry
     36   call void bitcast (void (...)* @calldefault to void ()*)()
     37   br label %sw.epilog
     38 
     39 ; CHECK-LABEL: sw.epilog:
     40 ; CHECK: %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %sw.bb ]
     41 sw.epilog:                                        ; preds = %sw.default, %sw.bb3, %sw.bb2, %sw.bb
     42   %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %sw.bb ]
     43   %callee.knr.cast = bitcast void (...)* %fp.0 to void ()*
     44   call void %callee.knr.cast()
     45   ret i32 0
     46 }
     47 
     48 ; Expect not to merge sw.bb2 because of the conflict in the incoming value from
     49 ; sw.bb which is already merged.
     50 define i32 @f_switch2(i32 %c)  {
     51 ; CHECK-LABEL: @f_switch2
     52 ; CHECK-LABEL: entry:
     53 ; CHECK: i32 10, label %sw.epilog
     54 ; CHECK: i32 20, label %sw.bb2
     55 entry:
     56   switch i32 %c, label %sw.default [
     57     i32 10, label %sw.bb
     58     i32 20, label %sw.bb2
     59     i32 30, label %sw.bb3
     60     i32 40, label %sw.bb4
     61   ], !prof !1
     62 
     63 sw.bb:                                            ; preds = %entry
     64   br label %sw.epilog
     65 
     66 sw.bb2:                                           ; preds = %entry
     67   br label %sw.epilog
     68 
     69 sw.bb3:                                           ; preds = %entry
     70   call void bitcast (void (...)* @callcase3 to void ()*)()
     71   br label %sw.epilog
     72 
     73 sw.bb4:                                           ; preds = %entry
     74   call void bitcast (void (...)* @callcase4 to void ()*)()
     75   br label %sw.epilog
     76 
     77 sw.default:                                       ; preds = %entry
     78   call void bitcast (void (...)* @calldefault to void ()*)()
     79   br label %sw.epilog
     80 
     81 ; CHECK-LABEL: sw.epilog:
     82 ; CHECK: %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %entry ]
     83 sw.epilog:                                        ; preds = %sw.default, %sw.bb3, %sw.bb2, %sw.bb
     84   %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F2, %sw.bb2 ], [ @F1, %sw.bb ]
     85   %callee.knr.cast = bitcast void (...)* %fp.0 to void ()*
     86   call void %callee.knr.cast()
     87   ret i32 0
     88 }
     89 
     90 ; Multiple empty blocks should be considered together if all incoming values
     91 ; from them are same.  We expect to merge both empty blocks (sw.bb and sw.bb2)
     92 ; because the sum of frequencies are higer than the threshold.
     93 define i32 @f_switch3(i32 %c)  {
     94 ; CHECK-LABEL: @f_switch3
     95 ; CHECK-LABEL: entry:
     96 ; CHECK: i32 10, label %sw.epilog
     97 ; CHECK: i32 20, label %sw.epilog
     98 entry:
     99   switch i32 %c, label %sw.default [
    100     i32 10, label %sw.bb
    101     i32 20, label %sw.bb2
    102     i32 30, label %sw.bb3
    103     i32 40, label %sw.bb4
    104   ], !prof !2
    105 
    106 sw.bb:                                            ; preds = %entry
    107   br label %sw.epilog
    108 
    109 sw.bb2:                                           ; preds = %entry
    110   br label %sw.epilog
    111 
    112 sw.bb3:                                           ; preds = %entry
    113   call void bitcast (void (...)* @callcase3 to void ()*)()
    114   br label %sw.epilog
    115 
    116 sw.bb4:                                           ; preds = %entry
    117   call void bitcast (void (...)* @callcase4 to void ()*)()
    118   br label %sw.epilog
    119 
    120 sw.default:                                       ; preds = %entry
    121   call void bitcast (void (...)* @calldefault to void ()*)()
    122   br label %sw.epilog
    123 
    124 ; CHECK-LABEL: sw.epilog:
    125 ; CHECK: %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F1, %entry ], [ @F1, %entry ]
    126 sw.epilog:                                        ; preds = %sw.default, %sw.bb3, %sw.bb2, %sw.bb
    127   %fp.0 = phi void (...)* [ @FD, %sw.default ], [ @F4, %sw.bb4 ], [ @F3, %sw.bb3 ], [ @F1, %sw.bb2 ], [ @F1, %sw.bb ]
    128   %callee.knr.cast = bitcast void (...)* %fp.0 to void ()*
    129   call void %callee.knr.cast()
    130   ret i32 0
    131 }
    132 
    133 declare void @F1(...) local_unnamed_addr
    134 declare void @F2(...) local_unnamed_addr
    135 declare void @F3(...) local_unnamed_addr
    136 declare void @F4(...) local_unnamed_addr
    137 declare void @FD(...) local_unnamed_addr
    138 declare void @callcase3(...) local_unnamed_addr
    139 declare void @callcase4(...) local_unnamed_addr
    140 declare void @calldefault(...) local_unnamed_addr
    141 
    142 !0 = !{!"branch_weights", i32 5, i32 1, i32 1,i32 5, i32 5}
    143 !1 = !{!"branch_weights", i32 1 , i32 5, i32 1,i32 1, i32 1}
    144 !2 = !{!"branch_weights", i32 1 , i32 4, i32 1,i32 1, i32 1}
    145 
    146 
    147 ; This test that BFI/BPI is created without any assertion in isMergingEmptyBlockProfitable()
    148 ; in the case where empty blocks are removed before creating BFI/BPI.
    149 @b = common global i32 0, align 4
    150 @a = common global i32* null, align 8
    151 define i32 @should_not_assert(i32 %i) local_unnamed_addr {
    152 entry:
    153   %0 = load i32, i32* @b, align 4
    154   %cond = icmp eq i32 %0, 6
    155   br i1 %cond, label %while.cond.preheader, label %sw.epilog
    156 
    157 while.cond.preheader:                             ; preds = %entry
    158   %1 = load i32*, i32** @a, align 8
    159   %magicptr = ptrtoint i32* %1 to i64
    160   %arrayidx = getelementptr inbounds i32, i32* %1, i64 1
    161   br label %while.cond
    162 
    163 while.cond:                                       ; preds = %while.cond.preheader, %land.rhs
    164   switch i64 %magicptr, label %land.rhs [
    165     i64 32, label %while.cond2.loopexit
    166     i64 0, label %while.cond2.loopexit
    167   ]
    168 
    169 land.rhs:                                         ; preds = %while.cond
    170   %2 = load i32, i32* %arrayidx, align 4
    171   %tobool1 = icmp eq i32 %2, 0
    172   br i1 %tobool1, label %while.cond2thread-pre-split.loopexit, label %while.cond
    173 
    174 while.cond2thread-pre-split.loopexit:             ; preds = %land.rhs
    175   br label %while.cond2thread-pre-split
    176 
    177 while.cond2thread-pre-split:                      ; preds = %while.cond2thread-pre-split.loopexit, %while.body4
    178   %.pr = phi i32* [ %.pr.pre, %while.body4 ], [ %1, %while.cond2thread-pre-split.loopexit ]
    179   br label %while.cond2
    180 
    181 while.cond2.loopexit:                             ; preds = %while.cond, %while.cond
    182   br label %while.cond2
    183 
    184 while.cond2:                                      ; preds = %while.cond2.loopexit, %while.cond2thread-pre-split
    185   %3 = phi i32* [ %.pr, %while.cond2thread-pre-split ], [ %1, %while.cond2.loopexit ]
    186   %tobool3 = icmp eq i32* %3, null
    187   br i1 %tobool3, label %sw.epilog, label %while.body4
    188 
    189 while.body4:                                      ; preds = %while.cond2
    190   tail call void bitcast (void (...)* @fn2 to void ()*)()
    191   %.pr.pre = load i32*, i32** @a, align 8
    192   br label %while.cond2thread-pre-split
    193 
    194 sw.epilog:                                        ; preds = %while.cond2, %entry
    195   ret i32 undef
    196 }
    197 
    198 
    199 declare void @fn2(...) local_unnamed_addr
    200 
    201