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