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 6define void @simple(i32* %ptr) { 7entry: 8 br i1 undef, label %if, label %else 9 10if: 11 br label %end 12 13else: 14 br label %end 15 16end: 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 29define void @chain() { 30entry: 31 br i1 undef, label %if1, label %else1 32 33if1: 34 br label %middle 35 36else1: 37 br label %middle 38 39middle: 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 46if2: 47 br label %end 48 49else2: 50 br label %end 51 52end: 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 62define void @no_values() { 63entry: 64 ret void 65 66unreachable: 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 74define void @simple_loop() { 75entry: 76 br label %loop 77 78loop: 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 84end: 85 ret void 86} 87 88; CHECK-LABEL: PHI Values for function: complex_loop 89define void @complex_loop() { 90entry: 91 br i1 undef, label %loop, label %end 92 93loop: 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 100if: 101 br label %then 102 103else: 104 br label %then 105 106then: 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 113end: 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 123define void @strange_loop() { 124entry: 125 br i1 undef, label %ifelse, label %inloop 126 127loop: 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 136inloop: 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 145ifelse: 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 152if: 153 br label %loop 154 155else: 156 br label %loop 157 158end: 159 ret void 160} 161 162; CHECK-LABEL: PHI Values for function: mutual_loops 163define void @mutual_loops() { 164entry: 165 br i1 undef, label %loop1, label %loop2 166 167loop1: 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 177loop1.if: 178 br i1 undef, label %loop1.then, label %loop2 179 180loop1.else: 181 br label %loop1.then 182 183loop1.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 193loop2: 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 201loop2.if: 202 br i1 undef, label %loop2.then, label %loop1 203 204loop2.else: 205 br label %loop2.then 206 207loop2.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 215end: 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 227define void @nested_loops_several_values() { 228entry: 229 br label %loop1 230 231loop1: 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 238loop2: 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 245loop3: 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 253end: 254 ret void 255} 256 257; CHECK-LABEL: PHI Values for function: nested_loops_one_value 258define void @nested_loops_one_value() { 259entry: 260 br label %loop1 261 262loop1: 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 268loop2: 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 274loop3: 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 280end: 281 ret void 282} 283