[ARM] Cortex-M4 schedule additions
[llvm-complete.git] / test / CodeGen / Mips / longbranch / compact-branches-long-branch.ll
blob709cd477a778e6006b27c0ad15cc95d1b912fcba
1 ; RUN: llc < %s -march=mips -mcpu=mips32r6 -force-mips-long-branch | FileCheck %s
3 ; Check that when MIPS32R6 with the static relocation model with the usage of
4 ; long branches, that there is a nop between any compact branch and the static
5 ; relocation method of expanding branches. Previously, it could result in 'j'
6 ; following a b(ne|eq)zc, which would raise a reserved instruction exception.
8 declare i32 @f(i32)
10 declare i32 @g()
12 ; CHECK-LABEL: test1:
13 ; CHECK:       bnezc
14 ; CHECK-NEXT:  nop
16 define i32 @test1(i32 %a) {
17 entry:
18   %0 = icmp eq i32 %a, 0
19   br i1 %0, label %cond.true, label %cond.false
20 cond.true:
21   %1 = call i32 @f(i32 %a)
22   ret i32 %1
23 cond.false:
24   %2 = call i32 @g()
25   ret i32 %2
28 ; CHECK-LABEL: test2:
29 ; CHECK:       bgezc
30 ; CHECK-NEXT:  nop
32 define i32 @test2(i32 %a) {
33 entry:
34   %0 = icmp sge i32 %a, 0
35   br i1 %0, label %cond.true, label %cond.false
36 cond.true:
37   %1 = call i32 @f(i32 %a)
38   ret i32 %1
39 cond.false:
40   %2 = call i32 @g()
41   ret i32 %2
44 ; CHECK-LABEL: test3:
45 ; CHECK:       blezc
46 ; CHECK-NEXT:  nop
48 define i32 @test3(i32 %a) {
49 entry:
50   %0 = icmp sle i32 %a, 0
51   br i1 %0, label %cond.true, label %cond.false
52 cond.true:
53   %1 = call i32 @f(i32 %a)
54   ret i32 %1
55 cond.false:
56   %2 = call i32 @g()
57   ret i32 %2
60 ; CHECK-LABEL: test4:
61 ; CHECK:       bgtzc
62 ; CHECK-NEXT:  nop
64 define i32 @test4(i32 %a) {
65 entry:
66   %0 = icmp sgt i32 %a, 0
67   br i1 %0, label %cond.true, label %cond.false
68 cond.true:
69   %1 = call i32 @f(i32 %a)
70   ret i32 %1
71 cond.false:
72   %2 = call i32 @g()
73   ret i32 %2
76 ; CHECK-LABEL: test5:
77 ; CHECK:       bgezc
78 ; CHECK-NEXT:  nop
80 define i32 @test5(i32 %a) {
81 entry:
82   %0 = icmp slt i32 %a, 0
83   br i1 %0, label %cond.true, label %cond.false
84 cond.true:
85   %1 = call i32 @f(i32 %a)
86   ret i32 %1
87 cond.false:
88   %2 = call i32 @g()
89   ret i32 %2
92 ; CHECK-LABEL: test6:
93 ; CHECK:       bnezc
94 ; CHECK-NEXT:  nop
96 define i32 @test6(i32 %a, i32 %b) {
97 entry:
98   %0 = icmp ugt i32 %a, %b
99   br i1 %0, label %cond.true, label %cond.false
100 cond.true:
101   %1 = call i32 @f(i32 %a)
102   ret i32 %1
103 cond.false:
104   %2 = call i32 @g()
105   ret i32 %2
108 ; CHECK-LABEL: test7:
109 ; CHECK:       beqzc
110 ; CHECK-NEXT:  nop
112 define i32 @test7(i32 %a, i32 %b) {
113 entry:
114   %0 = icmp uge i32 %a, %b
115   br i1 %0, label %cond.true, label %cond.false
116 cond.true:
117   %1 = call i32 @f(i32 %a)
118   ret i32 %1
119 cond.false:
120   %2 = call i32 @g()
121   ret i32 %2
124 ; CHECK-LABEL: test8:
125 ; CHECK:       bnezc
126 ; CHECK-NEXT:  nop
128 define i32 @test8(i32 %a, i32 %b) {
129 entry:
130   %0 = icmp ult i32 %a, %b
131   br i1 %0, label %cond.true, label %cond.false
132 cond.true:
133   %1 = call i32 @f(i32 %a)
134   ret i32 %1
135 cond.false:
136   %2 = call i32 @g()
137   ret i32 %2
140 ; CHECK-LABEL: test9:
141 ; CHECK:       beqzc
142 ; CHECK-NEXT:  nop
144 define i32 @test9(i32 %a, i32 %b) {
145 entry:
146   %0 = icmp ule i32 %a, %b
147   br i1 %0, label %cond.true, label %cond.false
148 cond.true:
149   %1 = call i32 @f(i32 %a)
150   ret i32 %1
151 cond.false:
152   %2 = call i32 @g()
153   ret i32 %2