Home | History | Annotate | Download | only in PhiValues
      1 ; RUN: opt < %s -passes='print<phi-values>' -disable-output 2>&1 | FileCheck %s
      2 
      3 @X = common global i32 0
      4 
      5 ; CHECK-LABEL: PHI Values for function: simple
      6 define void @simple(i32* %ptr) {
      7 entry:
      8   br i1 undef, label %if, label %else
      9 
     10 if:
     11   br label %end
     12 
     13 else:
     14   br label %end
     15 
     16 end:
     17 ; CHECK: PHI %phi1 has values:
     18 ; CHECK-DAG: i32 0
     19 ; CHECK-DAG: i32 1
     20   %phi1 = phi i32 [ 0, %if ], [ 1, %else ]
     21 ; CHECK: PHI %phi2 has values:
     22 ; CHECK-DAG: @X
     23 ; CHECK-DAG: %ptr
     24   %phi2 = phi i32* [ @X, %if ], [ %ptr, %else ]
     25   ret void
     26 }
     27 
     28 ; CHECK-LABEL: PHI Values for function: chain
     29 define void @chain() {
     30 entry:
     31   br i1 undef, label %if1, label %else1
     32 
     33 if1:
     34   br label %middle
     35 
     36 else1:
     37   br label %middle
     38 
     39 middle:
     40 ; CHECK: PHI %phi1 has values:
     41 ; CHECK-DAG: i32 0
     42 ; CHECK-DAG: i32 1
     43   %phi1 = phi i32 [ 0, %if1 ], [ 1, %else1 ]
     44   br i1 undef, label %if2, label %else2
     45 
     46 if2:
     47   br label %end
     48 
     49 else2:
     50   br label %end
     51 
     52 end:
     53 ; CHECK: PHI %phi2 has values:
     54 ; CHECK-DAG: i32 0
     55 ; CHECK-DAG: i32 1
     56 ; CHECK-DAG: i32 2
     57   %phi2 = phi i32 [ %phi1, %if2 ], [ 2, %else2 ]
     58   ret void
     59 }
     60 
     61 ; CHECK-LABEL: PHI Values for function: no_values
     62 define void @no_values() {
     63 entry:
     64   ret void
     65 
     66 unreachable:
     67 ; CHECK: PHI %phi has values:
     68 ; CHECK-DAG: NONE
     69   %phi = phi i32 [ %phi, %unreachable ]
     70   br label %unreachable
     71 }
     72 
     73 ; CHECK-LABEL: PHI Values for function: simple_loop
     74 define void @simple_loop() {
     75 entry:
     76   br label %loop
     77 
     78 loop:
     79 ; CHECK: PHI %phi has values:
     80 ; CHECK-DAG: i32 0
     81   %phi = phi i32 [ 0, %entry ], [ %phi, %loop ]
     82   br i1 undef, label %loop, label %end
     83 
     84 end:
     85   ret void
     86 }
     87 
     88 ; CHECK-LABEL: PHI Values for function: complex_loop
     89 define void @complex_loop() {
     90 entry:
     91   br i1 undef, label %loop, label %end
     92 
     93 loop:
     94 ; CHECK: PHI %phi1 has values:
     95 ; CHECK-DAG: i32 0
     96 ; CHECK-DAG: i32 1
     97   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %then ]
     98   br i1 undef, label %if, label %else
     99 
    100 if:
    101   br label %then
    102 
    103 else:
    104   br label %then
    105 
    106 then:
    107 ; CHECK: PHI %phi2 has values:
    108 ; CHECK-DAG: i32 0
    109 ; CHECK-DAG: i32 1
    110   %phi2 = phi i32 [ %phi1, %if ], [ 1, %else ]
    111   br i1 undef, label %loop, label %end
    112 
    113 end:
    114 ; CHECK: PHI %phi3 has values:
    115 ; CHECK-DAG: i32 0
    116 ; CHECK-DAG: i32 1
    117 ; CHECK-DAG: i32 2
    118   %phi3 = phi i32 [ 2, %entry ], [ %phi2, %then ]
    119   ret void
    120 }
    121 
    122 ; CHECK-LABEL: PHI Values for function: strange_loop
    123 define void @strange_loop() {
    124 entry:
    125   br i1 undef, label %ifelse, label %inloop
    126 
    127 loop:
    128 ; CHECK: PHI %phi1 has values:
    129 ; CHECK-DAG: i32 0
    130 ; CHECK-DAG: i32 1
    131 ; CHECK-DAG: i32 2
    132 ; CHECK-DAG: i32 3
    133   %phi1 = phi i32 [ %phi3, %if ], [ 0, %else ], [ %phi2, %inloop ]
    134   br i1 undef, label %inloop, label %end
    135 
    136 inloop:
    137 ; CHECK: PHI %phi2 has values:
    138 ; CHECK-DAG: i32 0
    139 ; CHECK-DAG: i32 1
    140 ; CHECK-DAG: i32 2
    141 ; CHECK-DAG: i32 3
    142   %phi2 = phi i32 [ %phi1, %loop ], [ 1, %entry ]
    143   br i1 undef, label %ifelse, label %loop
    144 
    145 ifelse:
    146 ; CHECK: PHI %phi3 has values:
    147 ; CHECK-DAG: i32 2
    148 ; CHECK-DAG: i32 3
    149   %phi3 = phi i32 [ 2, %entry ], [ 3, %inloop ]
    150   br i1 undef, label %if, label %else
    151 
    152 if:
    153   br label %loop
    154 
    155 else:
    156   br label %loop
    157 
    158 end:
    159   ret void
    160 }
    161 
    162 ; CHECK-LABEL: PHI Values for function: mutual_loops
    163 define void @mutual_loops() {
    164 entry:
    165   br i1 undef, label %loop1, label %loop2
    166 
    167 loop1:
    168 ; CHECK: PHI %phi1 has values:
    169 ; CHECK-DAG: 0
    170 ; CHECK-DAG: 1
    171 ; CHECK-DAG: 2
    172 ; CHECK-DAG: 3
    173 ; CHECK-DAG: 4
    174   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop1.then ], [ %phi3, %loop2.if ]
    175   br i1 undef, label %loop1.if, label %loop1.else
    176 
    177 loop1.if:
    178   br i1 undef, label %loop1.then, label %loop2
    179 
    180 loop1.else:
    181   br label %loop1.then
    182 
    183 loop1.then:
    184 ; CHECK: PHI %phi2 has values:
    185 ; CHECK-DAG: 0
    186 ; CHECK-DAG: 1
    187 ; CHECK-DAG: 2
    188 ; CHECK-DAG: 3
    189 ; CHECK-DAG: 4
    190   %phi2 = phi i32 [ 1, %loop1.if ], [ %phi1, %loop1.else ]
    191   br i1 undef, label %loop1, label %end
    192 
    193 loop2:
    194 ; CHECK: PHI %phi3 has values:
    195 ; CHECK-DAG: 2
    196 ; CHECK-DAG: 3
    197 ; CHECK-DAG: 4
    198   %phi3 = phi i32 [ 2, %entry ], [ %phi4, %loop2.then ], [ 3, %loop1.if ]
    199   br i1 undef, label %loop2.if, label %loop2.else
    200 
    201 loop2.if:
    202   br i1 undef, label %loop2.then, label %loop1
    203 
    204 loop2.else:
    205   br label %loop2.then
    206 
    207 loop2.then:
    208 ; CHECK: PHI %phi4 has values:
    209 ; CHECK-DAG: 2
    210 ; CHECK-DAG: 3
    211 ; CHECK-DAG: 4
    212   %phi4 = phi i32 [ 4, %loop2.if ], [ %phi3, %loop2.else ]
    213   br i1 undef, label %loop2, label %end
    214 
    215 end:
    216 ; CHECK: PHI %phi5 has values:
    217 ; CHECK-DAG: 0
    218 ; CHECK-DAG: 1
    219 ; CHECK-DAG: 2
    220 ; CHECK-DAG: 3
    221 ; CHECK-DAG: 4
    222   %phi5 = phi i32 [ %phi2, %loop1.then ], [ %phi4, %loop2.then ]
    223   ret void
    224 }
    225 
    226 ; CHECK-LABEL: PHI Values for function: nested_loops_several_values
    227 define void @nested_loops_several_values() {
    228 entry:
    229   br label %loop1
    230 
    231 loop1:
    232 ; CHECK: PHI %phi1 has values:
    233 ; CHECK-DAG: i32 0
    234 ; CHECK-DAG: %add
    235   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
    236   br i1 undef, label %loop2, label %end
    237 
    238 loop2:
    239 ; CHECK: PHI %phi2 has values:
    240 ; CHECK-DAG: i32 0
    241 ; CHECK-DAG: %add
    242   %phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
    243   br i1 undef, label %loop3, label %loop1
    244 
    245 loop3:
    246 ; CHECK: PHI %phi3 has values:
    247 ; CHECK-DAG: i32 0
    248 ; CHECK-DAG: %add
    249   %phi3 = phi i32 [ %add, %loop3 ], [ %phi2, %loop2 ]
    250   %add = add i32 %phi3, 1
    251   br i1 undef, label %loop3, label %loop2
    252 
    253 end:
    254   ret void
    255 }
    256 
    257 ; CHECK-LABEL: PHI Values for function: nested_loops_one_value
    258 define void @nested_loops_one_value() {
    259 entry:
    260   br label %loop1
    261 
    262 loop1:
    263 ; CHECK: PHI %phi1 has values:
    264 ; CHECK-DAG: i32 0
    265   %phi1 = phi i32 [ 0, %entry ], [ %phi2, %loop2 ]
    266   br i1 undef, label %loop2, label %end
    267 
    268 loop2:
    269 ; CHECK: PHI %phi2 has values:
    270 ; CHECK-DAG: i32 0
    271   %phi2 = phi i32 [ %phi1, %loop1 ], [ %phi3, %loop3 ]
    272   br i1 undef, label %loop3, label %loop1
    273 
    274 loop3:
    275 ; CHECK: PHI %phi3 has values:
    276 ; CHECK-DAG: i32 0
    277   %phi3 = phi i32 [ 0, %loop3 ], [ %phi2, %loop2 ]
    278   br i1 undef, label %loop3, label %loop2
    279 
    280 end:
    281   ret void
    282 }
    283