1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -simplifycfg < %s | FileCheck %s 3 4declare void @foo() 5declare void @bar() 6declare void @use.i1(i1) 7 8define void @test_phi_simple(i1 %c) { 9; CHECK-LABEL: @test_phi_simple( 10; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] 11; CHECK: if: 12; CHECK-NEXT: call void @foo() 13; CHECK-NEXT: call void @foo() 14; CHECK-NEXT: br label [[JOIN2:%.*]] 15; CHECK: else: 16; CHECK-NEXT: call void @bar() 17; CHECK-NEXT: call void @bar() 18; CHECK-NEXT: br label [[JOIN2]] 19; CHECK: join2: 20; CHECK-NEXT: ret void 21; 22 br i1 %c, label %if, label %else 23 24if: 25 call void @foo() 26 br label %join 27 28else: 29 call void @bar() 30 br label %join 31 32join: 33 %c2 = phi i1 [ true, %if ], [ false, %else ] 34 br i1 %c2, label %if2, label %else2 35 36if2: 37 call void @foo() 38 br label %join2 39 40else2: 41 call void @bar() 42 br label %join2 43 44join2: 45 ret void 46} 47 48define void @test_phi_extra_use(i1 %c) { 49; CHECK-LABEL: @test_phi_extra_use( 50; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] 51; CHECK: if: 52; CHECK-NEXT: call void @foo() 53; CHECK-NEXT: call void @use.i1(i1 true) 54; CHECK-NEXT: call void @foo() 55; CHECK-NEXT: br label [[JOIN2:%.*]] 56; CHECK: else: 57; CHECK-NEXT: call void @bar() 58; CHECK-NEXT: call void @use.i1(i1 false) 59; CHECK-NEXT: call void @bar() 60; CHECK-NEXT: br label [[JOIN2]] 61; CHECK: join2: 62; CHECK-NEXT: ret void 63; 64 br i1 %c, label %if, label %else 65 66if: 67 call void @foo() 68 br label %join 69 70else: 71 call void @bar() 72 br label %join 73 74join: 75 %c2 = phi i1 [ true, %if ], [ false, %else ] 76 call void @use.i1(i1 %c2) 77 br i1 %c2, label %if2, label %else2 78 79if2: 80 call void @foo() 81 br label %join2 82 83else2: 84 call void @bar() 85 br label %join2 86 87join2: 88 ret void 89} 90 91define void @test_phi_extra_use_different_block(i1 %c) { 92; CHECK-LABEL: @test_phi_extra_use_different_block( 93; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] 94; CHECK: if: 95; CHECK-NEXT: call void @foo() 96; CHECK-NEXT: br label [[JOIN:%.*]] 97; CHECK: else: 98; CHECK-NEXT: call void @bar() 99; CHECK-NEXT: br label [[JOIN]] 100; CHECK: join: 101; CHECK-NEXT: [[C2:%.*]] = phi i1 [ true, [[IF]] ], [ false, [[ELSE]] ] 102; CHECK-NEXT: br i1 [[C2]], label [[IF2:%.*]], label [[ELSE2:%.*]] 103; CHECK: if2: 104; CHECK-NEXT: call void @use.i1(i1 [[C2]]) 105; CHECK-NEXT: call void @foo() 106; CHECK-NEXT: br label [[JOIN2:%.*]] 107; CHECK: else2: 108; CHECK-NEXT: call void @use.i1(i1 [[C2]]) 109; CHECK-NEXT: call void @bar() 110; CHECK-NEXT: br label [[JOIN2]] 111; CHECK: join2: 112; CHECK-NEXT: ret void 113; 114 br i1 %c, label %if, label %else 115 116if: 117 call void @foo() 118 br label %join 119 120else: 121 call void @bar() 122 br label %join 123 124join: 125 %c2 = phi i1 [ true, %if ], [ false, %else ] 126 br i1 %c2, label %if2, label %else2 127 128if2: 129 call void @use.i1(i1 %c2) 130 call void @foo() 131 br label %join2 132 133else2: 134 call void @use.i1(i1 %c2) 135 call void @bar() 136 br label %join2 137 138join2: 139 ret void 140} 141 142define void @test_same_cond_simple(i1 %c) { 143; CHECK-LABEL: @test_same_cond_simple( 144; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] 145; CHECK: if: 146; CHECK-NEXT: call void @foo() 147; CHECK-NEXT: call void @foo() 148; CHECK-NEXT: br label [[JOIN2:%.*]] 149; CHECK: else: 150; CHECK-NEXT: call void @bar() 151; CHECK-NEXT: call void @bar() 152; CHECK-NEXT: br label [[JOIN2]] 153; CHECK: join2: 154; CHECK-NEXT: ret void 155; 156 br i1 %c, label %if, label %else 157 158if: 159 call void @foo() 160 br label %join 161 162else: 163 call void @bar() 164 br label %join 165 166join: 167 br i1 %c, label %if2, label %else2 168 169if2: 170 call void @foo() 171 br label %join2 172 173else2: 174 call void @bar() 175 br label %join2 176 177join2: 178 ret void 179} 180 181define void @test_same_cond_extra_use(i1 %c) { 182; CHECK-LABEL: @test_same_cond_extra_use( 183; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] 184; CHECK: if: 185; CHECK-NEXT: call void @foo() 186; CHECK-NEXT: call void @use.i1(i1 true) 187; CHECK-NEXT: call void @foo() 188; CHECK-NEXT: br label [[JOIN2:%.*]] 189; CHECK: else: 190; CHECK-NEXT: call void @bar() 191; CHECK-NEXT: call void @use.i1(i1 false) 192; CHECK-NEXT: call void @bar() 193; CHECK-NEXT: br label [[JOIN2]] 194; CHECK: join2: 195; CHECK-NEXT: ret void 196; 197 br i1 %c, label %if, label %else 198 199if: 200 call void @foo() 201 br label %join 202 203else: 204 call void @bar() 205 br label %join 206 207join: 208 call void @use.i1(i1 %c) 209 br i1 %c, label %if2, label %else2 210 211if2: 212 call void @foo() 213 br label %join2 214 215else2: 216 call void @bar() 217 br label %join2 218 219join2: 220 ret void 221} 222 223define void @test_same_cond_extra_use_different_block(i1 %c) { 224; CHECK-LABEL: @test_same_cond_extra_use_different_block( 225; CHECK-NEXT: br i1 [[C:%.*]], label [[IF:%.*]], label [[ELSE:%.*]] 226; CHECK: if: 227; CHECK-NEXT: call void @foo() 228; CHECK-NEXT: call void @use.i1(i1 [[C]]) 229; CHECK-NEXT: call void @foo() 230; CHECK-NEXT: br label [[JOIN2:%.*]] 231; CHECK: else: 232; CHECK-NEXT: call void @bar() 233; CHECK-NEXT: call void @use.i1(i1 [[C]]) 234; CHECK-NEXT: call void @bar() 235; CHECK-NEXT: br label [[JOIN2]] 236; CHECK: join2: 237; CHECK-NEXT: ret void 238; 239 br i1 %c, label %if, label %else 240 241if: 242 call void @foo() 243 br label %join 244 245else: 246 call void @bar() 247 br label %join 248 249join: 250 br i1 %c, label %if2, label %else2 251 252if2: 253 call void @use.i1(i1 %c) 254 call void @foo() 255 br label %join2 256 257else2: 258 call void @use.i1(i1 %c) 259 call void @bar() 260 br label %join2 261 262join2: 263 ret void 264} 265