xref: /llvm-project/llvm/test/CodeGen/RISCV/GlobalISel/phi.ll (revision ab0dc290bca14b8a13540a846724dcd034397f5d)
1*ab0dc290SCraig Topper; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2*ab0dc290SCraig Topper; RUN: llc -mtriple=riscv32 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV32
3*ab0dc290SCraig Topper; RUN: llc -mtriple=riscv64 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV64
4*ab0dc290SCraig Topper; RUN: llc -mtriple=riscv32 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV32
5*ab0dc290SCraig Topper; RUN: llc -mtriple=riscv64 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV64
6*ab0dc290SCraig Topper
7*ab0dc290SCraig Topperdefine i1 @phi_i1(i1 %cnd, i1 %a, i1 %b) {
8*ab0dc290SCraig Topper; CHECK-LABEL: phi_i1:
9*ab0dc290SCraig Topper; CHECK:       # %bb.0: # %entry
10*ab0dc290SCraig Topper; CHECK-NEXT:    mv a3, a0
11*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a1
12*ab0dc290SCraig Topper; CHECK-NEXT:    andi a3, a3, 1
13*ab0dc290SCraig Topper; CHECK-NEXT:    bnez a3, .LBB0_2
14*ab0dc290SCraig Topper; CHECK-NEXT:  # %bb.1: # %cond.false
15*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a2
16*ab0dc290SCraig Topper; CHECK-NEXT:  .LBB0_2: # %cond.end
17*ab0dc290SCraig Topper; CHECK-NEXT:    ret
18*ab0dc290SCraig Topperentry:
19*ab0dc290SCraig Topper  br i1 %cnd, label %cond.end, label %cond.false
20*ab0dc290SCraig Topper
21*ab0dc290SCraig Toppercond.false:                                       ; preds = %entry
22*ab0dc290SCraig Topper  br label %cond.end
23*ab0dc290SCraig Topper
24*ab0dc290SCraig Toppercond.end:                                         ; preds = %entry, %cond.false
25*ab0dc290SCraig Topper  %cond = phi i1 [ %b, %cond.false ], [ %a, %entry ]
26*ab0dc290SCraig Topper  ret i1 %cond
27*ab0dc290SCraig Topper}
28*ab0dc290SCraig Topper
29*ab0dc290SCraig Topperdefine i8 @phi_i8(i1 %cnd, i8 %a, i8 %b) {
30*ab0dc290SCraig Topper; CHECK-LABEL: phi_i8:
31*ab0dc290SCraig Topper; CHECK:       # %bb.0: # %entry
32*ab0dc290SCraig Topper; CHECK-NEXT:    mv a3, a0
33*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a1
34*ab0dc290SCraig Topper; CHECK-NEXT:    andi a3, a3, 1
35*ab0dc290SCraig Topper; CHECK-NEXT:    bnez a3, .LBB1_2
36*ab0dc290SCraig Topper; CHECK-NEXT:  # %bb.1: # %cond.false
37*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a2
38*ab0dc290SCraig Topper; CHECK-NEXT:  .LBB1_2: # %cond.end
39*ab0dc290SCraig Topper; CHECK-NEXT:    ret
40*ab0dc290SCraig Topperentry:
41*ab0dc290SCraig Topper  br i1 %cnd, label %cond.end, label %cond.false
42*ab0dc290SCraig Topper
43*ab0dc290SCraig Toppercond.false:                                       ; preds = %entry
44*ab0dc290SCraig Topper  br label %cond.end
45*ab0dc290SCraig Topper
46*ab0dc290SCraig Toppercond.end:                                         ; preds = %entry, %cond.false
47*ab0dc290SCraig Topper  %cond = phi i8 [ %b, %cond.false ], [ %a, %entry ]
48*ab0dc290SCraig Topper  ret i8 %cond
49*ab0dc290SCraig Topper}
50*ab0dc290SCraig Topper
51*ab0dc290SCraig Topperdefine i16 @phi_i16(i1 %cnd, i16 %a, i16 %b) {
52*ab0dc290SCraig Topper; CHECK-LABEL: phi_i16:
53*ab0dc290SCraig Topper; CHECK:       # %bb.0: # %entry
54*ab0dc290SCraig Topper; CHECK-NEXT:    mv a3, a0
55*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a1
56*ab0dc290SCraig Topper; CHECK-NEXT:    andi a3, a3, 1
57*ab0dc290SCraig Topper; CHECK-NEXT:    bnez a3, .LBB2_2
58*ab0dc290SCraig Topper; CHECK-NEXT:  # %bb.1: # %cond.false
59*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a2
60*ab0dc290SCraig Topper; CHECK-NEXT:  .LBB2_2: # %cond.end
61*ab0dc290SCraig Topper; CHECK-NEXT:    ret
62*ab0dc290SCraig Topperentry:
63*ab0dc290SCraig Topper  br i1 %cnd, label %cond.end, label %cond.false
64*ab0dc290SCraig Topper
65*ab0dc290SCraig Toppercond.false:                                       ; preds = %entry
66*ab0dc290SCraig Topper  br label %cond.end
67*ab0dc290SCraig Topper
68*ab0dc290SCraig Toppercond.end:                                         ; preds = %entry, %cond.false
69*ab0dc290SCraig Topper  %cond = phi i16 [ %b, %cond.false ], [ %a, %entry ]
70*ab0dc290SCraig Topper  ret i16 %cond
71*ab0dc290SCraig Topper}
72*ab0dc290SCraig Topper
73*ab0dc290SCraig Topperdefine i32 @phi_i32(i1 %cnd, i32 %a, i32 %b) {
74*ab0dc290SCraig Topper; CHECK-LABEL: phi_i32:
75*ab0dc290SCraig Topper; CHECK:       # %bb.0: # %entry
76*ab0dc290SCraig Topper; CHECK-NEXT:    mv a3, a0
77*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a1
78*ab0dc290SCraig Topper; CHECK-NEXT:    andi a3, a3, 1
79*ab0dc290SCraig Topper; CHECK-NEXT:    bnez a3, .LBB3_2
80*ab0dc290SCraig Topper; CHECK-NEXT:  # %bb.1: # %cond.false
81*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a2
82*ab0dc290SCraig Topper; CHECK-NEXT:  .LBB3_2: # %cond.end
83*ab0dc290SCraig Topper; CHECK-NEXT:    ret
84*ab0dc290SCraig Topperentry:
85*ab0dc290SCraig Topper  br i1 %cnd, label %cond.end, label %cond.false
86*ab0dc290SCraig Topper
87*ab0dc290SCraig Toppercond.false:                                       ; preds = %entry
88*ab0dc290SCraig Topper  br label %cond.end
89*ab0dc290SCraig Topper
90*ab0dc290SCraig Toppercond.end:                                         ; preds = %entry, %cond.false
91*ab0dc290SCraig Topper  %cond = phi i32 [ %b, %cond.false ], [ %a, %entry ]
92*ab0dc290SCraig Topper  ret i32 %cond
93*ab0dc290SCraig Topper}
94*ab0dc290SCraig Topper
95*ab0dc290SCraig Topperdefine i64 @phi_i64(i1 %cnd, i64 %a, i64 %b) {
96*ab0dc290SCraig Topper; RV32-LABEL: phi_i64:
97*ab0dc290SCraig Topper; RV32:       # %bb.0: # %entry
98*ab0dc290SCraig Topper; RV32-NEXT:    mv a5, a0
99*ab0dc290SCraig Topper; RV32-NEXT:    mv a0, a1
100*ab0dc290SCraig Topper; RV32-NEXT:    mv a1, a2
101*ab0dc290SCraig Topper; RV32-NEXT:    andi a5, a5, 1
102*ab0dc290SCraig Topper; RV32-NEXT:    bnez a5, .LBB4_2
103*ab0dc290SCraig Topper; RV32-NEXT:  # %bb.1: # %cond.false
104*ab0dc290SCraig Topper; RV32-NEXT:    mv a0, a3
105*ab0dc290SCraig Topper; RV32-NEXT:    mv a1, a4
106*ab0dc290SCraig Topper; RV32-NEXT:  .LBB4_2: # %cond.end
107*ab0dc290SCraig Topper; RV32-NEXT:    ret
108*ab0dc290SCraig Topper;
109*ab0dc290SCraig Topper; RV64-LABEL: phi_i64:
110*ab0dc290SCraig Topper; RV64:       # %bb.0: # %entry
111*ab0dc290SCraig Topper; RV64-NEXT:    mv a3, a0
112*ab0dc290SCraig Topper; RV64-NEXT:    mv a0, a1
113*ab0dc290SCraig Topper; RV64-NEXT:    andi a3, a3, 1
114*ab0dc290SCraig Topper; RV64-NEXT:    bnez a3, .LBB4_2
115*ab0dc290SCraig Topper; RV64-NEXT:  # %bb.1: # %cond.false
116*ab0dc290SCraig Topper; RV64-NEXT:    mv a0, a2
117*ab0dc290SCraig Topper; RV64-NEXT:  .LBB4_2: # %cond.end
118*ab0dc290SCraig Topper; RV64-NEXT:    ret
119*ab0dc290SCraig Topperentry:
120*ab0dc290SCraig Topper  br i1 %cnd, label %cond.end, label %cond.false
121*ab0dc290SCraig Topper
122*ab0dc290SCraig Toppercond.false:                                       ; preds = %entry
123*ab0dc290SCraig Topper  br label %cond.end
124*ab0dc290SCraig Topper
125*ab0dc290SCraig Toppercond.end:                                         ; preds = %entry, %cond.false
126*ab0dc290SCraig Topper  %cond = phi i64 [ %b, %cond.false ], [ %a, %entry ]
127*ab0dc290SCraig Topper  ret i64 %cond
128*ab0dc290SCraig Topper}
129*ab0dc290SCraig Topper
130*ab0dc290SCraig Topperdefine ptr @phi_ptr(i1 %cnd, ptr %a, ptr %b) {
131*ab0dc290SCraig Topper; CHECK-LABEL: phi_ptr:
132*ab0dc290SCraig Topper; CHECK:       # %bb.0: # %entry
133*ab0dc290SCraig Topper; CHECK-NEXT:    mv a3, a0
134*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a1
135*ab0dc290SCraig Topper; CHECK-NEXT:    andi a3, a3, 1
136*ab0dc290SCraig Topper; CHECK-NEXT:    bnez a3, .LBB5_2
137*ab0dc290SCraig Topper; CHECK-NEXT:  # %bb.1: # %cond.false
138*ab0dc290SCraig Topper; CHECK-NEXT:    mv a0, a2
139*ab0dc290SCraig Topper; CHECK-NEXT:  .LBB5_2: # %cond.end
140*ab0dc290SCraig Topper; CHECK-NEXT:    ret
141*ab0dc290SCraig Topperentry:
142*ab0dc290SCraig Topper  br i1 %cnd, label %cond.end, label %cond.false
143*ab0dc290SCraig Topper
144*ab0dc290SCraig Toppercond.false:                                       ; preds = %entry
145*ab0dc290SCraig Topper  br label %cond.end
146*ab0dc290SCraig Topper
147*ab0dc290SCraig Toppercond.end:                                         ; preds = %entry, %cond.false
148*ab0dc290SCraig Topper  %cond = phi ptr [ %b, %cond.false ], [ %a, %entry ]
149*ab0dc290SCraig Topper  ret ptr %cond
150*ab0dc290SCraig Topper}
151*ab0dc290SCraig Topper
152*ab0dc290SCraig Topperdefine float @phi_float(i1 %cnd, float %a, float %b) {
153*ab0dc290SCraig Topper; CHECKI-LABEL: phi_float:
154*ab0dc290SCraig Topper; CHECKI:       # %bb.0: # %entry
155*ab0dc290SCraig Topper; CHECKI-NEXT:    mv a3, a0
156*ab0dc290SCraig Topper; CHECKI-NEXT:    mv a0, a1
157*ab0dc290SCraig Topper; CHECKI-NEXT:    andi a3, a3, 1
158*ab0dc290SCraig Topper; CHECKI-NEXT:    bnez a3, .LBB6_2
159*ab0dc290SCraig Topper; CHECKI-NEXT:  # %bb.1: # %cond.false
160*ab0dc290SCraig Topper; CHECKI-NEXT:    mv a0, a2
161*ab0dc290SCraig Topper; CHECKI-NEXT:  .LBB6_2: # %cond.end
162*ab0dc290SCraig Topper; CHECKI-NEXT:    ret
163*ab0dc290SCraig Topper;
164*ab0dc290SCraig Topper; CHECKIF-LABEL: phi_float:
165*ab0dc290SCraig Topper; CHECKIF:       # %bb.0: # %entry
166*ab0dc290SCraig Topper; CHECKIF-NEXT:    andi a0, a0, 1
167*ab0dc290SCraig Topper; CHECKIF-NEXT:    bnez a0, .LBB6_2
168*ab0dc290SCraig Topper; CHECKIF-NEXT:  # %bb.1: # %cond.false
169*ab0dc290SCraig Topper; CHECKIF-NEXT:    fmv.s fa0, fa1
170*ab0dc290SCraig Topper; CHECKIF-NEXT:  .LBB6_2: # %cond.end
171*ab0dc290SCraig Topper; CHECKIF-NEXT:    ret
172*ab0dc290SCraig Topperentry:
173*ab0dc290SCraig Topper  br i1 %cnd, label %cond.end, label %cond.false
174*ab0dc290SCraig Topper
175*ab0dc290SCraig Toppercond.false:                                       ; preds = %entry
176*ab0dc290SCraig Topper  br label %cond.end
177*ab0dc290SCraig Topper
178*ab0dc290SCraig Toppercond.end:                                         ; preds = %entry, %cond.false
179*ab0dc290SCraig Topper  %cond = phi float [ %b, %cond.false ], [ %a, %entry ]
180*ab0dc290SCraig Topper  ret float %cond
181*ab0dc290SCraig Topper}
182