1# REQUIRES: x86
2## basic-block-sections tests.
3## This simple test checks if redundant direct jumps are converted to
4## implicit fallthrus.  The jcc's must be converted to their inverted
5## opcode, for instance jne to je and jmp must be deleted.
6
7# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
8# RUN: ld.lld  --optimize-bb-jumps %t.o -o %t.out
9# RUN: llvm-objdump -d %t.out| FileCheck %s
10
11# CHECK:      <foo>:
12# CHECK-NEXT:  nopl    (%rax)
13# CHECK-NEXT:  jne      0x{{[[:xdigit:]]+}} <r.BB.foo>
14# CHECK-NOT:   jmp
15
16
17.section	.text,"ax",@progbits
18.type	foo,@function
19foo:
20 nopl (%rax)
21 je	a.BB.foo
22 jmp	r.BB.foo
23
24# CHECK:      <a.BB.foo>:
25# CHECK-NEXT:  nopl (%rax)
26# CHECK-NEXT:  je 0x{{[[:xdigit:]]+}} <r.BB.foo>
27# CHECK-NOT:   jmp
28
29.section	.text,"ax",@progbits,unique,3
30a.BB.foo:
31 nopl (%rax)
32 jne	aa.BB.foo
33 jmp	r.BB.foo
34
35# CHECK:      <aa.BB.foo>:
36# CHECK-NEXT:  nopl (%rax)
37# CHECK-NEXT:  jle 0x{{[[:xdigit:]]+}} <r.BB.foo>
38# CHECK-NOT:   jmp
39#
40.section	.text,"ax",@progbits,unique,4
41aa.BB.foo:
42 nopl (%rax)
43 jg	aaa.BB.foo
44 jmp	r.BB.foo
45
46# CHECK:      <aaa.BB.foo>:
47# CHECK-NEXT:  nopl (%rax)
48# CHECK-NEXT:  jl 0x{{[[:xdigit:]]+}} <r.BB.foo>
49# CHECK-NOT:   jmp
50#
51.section	.text,"ax",@progbits,unique,5
52aaa.BB.foo:
53 nopl (%rax)
54 jge	aaaa.BB.foo
55 jmp	r.BB.foo
56
57# CHECK:      <aaaa.BB.foo>:
58# CHECK-NEXT:  nopl (%rax)
59# CHECK-NEXT:  jae 0x{{[[:xdigit:]]+}} <r.BB.foo>
60# CHECK-NOT:   jmp
61#
62.section	.text,"ax",@progbits,unique,6
63aaaa.BB.foo:
64 nopl (%rax)
65 jb	aaaaa.BB.foo
66 jmp	r.BB.foo
67
68# CHECK:      <aaaaa.BB.foo>:
69# CHECK-NEXT:  nopl (%rax)
70# CHECK-NEXT:  ja 0x{{[[:xdigit:]]+}} <r.BB.foo>
71# CHECK-NOT:   jmp
72#
73.section	.text,"ax",@progbits,unique,7
74aaaaa.BB.foo:
75 nopl (%rax)
76 jbe	aaaaaa.BB.foo
77 jmp	r.BB.foo
78
79# CHECK:      <aaaaaa.BB.foo>:
80# CHECK-NEXT:  nopl (%rax)
81# CHECK-NEXT:  jge 0x{{[[:xdigit:]]+}} <r.BB.foo>
82# CHECK-NOT:   jmp
83#
84.section	.text,"ax",@progbits,unique,8
85aaaaaa.BB.foo:
86 nopl (%rax)
87 jl	aaaaaaa.BB.foo
88 jmp	r.BB.foo
89
90# CHECK:      <aaaaaaa.BB.foo>:
91# CHECK-NEXT:  nopl (%rax)
92# CHECK-NEXT:  jg 0x{{[[:xdigit:]]+}} <r.BB.foo>
93# CHECK-NOT:   jmp
94#
95.section	.text,"ax",@progbits,unique,9
96aaaaaaa.BB.foo:
97 nopl (%rax)
98 jle	aaaaaaaa.BB.foo
99 jmp	r.BB.foo
100
101# CHECK:      <aaaaaaaa.BB.foo>:
102# CHECK-NEXT:  nopl (%rax)
103# CHECK-NEXT:  jbe 0x{{[[:xdigit:]]+}} <r.BB.foo>
104# CHECK-NOT:   jmp
105#
106.section	.text,"ax",@progbits,unique,10
107aaaaaaaa.BB.foo:
108 nopl (%rax)
109 ja	aaaaaaaaa.BB.foo
110 jmp	r.BB.foo
111
112# CHECK:      <aaaaaaaaa.BB.foo>:
113# CHECK-NEXT:  nopl (%rax)
114# CHECK-NEXT:  jb 0x{{[[:xdigit:]]+}} <r.BB.foo>
115# CHECK-NOT:   jmp
116#
117.section	.text,"ax",@progbits,unique,11
118aaaaaaaaa.BB.foo:
119 nopl (%rax)
120 jae	aaaaaaaaaa.BB.foo
121 jmp	r.BB.foo
122
123.section	.text,"ax",@progbits,unique,20
124aaaaaaaaaa.BB.foo:
125 nopl (%rax)
126
127r.BB.foo:
128 ret
129