1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=print-mustexecute -disable-output 2>&1 | FileCheck %s --check-prefix=ME 3; RUN: opt < %s -passes=print-must-be-executed-contexts -disable-output 2>&1 | FileCheck %s --check-prefix=MBEC 4; 5; void simple_conditional(int c) { 6; A(); 7; B(); 8; if (c) { 9; C(); 10; D(); 11; } 12; E(); 13; F(); 14; G(); 15; } 16; 17; Best result: 18; Start Instruction | Visit Set 19; A | A, B, E, F 20; B | A, B, E, F 21; C | A, B, C, D, E, F 22; D | A, B, C, D, E, F 23; E | A, B, E, F 24; F | A, B, E, F 25; G | A, B, E, F, G 26; 27; 28; There are no loops so print-mustexec will not do anything. 29; ME-NOT: mustexec 30; 31define void @simple_conditional(i32 %arg) { 32bb: 33 call void @A() 34; MBEC: -- Explore context of: call void @A() 35; MBEC-NEXT: [F: simple_conditional] call void @A() 36; MBEC-NEXT: [F: simple_conditional] call void @B() 37; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 38; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 39; MBEC-NEXT: [F: simple_conditional] call void @E() 40; MBEC-NEXT: [F: simple_conditional] call void @F() 41; MBEC-NOT: call 42 43 call void @B() 44; MBEC: -- Explore context of: call void @B() 45; MBEC-NEXT: [F: simple_conditional] call void @B() 46; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 47; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 48; MBEC-NEXT: [F: simple_conditional] call void @E() 49; MBEC-NEXT: [F: simple_conditional] call void @F() 50; MBEC-NEXT: [F: simple_conditional] call void @A() 51; MBEC-NOT: call 52; MBEC: -- Explore context of: %tmp 53 54 %tmp = icmp eq i32 %arg, 0 55 br i1 %tmp, label %bb2, label %bb1 56 57bb1: ; preds = %bb 58 call void @C() 59; MBEC: -- Explore context of: call void @C() 60; MBEC-NEXT: [F: simple_conditional] call void @C() 61; MBEC-NEXT: [F: simple_conditional] call void @D() 62; MBEC-NEXT: [F: simple_conditional] br label %bb2 63; MBEC-NEXT: [F: simple_conditional] call void @E() 64; MBEC-NEXT: [F: simple_conditional] call void @F() 65; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 66; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 67; MBEC-NEXT: [F: simple_conditional] call void @B() 68; MBEC-NEXT: [F: simple_conditional] call void @A() 69; MBEC-NOT: call 70 71 call void @D() 72; MBEC: -- Explore context of: call void @D() 73; MBEC-NEXT: [F: simple_conditional] call void @D() 74; MBEC-NEXT: [F: simple_conditional] br label %bb2 75; MBEC-NEXT: [F: simple_conditional] call void @E() 76; MBEC-NEXT: [F: simple_conditional] call void @F() 77; MBEC-NEXT: [F: simple_conditional] call void @C() 78; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 79; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 80; MBEC-NEXT: [F: simple_conditional] call void @B() 81; MBEC-NEXT: [F: simple_conditional] call void @A() 82; MBEC-NOT: call 83; MBEC: -- Explore context of: br 84 85 br label %bb2 86 87bb2: ; preds = %bb, %bb1 88 call void @E() 89; MBEC: -- Explore context of: call void @E() 90; MBEC-NEXT: [F: simple_conditional] call void @E() 91; MBEC-NEXT: [F: simple_conditional] call void @F() 92; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 93; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 94; MBEC-NEXT: [F: simple_conditional] call void @B() 95; MBEC-NEXT: [F: simple_conditional] call void @A() 96; MBEC-NOT: call 97 98 call void @F() ; might not return! 99; MBEC: -- Explore context of: call void @F() 100; MBEC-NEXT: [F: simple_conditional] call void @F() 101; MBEC-NEXT: [F: simple_conditional] call void @E() 102; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 103; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 104; MBEC-NEXT: [F: simple_conditional] call void @B() 105; MBEC-NEXT: [F: simple_conditional] call void @A() 106; MBEC-NOT: call 107 108 call void @G() 109; MBEC: -- Explore context of: call void @G() 110; MBEC-NEXT: [F: simple_conditional] call void @G() 111; MBEC-NEXT: [F: simple_conditional] ret void 112; MBEC-NEXT: [F: simple_conditional] call void @F() 113; MBEC-NEXT: [F: simple_conditional] call void @E() 114; MBEC-NEXT: [F: simple_conditional] br i1 %tmp, label %bb2, label %bb1 115; MBEC-NEXT: [F: simple_conditional] %tmp = icmp eq i32 %arg, 0 116; MBEC-NEXT: [F: simple_conditional] call void @B() 117; MBEC-NEXT: [F: simple_conditional] call void @A() 118; MBEC-NOT: call 119; MBEC: -- Explore context of: ret 120 121 ret void 122} 123 124 125; void complex_loops_and_control(int c, int d) { 126; A(); 127; while (1) { 128; B(); 129; if (++c == d) 130; C(); 131; if (++c == d) 132; continue; 133; D(); 134; if (++c == d) 135; break; 136; do { 137; if (++c == d) 138; continue; 139; E(); 140; } while (++c == d); 141; F(); 142; } 143; G(); 144; } 145; 146; Best result: 147; Start Instruction | Visit Set 148; A | A, B 149; B | A, B 150; C | A, B, C 151; D | A, B, D 152; E | A, B, D, E, F 153; F | A, B, D, F 154; G | A, B, D, G 155; 156; 157; ME: define void @complex_loops_and_control 158define void @complex_loops_and_control(i32 %arg, i32 %arg1) { 159bb: 160 call void @A() 161; ME: call void @A() 162; ME-NOT: mustexec 163; ME-NEXT: br 164; MBEC: -- Explore context of: call void @A() 165; MBEC-NEXT: [F: complex_loops_and_control] call void @A() 166; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 167; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 168; MBEC-NEXT: [F: complex_loops_and_control] call void @B() 169; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 170; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 171; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 172; MBEC-NOT: call 173; MBEC: -- Explore context of: br 174 br label %bb2 175 176bb2: ; preds = %.backedge, %bb 177 %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 178 call void @B() 179; ME: call void @B() ; (mustexec in: bb2) 180; MBEC: -- Explore context of: call void @B() 181; MBEC-NEXT: [F: complex_loops_and_control] call void @B() 182; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 183; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 184; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 185; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 186; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 187; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 188; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 189; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 190; MBEC-NEXT: [F: complex_loops_and_control] call void @A() 191; MBEC-NOT: call 192; MBEC: -- Explore context of: %tmp 193 %tmp = add nsw i32 %.0, 1 194 %tmp3 = icmp eq i32 %tmp, %arg1 195 br i1 %tmp3, label %bb4, label %bb5 196 197bb4: ; preds = %bb2 198 call void @C() 199; ME: call void @C() 200; ME-NOT: mustexec 201; ME-NEXT: br 202; MBEC: -- Explore context of: call void @C() 203; MBEC-NEXT: [F: complex_loops_and_control] call void @C() 204; MBEC-NEXT: [F: complex_loops_and_control] br label %bb5 205; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 206; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 207; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 208; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 209; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 210; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 211; MBEC-NEXT: [F: complex_loops_and_control] call void @B() 212; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 213; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 214; MBEC-NEXT: [F: complex_loops_and_control] call void @A() 215; MBEC-NOT: call 216; MBEC: -- Explore context of: br 217 br label %bb5 218 219bb5: ; preds = %bb4, %bb2 220 %tmp6 = add nsw i32 %.0, 2 221 %tmp7 = icmp eq i32 %tmp6, %arg1 222 br i1 %tmp7, label %bb8, label %bb9 223 224bb8: ; preds = %bb5 225 br label %.backedge 226 227.backedge: ; preds = %bb8, %bb22 228 %.0.be = phi i32 [ %tmp6, %bb8 ], [ %.lcssa, %bb22 ] 229 br label %bb2 230 231bb9: ; preds = %bb5 232 call void @D() 233; ME: call void @D() 234; ME-NOT: mustexec 235; ME-NEXT: %tmp10 236; MBEC: -- Explore context of: call void @D() 237; MBEC-NEXT: [F: complex_loops_and_control] call void @D() 238; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 239; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 240; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 241; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 242; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 243; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 244; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 245; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 246; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 247; MBEC-NEXT: [F: complex_loops_and_control] call void @B() 248; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 249; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 250; MBEC-NEXT: [F: complex_loops_and_control] call void @A() 251; MBEC-NOT: call 252; MBEC: -- Explore context of: %tmp10 253 %tmp10 = add nsw i32 %.0, 3 254 %tmp11 = icmp eq i32 %tmp10, %arg1 255 br i1 %tmp11, label %bb12, label %bb13 256 257bb12: ; preds = %bb9 258 br label %bb23 259 260bb13: ; preds = %bb9 261 br label %bb14 262 263bb14: ; preds = %bb19, %bb13 264 %.1 = phi i32 [ %tmp10, %bb13 ], [ %tmp20, %bb19 ] 265 %tmp15 = add nsw i32 %.1, 1 266 %tmp16 = icmp eq i32 %tmp15, %arg1 267 br i1 %tmp16, label %bb17, label %bb18 268 269bb17: ; preds = %bb14 270 br label %bb19 271 272bb18: ; preds = %bb14 273 call void @E() 274; ME: call void @E() 275; ME-NOT: mustexec 276; ME-NEXT: br 277; FIXME: Missing F 278; MBEC: -- Explore context of: call void @E() 279; MBEC-NEXT: [F: complex_loops_and_control] call void @E() 280; MBEC-NEXT: [F: complex_loops_and_control] br label %bb19 281; MBEC-NEXT: [F: complex_loops_and_control] %tmp20 = add nsw i32 %.1, 2 282; MBEC-NEXT: [F: complex_loops_and_control] %tmp21 = icmp eq i32 %tmp20, %arg1 283; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp21, label %bb14, label %bb22 284; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp16, label %bb17, label %bb18 285; MBEC-NEXT: [F: complex_loops_and_control] %tmp16 = icmp eq i32 %tmp15, %arg1 286; MBEC-NEXT: [F: complex_loops_and_control] %tmp15 = add nsw i32 %.1, 1 287; MBEC-NEXT: [F: complex_loops_and_control] %.1 = phi i32 [ %tmp10, %bb13 ], [ %tmp20, %bb19 ] 288; MBEC-NEXT: [F: complex_loops_and_control] br label %bb14 289; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 290; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 291; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 292; MBEC-NEXT: [F: complex_loops_and_control] call void @D() 293; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 294; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 295; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 296; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 297; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 298; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 299; MBEC-NEXT: [F: complex_loops_and_control] call void @B() 300; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 301; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 302; MBEC-NEXT: [F: complex_loops_and_control] call void @A() 303; MBEC-NOT: call 304; MBEC: -- Explore context of: br 305 br label %bb19 306 307bb19: ; preds = %bb18, %bb17 308 %tmp20 = add nsw i32 %.1, 2 309 %tmp21 = icmp eq i32 %tmp20, %arg1 310 br i1 %tmp21, label %bb14, label %bb22 311 312bb22: ; preds = %bb19 313 %.lcssa = phi i32 [ %tmp20, %bb19 ] 314 call void @F() 315; ME: call void @F() 316; ME-NOT: mustexec 317; ME-NEXT: br 318; MBEC: -- Explore context of: call void @F() 319; MBEC-NEXT: [F: complex_loops_and_control] call void @F() 320; MBEC-NEXT: [F: complex_loops_and_control] %.lcssa = phi i32 [ %tmp20, %bb19 ] 321; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp21, label %bb14, label %bb22 322; MBEC-NEXT: [F: complex_loops_and_control] %tmp21 = icmp eq i32 %tmp20, %arg1 323; MBEC-NEXT: [F: complex_loops_and_control] %tmp20 = add nsw i32 %.1, 2 324; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp16, label %bb17, label %bb18 325; MBEC-NEXT: [F: complex_loops_and_control] %tmp16 = icmp eq i32 %tmp15, %arg1 326; MBEC-NEXT: [F: complex_loops_and_control] %tmp15 = add nsw i32 %.1, 1 327; MBEC-NEXT: [F: complex_loops_and_control] %.1 = phi i32 [ %tmp10, %bb13 ], [ %tmp20, %bb19 ] 328; MBEC-NEXT: [F: complex_loops_and_control] br label %bb14 329; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 330; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 331; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 332; MBEC-NEXT: [F: complex_loops_and_control] call void @D() 333; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 334; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 335; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 336; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 337; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 338; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 339; MBEC-NEXT: [F: complex_loops_and_control] call void @B() 340; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 341; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 342; MBEC-NEXT: [F: complex_loops_and_control] call void @A() 343; MBEC-NOT: call 344; MBEC: -- Explore context of: br 345 br label %.backedge 346 347bb23: ; preds = %bb12 348 call void @G() 349; ME: call void @G() 350; ME-NOT: mustexec 351; ME-NEXT: ret 352; MBEC: -- Explore context of: call void @G() 353; MBEC-NEXT: [F: complex_loops_and_control] call void @G() 354; MBEC-NEXT: [F: complex_loops_and_control] ret void 355; MBEC-NEXT: [F: complex_loops_and_control] br label %bb23 356; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp11, label %bb12, label %bb13 357; MBEC-NEXT: [F: complex_loops_and_control] %tmp11 = icmp eq i32 %tmp10, %arg1 358; MBEC-NEXT: [F: complex_loops_and_control] %tmp10 = add nsw i32 %.0, 3 359; MBEC-NEXT: [F: complex_loops_and_control] call void @D() 360; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp7, label %bb8, label %bb9 361; MBEC-NEXT: [F: complex_loops_and_control] %tmp7 = icmp eq i32 %tmp6, %arg1 362; MBEC-NEXT: [F: complex_loops_and_control] %tmp6 = add nsw i32 %.0, 2 363; MBEC-NEXT: [F: complex_loops_and_control] br i1 %tmp3, label %bb4, label %bb5 364; MBEC-NEXT: [F: complex_loops_and_control] %tmp3 = icmp eq i32 %tmp, %arg1 365; MBEC-NEXT: [F: complex_loops_and_control] %tmp = add nsw i32 %.0, 1 366; MBEC-NEXT: [F: complex_loops_and_control] call void @B() 367; MBEC-NEXT: [F: complex_loops_and_control] %.0 = phi i32 [ %arg, %bb ], [ %.0.be, %.backedge ] 368; MBEC-NEXT: [F: complex_loops_and_control] br label %bb2 369; MBEC-NEXT: [F: complex_loops_and_control] call void @A() 370; MBEC-NOT: call 371; MBEC: -- Explore context of: ret 372 ret void 373} 374 375declare void @A() nounwind willreturn 376 377declare void @B() nounwind willreturn 378 379declare void @C() nounwind willreturn 380 381declare void @D() nounwind willreturn 382 383declare void @E() nounwind willreturn 384 385declare void @F() nounwind 386 387declare void @G() nounwind willreturn 388 389declare i32 @g(ptr) nounwind willreturn 390 391declare void @h(ptr) nounwind willreturn 392 393define i32 @nonnull_exec_ctx_1(ptr %a, i32 %b) { 394; MBEC: -- Explore context of: %tmp3 = icmp eq i32 %b, 0 395; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 396; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 397; MBEC-NEXT: -- Explore context of: br i1 %tmp3, label %ex, label %hd 398; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 399; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 400; MBEC-NEXT: -- Explore context of: %tmp5 = tail call i32 @g(ptr nonnull %a) 401; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp5 = tail call i32 @g(ptr nonnull %a) 402; MBEC-NEXT: [F: nonnull_exec_ctx_1] ret i32 %tmp5 403; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 404; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 405; MBEC-NEXT: -- Explore context of: ret i32 %tmp5 406; MBEC-NEXT: [F: nonnull_exec_ctx_1] ret i32 %tmp5 407; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp5 = tail call i32 @g(ptr nonnull %a) 408; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 409; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 410; MBEC-NEXT: -- Explore context of: %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 411; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 412; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(ptr %a) 413; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 414; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b 415; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd 416; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 417; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 418; MBEC-NEXT: -- Explore context of: tail call void @h(ptr %a) 419; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(ptr %a) 420; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 421; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b 422; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd 423; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 424; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 425; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 426; MBEC-NEXT: -- Explore context of: %tmp8 = add nuw i32 %tmp7, 1 427; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 428; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b 429; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd 430; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(ptr %a) 431; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 432; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 433; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 434; MBEC-NEXT: -- Explore context of: %tmp9 = icmp eq i32 %tmp8, %b 435; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b 436; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd 437; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 438; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(ptr %a) 439; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 440; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 441; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 442; MBEC-NEXT: -- Explore context of: br i1 %tmp9, label %ex, label %hd 443; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp9, label %ex, label %hd 444; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp9 = icmp eq i32 %tmp8, %b 445; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp8 = add nuw i32 %tmp7, 1 446; MBEC-NEXT: [F: nonnull_exec_ctx_1] tail call void @h(ptr %a) 447; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 448; MBEC-NEXT: [F: nonnull_exec_ctx_1] br i1 %tmp3, label %ex, label %hd 449; MBEC-NEXT: [F: nonnull_exec_ctx_1] %tmp3 = icmp eq i32 %b, 0 450en: 451 %tmp3 = icmp eq i32 %b, 0 452 br i1 %tmp3, label %ex, label %hd 453 454ex: 455 %tmp5 = tail call i32 @g(ptr nonnull %a) 456 ret i32 %tmp5 457 458hd: 459 %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 460 tail call void @h(ptr %a) 461 %tmp8 = add nuw i32 %tmp7, 1 462 %tmp9 = icmp eq i32 %tmp8, %b 463 br i1 %tmp9, label %ex, label %hd 464} 465 466define i32 @nonnull_exec_ctx_2(ptr %a, i32 %b) nounwind willreturn { 467; MBEC: -- Explore context of: %tmp3 = icmp eq i32 %b, 0 468; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 469; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 470; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 471; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 472; MBEC-NEXT: -- Explore context of: br i1 %tmp3, label %ex, label %hd 473; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 474; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 475; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 476; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 477; MBEC-NEXT: -- Explore context of: %tmp5 = tail call i32 @g(ptr nonnull %a) 478; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 479; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 480; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 481; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 482; MBEC-NEXT: -- Explore context of: ret i32 %tmp5 483; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 484; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 485; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 486; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 487; MBEC-NEXT: -- Explore context of: %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 488; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 489; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(ptr %a) 490; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 491; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b 492; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd 493; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 494; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 495; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 496; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 497; MBEC-NEXT: -- Explore context of: tail call void @h(ptr %a) 498; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(ptr %a) 499; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 500; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b 501; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd 502; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 503; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 504; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 505; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 506; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 507; MBEC-NEXT: -- Explore context of: %tmp8 = add nuw i32 %tmp7, 1 508; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 509; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b 510; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd 511; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 512; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 513; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(ptr %a) 514; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 515; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 516; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 517; MBEC-NEXT: -- Explore context of: %tmp9 = icmp eq i32 %tmp8, %b 518; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b 519; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd 520; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 521; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 522; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 523; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(ptr %a) 524; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 525; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 526; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 527; MBEC-NEXT: -- Explore context of: br i1 %tmp9, label %ex, label %hd 528; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp9, label %ex, label %hd 529; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp5 = tail call i32 @g(ptr nonnull %a) 530; MBEC-NEXT: [F: nonnull_exec_ctx_2] ret i32 %tmp5 531; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp9 = icmp eq i32 %tmp8, %b 532; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp8 = add nuw i32 %tmp7, 1 533; MBEC-NEXT: [F: nonnull_exec_ctx_2] tail call void @h(ptr %a) 534; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 535; MBEC-NEXT: [F: nonnull_exec_ctx_2] br i1 %tmp3, label %ex, label %hd 536; MBEC-NEXT: [F: nonnull_exec_ctx_2] %tmp3 = icmp eq i32 %b, 0 537en: 538 %tmp3 = icmp eq i32 %b, 0 539 br i1 %tmp3, label %ex, label %hd 540 541ex: 542 %tmp5 = tail call i32 @g(ptr nonnull %a) 543 ret i32 %tmp5 544 545hd: 546 %tmp7 = phi i32 [ %tmp8, %hd ], [ 0, %en ] 547 tail call void @h(ptr %a) 548 %tmp8 = add nuw i32 %tmp7, 1 549 %tmp9 = icmp eq i32 %tmp8, %b 550 br i1 %tmp9, label %ex, label %hd 551} 552