1; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -disable-lsr -pre-RA-sched=source -enable-misched -verify-machineinstrs | FileCheck %s
2
3; Verify that TEST+JE are scheduled together.
4; CHECK: test_je
5; CHECK: %loop
6; CHECK: test
7; CHECK-NEXT: je
8define void @test_je() {
9entry:
10  br label %loop
11
12loop:
13  %var = phi i32* [ null, %entry ], [ %next.load, %loop1 ], [ %var, %loop2 ]
14  %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2 ]
15  br label %loop1
16
17loop1:
18  %cond = icmp eq i32* %var, null
19  %next.load = load i32** %next.ptr
20  br i1 %cond, label %loop, label %loop2
21
22loop2:                                           ; preds = %loop1
23  %gep = getelementptr inbounds i32** %next.ptr, i32 1
24  store i32* %next.load, i32** undef
25  br label %loop
26}
27
28; Verify that DEC+JE are scheduled together.
29; CHECK: dec_je
30; CHECK: %loop1
31; CHECK: dec
32; CHECK-NEXT: je
33define void @dec_je() {
34entry:
35  br label %loop
36
37loop:
38  %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2 ]
39  %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2 ]
40  br label %loop1
41
42loop1:
43  %var2 = sub i32 %var, 1
44  %cond = icmp eq i32 %var2, 0
45  %next.load = load i32** %next.ptr
46  %next.var = load i32* %next.load
47  br i1 %cond, label %loop, label %loop2
48
49loop2:
50  %gep = getelementptr inbounds i32** %next.ptr, i32 1
51  store i32* %next.load, i32** undef
52  br label %loop
53}
54
55; DEC+JS should *not* be scheduled together.
56; CHECK: dec_js
57; CHECK: %loop1
58; CHECK: dec
59; CHECK: mov
60; CHECK: js
61define void @dec_js() {
62entry:
63  br label %loop2a
64
65loop2a:                                           ; preds = %loop1, %body, %entry
66  %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2b ]
67  %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2b ]
68  br label %loop1
69
70loop1:                                            ; preds = %loop2a, %loop2b
71  %var2 = sub i32 %var, 1
72  %cond = icmp slt i32 %var2, 0
73  %next.load = load i32** %next.ptr
74  %next.var = load i32* %next.load
75  br i1 %cond, label %loop2a, label %loop2b
76
77loop2b:                                           ; preds = %loop1
78  %gep = getelementptr inbounds i32** %next.ptr, i32 1
79  store i32* %next.load, i32** undef
80  br label %loop2a
81}
82
83; Verify that CMP+JB are scheduled together.
84; CHECK: cmp_jb
85; CHECK: %loop1
86; CHECK: cmp
87; CHECK-NEXT: jb
88define void @cmp_jb(i32 %n) {
89entry:
90  br label %loop2a
91
92loop2a:                                           ; preds = %loop1, %body, %entry
93  %var = phi i32 [ 0, %entry ], [ %next.var, %loop1 ], [ %var2, %loop2b ]
94  %next.ptr = phi i32** [ null, %entry ], [ %next.ptr, %loop1 ], [ %gep, %loop2b ]
95  br label %loop1
96
97loop1:                                            ; preds = %loop2a, %loop2b
98  %var2 = sub i32 %var, 1
99  %cond = icmp ult i32 %var2, %n
100  %next.load = load i32** %next.ptr
101  %next.var = load i32* %next.load
102  br i1 %cond, label %loop2a, label %loop2b
103
104loop2b:                                           ; preds = %loop1
105  %gep = getelementptr inbounds i32** %next.ptr, i32 1
106  store i32* %next.load, i32** undef
107  br label %loop2a
108}
109