1; RUN: opt -simplifycfg -enable-mssa-loop-dependency -S --preserve-ll-uselistorder %s | FileCheck %s 2; REQUIRES: x86-registered-target 3; CHECK-LABEL: @n 4; CHECK: uselistorder i16 0, { 3, 2, 4, 1, 5, 0, 6 } 5 6; Note: test was added in an effort to ensure determinism when updating memoryssa. See PR42574. 7; If the uselistorder check becomes no longer relevant, the test can be disabled or removed. 8 9%rec9 = type { i16, i32, i32 } 10 11@a = global [1 x [1 x %rec9]] zeroinitializer 12 13define i16 @n() { 14 br label %..split_crit_edge 15 16..split_crit_edge: ; preds = %0 17 br label %.split 18 19bb4.us4: ; preds = %bb2.split.us32, %bb6.us28 20 %i.4.01.us5 = phi i16 [ %_tmp49.us30, %bb6.us28 ] 21 br label %g.exit4.us21 22 23bb1.i.us14: ; preds = %bb4.us4 24 br label %g.exit4.us21 25 26g.exit4.us21: ; preds = %bb1.i.us14, %g.exit4.critedge.us9 27 %i.4.02.us22 = phi i16 [ %i.4.01.us5, %bb4.us4 ], [ %i.4.01.us5, %bb1.i.us14 ] 28 br label %bb6.us28 29 30bb5.us26: ; preds = %g.exit4.us21 31 br label %bb6.us28 32 33bb6.us28: ; preds = %bb5.us26, %g.exit4.us21 34 %i.4.03.us29 = phi i16 [ %i.4.02.us22, %bb5.us26 ], [ %i.4.02.us22, %g.exit4.us21 ] 35 %_tmp49.us30 = add nuw nsw i16 %i.4.03.us29, 1 36 br label %bb4.us4 37 38bb4.us.us: ; preds = %bb2.split.us.us, %bb6.us.us 39 %i.4.01.us.us = phi i16 [ %_tmp49.us.us, %bb6.us.us ] 40 br label %bb1.i.us.us 41 42bb1.i.us.us: ; preds = %bb4.us.us 43 br label %g.exit4.us.us 44 45g.exit4.us.us: ; preds = %bb1.i.us.us, %g.exit4.critedge.us.us 46 %i.4.02.us.us = phi i16 [ %i.4.01.us.us, %bb1.i.us.us ] 47 br label %bb5.us.us 48 49bb5.us.us: ; preds = %g.exit4.us.us 50 br label %bb6.us.us 51 52bb6.us.us: ; preds = %bb5.us.us, %g.exit4.us.us 53 %i.4.03.us.us = phi i16 [ %i.4.02.us.us, %bb5.us.us ] 54 %_tmp49.us.us = add nuw nsw i16 %i.4.03.us.us, 1 55 br label %bb4.us.us 56 57 58.split: ; preds = %..split_crit_edge 59 br label %bb2 60 61bb2: ; preds = %.split, %bb7 62 %h.3.0 = phi i16 [ undef, %.split ], [ %_tmp53, %bb7 ] 63 br label %bb2.bb2.split_crit_edge 64 65bb2.bb2.split_crit_edge: ; preds = %bb2 66 br label %bb2.split 67 68bb2.split.us: ; preds = %bb2 69 br label %bb4.us 70 71bb4.us: ; preds = %bb6.us, %bb2.split.us 72 %i.4.01.us = phi i16 [ 0, %bb2.split.us ] 73 br label %bb1.i.us 74 75g.exit4.critedge.us: ; preds = %bb4.us 76 br label %g.exit4.us 77 78bb1.i.us: ; preds = %bb4.us 79 br label %g.exit4.us 80 81g.exit4.us: ; preds = %bb1.i.us, %g.exit4.critedge.us 82 %i.4.02.us = phi i16 [ %i.4.01.us, %g.exit4.critedge.us ], [ %i.4.01.us, %bb1.i.us ] 83 br label %bb5.us 84 85bb5.us: ; preds = %g.exit4.us 86 br label %bb7 87 88bb2.split: ; preds = %bb2.bb2.split_crit_edge 89 br label %bb4 90 91bb4: ; preds = %bb2.split, %bb6 92 %i.4.01 = phi i16 [ 0, %bb2.split ] 93 %_tmp16 = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.01, i32 0 94 %_tmp17 = load i16, i16* %_tmp16, align 1 95 br label %g.exit4.critedge 96 97bb1.i: ; preds = %bb4 98 br label %g.exit4 99 100g.exit4.critedge: ; preds = %bb4 101 %_tmp28.c = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.01, i32 1 102 %_tmp29.c = load i32, i32* %_tmp28.c, align 1 103 %_tmp30.c = trunc i32 %_tmp29.c to i16 104 br label %g.exit4 105 106g.exit4: ; preds = %g.exit4.critedge, %bb1.i 107 %i.4.02 = phi i16 [ %i.4.01, %g.exit4.critedge ], [ %i.4.01, %bb1.i ] 108 %_tmp41 = getelementptr [1 x [1 x %rec9]], [1 x [1 x %rec9]]* @a, i16 0, i16 %h.3.0, i16 %i.4.02, i32 2 109 br label %bb6 110 111bb5: ; preds = %g.exit4 112 br label %bb6 113 114bb6: ; preds = %bb5, %g.exit4 115 %i.4.03 = phi i16 [ %i.4.02, %bb5 ], [ %i.4.02, %g.exit4 ] 116 %_tmp49 = add nuw nsw i16 %i.4.03, 1 117 br label %bb7 118 119bb7: ; preds = %bb7.us-lcssa.us, %bb7.us-lcssa 120 %_tmp53 = add nsw i16 %h.3.0, 1 121 br label %bb2 122} 123