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