Home | History | Annotate | Download | only in IndVarSimplify
      1 ; RUN: opt < %s -indvars -S | FileCheck %s
      2 
      3 ; Provide legal integer types.
      4 target datalayout = "n8:16:32:64"
      5 
      6 
      7 @a = common global i32 0, align 4
      8 @c = common global i32 0, align 4
      9 @b = common global i32 0, align 4
     10 
     11 define void @f() {
     12 ; CHECK-LABEL: @f(
     13 ; CHECK-LABEL: entry:
     14 ; CHECK: br label %[[for_cond2_preheader:.*]]
     15 
     16 ; CHECK: [[for_cond2_preheader]]:
     17 ; CHECK-NEXT: %[[indvars_iv:.*]] = phi i32 [ %[[indvars_iv_next:.*]], %[[for_inc13:.*]] ], [ -14, %entry ]
     18 ; br i1 {{.*}}, label %[[for_inc13]], label %
     19 entry:
     20   %0 = load i32, i32* @a, align 4
     21   %tobool2 = icmp eq i32 %0, 0
     22   %1 = load i32, i32* @a, align 4
     23   %tobool = icmp eq i32 %1, 0
     24   br label %for.cond2.preheader
     25 
     26 for.cond2.preheader:                              ; preds = %for.inc13, %entry
     27   %storemerge15 = phi i8 [ -14, %entry ], [ %inc14, %for.inc13 ]
     28   br i1 %tobool2, label %for.inc13, label %for.body3.lr.ph
     29 
     30 for.body3.lr.ph:                                  ; preds = %for.cond2.preheader
     31   %tobool5 = icmp eq i8 %storemerge15, 0
     32   %conv7 = sext i8 %storemerge15 to i32
     33   %2 = add nsw i32 %conv7, 1
     34   %3 = icmp ult i32 %2, 3
     35   %div = select i1 %3, i32 %conv7, i32 0
     36   br i1 %tobool5, label %for.body3.lr.ph.split.us, label %for.body3.lr.ph.for.body3.lr.ph.split_crit_edge
     37 
     38 for.body3.lr.ph.for.body3.lr.ph.split_crit_edge:  ; preds = %for.body3.lr.ph
     39   br label %for.body3.lr.ph.split
     40 
     41 for.body3.lr.ph.split.us:                         ; preds = %for.body3.lr.ph
     42   br i1 %tobool, label %for.body3.lr.ph.split.us.split.us, label %for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge
     43 
     44 for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge: ; preds = %for.body3.lr.ph.split.us
     45   br label %for.body3.lr.ph.split.us.split
     46 
     47 for.body3.lr.ph.split.us.split.us:                ; preds = %for.body3.lr.ph.split.us
     48   br label %for.body3.us.us
     49 
     50 for.body3.us.us:                                  ; preds = %for.cond2.loopexit.us.us, %for.body3.lr.ph.split.us.split.us
     51   br i1 true, label %cond.false.us.us, label %cond.end.us.us
     52 
     53 cond.false.us.us:                                 ; preds = %for.body3.us.us
     54   br label %cond.end.us.us
     55 
     56 cond.end.us.us:                                   ; preds = %cond.false.us.us, %for.body3.us.us
     57   %cond.us.us = phi i32 [ %div, %cond.false.us.us ], [ %conv7, %for.body3.us.us ]
     58   %4 = load i32, i32* @b, align 4
     59   %cmp91.us.us = icmp slt i32 %4, 1
     60   br i1 %cmp91.us.us, label %for.inc.lr.ph.us.us, label %for.cond2.loopexit.us.us
     61 
     62 for.cond2.loopexit.us.us:                         ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us.us, %cond.end.us.us
     63   br i1 true, label %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us, label %for.body3.us.us
     64 
     65 for.inc.lr.ph.us.us:                              ; preds = %cond.end.us.us
     66   br label %for.inc.us.us
     67 
     68 for.cond8.for.cond2.loopexit_crit_edge.us.us:     ; preds = %for.inc.us.us
     69   %inc.lcssa.us.us = phi i32 [ %inc.us.us, %for.inc.us.us ]
     70   store i32 %inc.lcssa.us.us, i32* @b, align 4
     71   br label %for.cond2.loopexit.us.us
     72 
     73 for.inc.us.us:                                    ; preds = %for.inc.us.us, %for.inc.lr.ph.us.us
     74   %5 = phi i32 [ %4, %for.inc.lr.ph.us.us ], [ %inc.us.us, %for.inc.us.us ]
     75   %inc.us.us = add nsw i32 %5, 1
     76   %cmp9.us.us = icmp slt i32 %inc.us.us, 1
     77   br i1 %cmp9.us.us, label %for.inc.us.us, label %for.cond8.for.cond2.loopexit_crit_edge.us.us
     78 
     79 for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us: ; preds = %for.cond2.loopexit.us.us
     80   %cond.lcssa.ph.us.ph.us = phi i32 [ %cond.us.us, %for.cond2.loopexit.us.us ]
     81   br label %for.cond2.for.inc13_crit_edge.us-lcssa.us
     82 
     83 for.body3.lr.ph.split.us.split:                   ; preds = %for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge
     84   br label %for.body3.us
     85 
     86 for.body3.us:                                     ; preds = %for.cond2.loopexit.us, %for.body3.lr.ph.split.us.split
     87   br i1 true, label %cond.false.us, label %cond.end.us
     88 
     89 cond.false.us:                                    ; preds = %for.body3.us
     90   br label %cond.end.us
     91 
     92 cond.end.us:                                      ; preds = %cond.false.us, %for.body3.us
     93   %cond.us = phi i32 [ %div, %cond.false.us ], [ %conv7, %for.body3.us ]
     94   %6 = load i32, i32* @b, align 4
     95   %cmp91.us = icmp slt i32 %6, 1
     96   br i1 %cmp91.us, label %for.inc.lr.ph.us, label %for.cond2.loopexit.us
     97 
     98 for.inc.us:                                       ; preds = %for.inc.lr.ph.us, %for.inc.us
     99   %7 = phi i32 [ %6, %for.inc.lr.ph.us ], [ %inc.us, %for.inc.us ]
    100   %inc.us = add nsw i32 %7, 1
    101   %cmp9.us = icmp slt i32 %inc.us, 1
    102   br i1 %cmp9.us, label %for.inc.us, label %for.cond8.for.cond2.loopexit_crit_edge.us
    103 
    104 for.cond2.loopexit.us:                            ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us, %cond.end.us
    105   br i1 false, label %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa, label %for.body3.us
    106 
    107 for.inc.lr.ph.us:                                 ; preds = %cond.end.us
    108   br label %for.inc.us
    109 
    110 for.cond8.for.cond2.loopexit_crit_edge.us:        ; preds = %for.inc.us
    111   %inc.lcssa.us = phi i32 [ %inc.us, %for.inc.us ]
    112   store i32 %inc.lcssa.us, i32* @b, align 4
    113   br label %for.cond2.loopexit.us
    114 
    115 for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa: ; preds = %for.cond2.loopexit.us
    116   %cond.lcssa.ph.us.ph = phi i32 [ %cond.us, %for.cond2.loopexit.us ]
    117   br label %for.cond2.for.inc13_crit_edge.us-lcssa.us
    118 
    119 for.cond2.for.inc13_crit_edge.us-lcssa.us:        ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us
    120   %cond.lcssa.ph.us = phi i32 [ %cond.lcssa.ph.us.ph, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa ], [ %cond.lcssa.ph.us.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us ]
    121   br label %for.cond2.for.inc13_crit_edge
    122 
    123 for.body3.lr.ph.split:                            ; preds = %for.body3.lr.ph.for.body3.lr.ph.split_crit_edge
    124   br i1 %tobool, label %for.body3.lr.ph.split.split.us, label %for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge
    125 
    126 for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge: ; preds = %for.body3.lr.ph.split
    127   br label %for.body3.lr.ph.split.split
    128 
    129 for.body3.lr.ph.split.split.us:                   ; preds = %for.body3.lr.ph.split
    130   br label %for.body3.us3
    131 
    132 for.body3.us3:                                    ; preds = %for.cond2.loopexit.us11, %for.body3.lr.ph.split.split.us
    133   br i1 false, label %cond.false.us4, label %cond.end.us5
    134 
    135 cond.false.us4:                                   ; preds = %for.body3.us3
    136   br label %cond.end.us5
    137 
    138 cond.end.us5:                                     ; preds = %cond.false.us4, %for.body3.us3
    139   %cond.us6 = phi i32 [ %div, %cond.false.us4 ], [ %conv7, %for.body3.us3 ]
    140   %8 = load i32, i32* @b, align 4
    141   %cmp91.us7 = icmp slt i32 %8, 1
    142   br i1 %cmp91.us7, label %for.inc.lr.ph.us12, label %for.cond2.loopexit.us11
    143 
    144 for.inc.us8:                                      ; preds = %for.inc.lr.ph.us12, %for.inc.us8
    145   %9 = phi i32 [ %8, %for.inc.lr.ph.us12 ], [ %inc.us9, %for.inc.us8 ]
    146   %inc.us9 = add nsw i32 %9, 1
    147   %cmp9.us10 = icmp slt i32 %inc.us9, 1
    148   br i1 %cmp9.us10, label %for.inc.us8, label %for.cond8.for.cond2.loopexit_crit_edge.us13
    149 
    150 for.cond2.loopexit.us11:                          ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us13, %cond.end.us5
    151   br i1 true, label %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us, label %for.body3.us3
    152 
    153 for.inc.lr.ph.us12:                               ; preds = %cond.end.us5
    154   br label %for.inc.us8
    155 
    156 for.cond8.for.cond2.loopexit_crit_edge.us13:      ; preds = %for.inc.us8
    157   %inc.lcssa.us14 = phi i32 [ %inc.us9, %for.inc.us8 ]
    158   store i32 %inc.lcssa.us14, i32* @b, align 4
    159   br label %for.cond2.loopexit.us11
    160 
    161 for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us: ; preds = %for.cond2.loopexit.us11
    162   %cond.lcssa.ph.ph.us = phi i32 [ %cond.us6, %for.cond2.loopexit.us11 ]
    163   br label %for.cond2.for.inc13_crit_edge.us-lcssa
    164 
    165 for.body3.lr.ph.split.split:                      ; preds = %for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge
    166   br label %for.body3
    167 
    168 for.cond8.for.cond2.loopexit_crit_edge:           ; preds = %for.inc
    169   %inc.lcssa = phi i32 [ %inc, %for.inc ]
    170   store i32 %inc.lcssa, i32* @b, align 4
    171   br label %for.cond2.loopexit
    172 
    173 for.cond2.loopexit:                               ; preds = %cond.end, %for.cond8.for.cond2.loopexit_crit_edge
    174   br i1 false, label %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa, label %for.body3
    175 
    176 for.body3:                                        ; preds = %for.cond2.loopexit, %for.body3.lr.ph.split.split
    177   br i1 false, label %cond.false, label %cond.end
    178 
    179 cond.false:                                       ; preds = %for.body3
    180   br label %cond.end
    181 
    182 cond.end:                                         ; preds = %cond.false, %for.body3
    183   %cond = phi i32 [ %div, %cond.false ], [ %conv7, %for.body3 ]
    184   %10 = load i32, i32* @b, align 4
    185   %cmp91 = icmp slt i32 %10, 1
    186   br i1 %cmp91, label %for.inc.lr.ph, label %for.cond2.loopexit
    187 
    188 for.inc.lr.ph:                                    ; preds = %cond.end
    189   br label %for.inc
    190 
    191 for.inc:                                          ; preds = %for.inc, %for.inc.lr.ph
    192   %11 = phi i32 [ %10, %for.inc.lr.ph ], [ %inc, %for.inc ]
    193   %inc = add nsw i32 %11, 1
    194   %cmp9 = icmp slt i32 %inc, 1
    195   br i1 %cmp9, label %for.inc, label %for.cond8.for.cond2.loopexit_crit_edge
    196 
    197 for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa:  ; preds = %for.cond2.loopexit
    198   %cond.lcssa.ph.ph = phi i32 [ %cond, %for.cond2.loopexit ]
    199   br label %for.cond2.for.inc13_crit_edge.us-lcssa
    200 
    201 for.cond2.for.inc13_crit_edge.us-lcssa:           ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us
    202   %cond.lcssa.ph = phi i32 [ %cond.lcssa.ph.ph, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa ], [ %cond.lcssa.ph.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us ]
    203   br label %for.cond2.for.inc13_crit_edge
    204 
    205 for.cond2.for.inc13_crit_edge:                    ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us
    206   %cond.lcssa = phi i32 [ %cond.lcssa.ph, %for.cond2.for.inc13_crit_edge.us-lcssa ], [ %cond.lcssa.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us ]
    207   store i32 %cond.lcssa, i32* @c, align 4
    208   br label %for.inc13
    209 
    210 ; CHECK: [[for_inc13]]:
    211 ; CHECK-NEXT: %[[indvars_iv_next]] = add nsw i32 %[[indvars_iv]], 1
    212 ; CHECK-NEXT: %[[exitcond4:.*]] = icmp ne i32 %[[indvars_iv_next]], 0
    213 ; CHECK-NEXT: br i1 %[[exitcond4]], label %[[for_cond2_preheader]], label %[[for_end15:.*]]
    214 for.inc13:                                        ; preds = %for.cond2.for.inc13_crit_edge, %for.cond2.preheader
    215   %inc14 = add i8 %storemerge15, 1
    216   %cmp = icmp ugt i8 %inc14, 50
    217   br i1 %cmp, label %for.cond2.preheader, label %for.end15
    218 
    219 ; CHECK: [[for_end15]]:
    220 ; CHECK-NEXT: ret void
    221 for.end15:                                        ; preds = %for.inc13
    222   ret void
    223 }
    224