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