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