xref: /llvm-project/llvm/test/CodeGen/SPARC/branches-v9.ll (revision c30c29188770d2981a3dca826768319e1138b124)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=sparcv9 -disable-sparc-leaf-proc | FileCheck %s
3
4;; 1. When emitting code for v9, CCR branches should always explicitly specify
5;;    %icc or %xcc.
6;; 2. Branches on the result of a 64-bit compare with constant zero should be
7;;    lowered into an instruction in the BPr class (§A.3 in V9 spec).
8;; 3. There should never be a `ba` that jumps into two instructions immediately
9;;    following it.
10
11define void @bricc(i32 signext %sel) {
12; CHECK-LABEL: bricc:
13; CHECK:         .cfi_startproc
14; CHECK-NEXT:  ! %bb.0: ! %entry
15; CHECK-NEXT:    save %sp, -176, %sp
16; CHECK-NEXT:    .cfi_def_cfa_register %fp
17; CHECK-NEXT:    .cfi_window_save
18; CHECK-NEXT:    .cfi_register %o7, %i7
19; CHECK-NEXT:    cmp %i0, 0
20; CHECK-NEXT:    be %icc, .LBB0_2
21; CHECK-NEXT:    nop
22; CHECK-NEXT:  ! %bb.1: ! %fbb
23; CHECK-NEXT:    call f2
24; CHECK-NEXT:    nop
25; CHECK-NEXT:    ba .LBB0_3
26; CHECK-NEXT:    nop
27; CHECK-NEXT:  .LBB0_2: ! %tbb
28; CHECK-NEXT:    call f1
29; CHECK-NEXT:    nop
30; CHECK-NEXT:  .LBB0_3: ! %end
31; CHECK-NEXT:    call f3
32; CHECK-NEXT:    nop
33; CHECK-NEXT:    ret
34; CHECK-NEXT:    restore
35entry:
36  %cond = icmp eq i32 %sel, 0
37  br i1 %cond, label %tbb, label %fbb
38
39fbb:
40  call void @f2()
41  br label %end
42
43tbb:
44  call void @f1()
45  br label %end
46
47end:
48  call void @f3()
49  ret void
50}
51
52define void @brxcc(i64 %sel) {
53; CHECK-LABEL: brxcc:
54; CHECK:         .cfi_startproc
55; CHECK-NEXT:  ! %bb.0: ! %entry
56; CHECK-NEXT:    save %sp, -176, %sp
57; CHECK-NEXT:    .cfi_def_cfa_register %fp
58; CHECK-NEXT:    .cfi_window_save
59; CHECK-NEXT:    .cfi_register %o7, %i7
60; CHECK-NEXT:    cmp %i0, 1
61; CHECK-NEXT:    bne %xcc, .LBB1_2
62; CHECK-NEXT:    nop
63; CHECK-NEXT:  ! %bb.1: ! %tbb
64; CHECK-NEXT:    call f1
65; CHECK-NEXT:    nop
66; CHECK-NEXT:    ba .LBB1_3
67; CHECK-NEXT:    nop
68; CHECK-NEXT:  .LBB1_2: ! %fbb
69; CHECK-NEXT:    call f2
70; CHECK-NEXT:    nop
71; CHECK-NEXT:  .LBB1_3: ! %end
72; CHECK-NEXT:    call f3
73; CHECK-NEXT:    nop
74; CHECK-NEXT:    ret
75; CHECK-NEXT:    restore
76entry:
77  ;; Using 1 here because compares with zero
78  ;; will be lowered into a `brz`, not `be`.
79  %cond = icmp eq i64 %sel, 1
80  br i1 %cond, label %tbb, label %fbb
81
82fbb:
83  call void @f2()
84  br label %end
85
86tbb:
87  call void @f1()
88  br label %end
89
90end:
91  call void @f3()
92  ret void
93}
94
95define void @brreg(i64 %sel) {
96; CHECK-LABEL: brreg:
97; CHECK:         .cfi_startproc
98; CHECK-NEXT:  ! %bb.0: ! %entry
99; CHECK-NEXT:    save %sp, -176, %sp
100; CHECK-NEXT:    .cfi_def_cfa_register %fp
101; CHECK-NEXT:    .cfi_window_save
102; CHECK-NEXT:    .cfi_register %o7, %i7
103; CHECK-NEXT:    brz %i0, .LBB2_2
104; CHECK-NEXT:    nop
105; CHECK-NEXT:  ! %bb.1: ! %fbb
106; CHECK-NEXT:    call f2
107; CHECK-NEXT:    nop
108; CHECK-NEXT:    ba .LBB2_3
109; CHECK-NEXT:    nop
110; CHECK-NEXT:  .LBB2_2: ! %tbb
111; CHECK-NEXT:    call f1
112; CHECK-NEXT:    nop
113; CHECK-NEXT:  .LBB2_3: ! %end
114; CHECK-NEXT:    call f3
115; CHECK-NEXT:    nop
116; CHECK-NEXT:    ret
117; CHECK-NEXT:    restore
118entry:
119  %cond = icmp eq i64 %sel, 0
120  br i1 %cond, label %tbb, label %fbb
121
122fbb:
123  call void @f2()
124  br label %end
125
126tbb:
127  call void @f1()
128  br label %end
129
130end:
131  call void @f3()
132  ret void
133}
134
135declare void @f1(...)
136
137declare void @f2(...)
138
139declare void @f3(...)
140
141