Skip to content

Commit ab0dc29

Browse files
committed
[RISCV][GISel] Allow s32 G_PHI for RV64 to support f32 phis.
1 parent 7f7f540 commit ab0dc29

File tree

3 files changed

+206
-10
lines changed

3 files changed

+206
-10
lines changed

llvm/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,9 +412,9 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
412412
getActionDefinitionsBuilder(G_BRINDIRECT).legalFor({p0});
413413

414414
getActionDefinitionsBuilder(G_PHI)
415-
.legalFor({p0, sXLen})
415+
.legalFor({p0, s32, sXLen})
416416
.widenScalarToNextPow2(0)
417-
.clampScalar(0, sXLen, sXLen);
417+
.clampScalar(0, s32, sXLen);
418418

419419
getActionDefinitionsBuilder({G_GLOBAL_VALUE, G_JUMP_TABLE, G_CONSTANT_POOL})
420420
.legalFor({p0});

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-phi-rv64.mir

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ body: |
139139
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
140140
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
141141
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12
142+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)
142143
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
143144
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]]
144145
; CHECK-NEXT: G_BRCOND [[AND]](s64), %bb.2
@@ -147,9 +148,12 @@ body: |
147148
; CHECK-NEXT: bb.1.cond.false:
148149
; CHECK-NEXT: successors: %bb.2(0x80000000)
149150
; CHECK-NEXT: {{ $}}
151+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY2]](s64)
152+
; CHECK-NEXT: {{ $}}
150153
; CHECK-NEXT: bb.2.cond.end:
151-
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s64) = G_PHI [[COPY2]](s64), %bb.1, [[COPY1]](s64), %bb.0
152-
; CHECK-NEXT: $x10 = COPY [[PHI]](s64)
154+
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI [[TRUNC1]](s32), %bb.1, [[TRUNC]](s32), %bb.0
155+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[PHI]](s32)
156+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
153157
; CHECK-NEXT: PseudoRET implicit $x10
154158
bb.1.entry:
155159
liveins: $x10, $x11, $x12
@@ -199,6 +203,7 @@ body: |
199203
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
200204
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
201205
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12
206+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)
202207
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
203208
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]]
204209
; CHECK-NEXT: G_BRCOND [[AND]](s64), %bb.2
@@ -207,9 +212,12 @@ body: |
207212
; CHECK-NEXT: bb.1.cond.false:
208213
; CHECK-NEXT: successors: %bb.2(0x80000000)
209214
; CHECK-NEXT: {{ $}}
215+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY2]](s64)
216+
; CHECK-NEXT: {{ $}}
210217
; CHECK-NEXT: bb.2.cond.end:
211-
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s64) = G_PHI [[COPY2]](s64), %bb.1, [[COPY1]](s64), %bb.0
212-
; CHECK-NEXT: $x10 = COPY [[PHI]](s64)
218+
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI [[TRUNC1]](s32), %bb.1, [[TRUNC]](s32), %bb.0
219+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[PHI]](s32)
220+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
213221
; CHECK-NEXT: PseudoRET implicit $x10
214222
bb.1.entry:
215223
liveins: $x10, $x11, $x12
@@ -259,6 +267,7 @@ body: |
259267
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
260268
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
261269
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12
270+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)
262271
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
263272
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]]
264273
; CHECK-NEXT: G_BRCOND [[AND]](s64), %bb.2
@@ -267,9 +276,12 @@ body: |
267276
; CHECK-NEXT: bb.1.cond.false:
268277
; CHECK-NEXT: successors: %bb.2(0x80000000)
269278
; CHECK-NEXT: {{ $}}
279+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY2]](s64)
280+
; CHECK-NEXT: {{ $}}
270281
; CHECK-NEXT: bb.2.cond.end:
271-
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s64) = G_PHI [[COPY2]](s64), %bb.1, [[COPY1]](s64), %bb.0
272-
; CHECK-NEXT: $x10 = COPY [[PHI]](s64)
282+
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI [[TRUNC1]](s32), %bb.1, [[TRUNC]](s32), %bb.0
283+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[PHI]](s32)
284+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
273285
; CHECK-NEXT: PseudoRET implicit $x10
274286
bb.1.entry:
275287
liveins: $x10, $x11, $x12
@@ -318,7 +330,9 @@ body: |
318330
; CHECK-NEXT: {{ $}}
319331
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x10
320332
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
333+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[COPY1]](s64)
321334
; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x12
335+
; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s32) = G_TRUNC [[COPY2]](s64)
322336
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
323337
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY]], [[C]]
324338
; CHECK-NEXT: G_BRCOND [[AND]](s64), %bb.2
@@ -328,8 +342,9 @@ body: |
328342
; CHECK-NEXT: successors: %bb.2(0x80000000)
329343
; CHECK-NEXT: {{ $}}
330344
; CHECK-NEXT: bb.2.cond.end:
331-
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s64) = G_PHI [[COPY2]](s64), %bb.1, [[COPY1]](s64), %bb.0
332-
; CHECK-NEXT: $x10 = COPY [[PHI]](s64)
345+
; CHECK-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI [[TRUNC1]](s32), %bb.1, [[TRUNC]](s32), %bb.0
346+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[PHI]](s32)
347+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
333348
; CHECK-NEXT: PseudoRET implicit $x10
334349
bb.1.entry:
335350
liveins: $x10, $x11, $x12
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc -mtriple=riscv32 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV32
3+
; RUN: llc -mtriple=riscv64 -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKI,RV64
4+
; RUN: llc -mtriple=riscv32 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV32
5+
; RUN: llc -mtriple=riscv64 -mattr=+f -global-isel < %s | FileCheck %s --check-prefixes=CHECK,CHECKIF,RV64
6+
7+
define i1 @phi_i1(i1 %cnd, i1 %a, i1 %b) {
8+
; CHECK-LABEL: phi_i1:
9+
; CHECK: # %bb.0: # %entry
10+
; CHECK-NEXT: mv a3, a0
11+
; CHECK-NEXT: mv a0, a1
12+
; CHECK-NEXT: andi a3, a3, 1
13+
; CHECK-NEXT: bnez a3, .LBB0_2
14+
; CHECK-NEXT: # %bb.1: # %cond.false
15+
; CHECK-NEXT: mv a0, a2
16+
; CHECK-NEXT: .LBB0_2: # %cond.end
17+
; CHECK-NEXT: ret
18+
entry:
19+
br i1 %cnd, label %cond.end, label %cond.false
20+
21+
cond.false: ; preds = %entry
22+
br label %cond.end
23+
24+
cond.end: ; preds = %entry, %cond.false
25+
%cond = phi i1 [ %b, %cond.false ], [ %a, %entry ]
26+
ret i1 %cond
27+
}
28+
29+
define i8 @phi_i8(i1 %cnd, i8 %a, i8 %b) {
30+
; CHECK-LABEL: phi_i8:
31+
; CHECK: # %bb.0: # %entry
32+
; CHECK-NEXT: mv a3, a0
33+
; CHECK-NEXT: mv a0, a1
34+
; CHECK-NEXT: andi a3, a3, 1
35+
; CHECK-NEXT: bnez a3, .LBB1_2
36+
; CHECK-NEXT: # %bb.1: # %cond.false
37+
; CHECK-NEXT: mv a0, a2
38+
; CHECK-NEXT: .LBB1_2: # %cond.end
39+
; CHECK-NEXT: ret
40+
entry:
41+
br i1 %cnd, label %cond.end, label %cond.false
42+
43+
cond.false: ; preds = %entry
44+
br label %cond.end
45+
46+
cond.end: ; preds = %entry, %cond.false
47+
%cond = phi i8 [ %b, %cond.false ], [ %a, %entry ]
48+
ret i8 %cond
49+
}
50+
51+
define i16 @phi_i16(i1 %cnd, i16 %a, i16 %b) {
52+
; CHECK-LABEL: phi_i16:
53+
; CHECK: # %bb.0: # %entry
54+
; CHECK-NEXT: mv a3, a0
55+
; CHECK-NEXT: mv a0, a1
56+
; CHECK-NEXT: andi a3, a3, 1
57+
; CHECK-NEXT: bnez a3, .LBB2_2
58+
; CHECK-NEXT: # %bb.1: # %cond.false
59+
; CHECK-NEXT: mv a0, a2
60+
; CHECK-NEXT: .LBB2_2: # %cond.end
61+
; CHECK-NEXT: ret
62+
entry:
63+
br i1 %cnd, label %cond.end, label %cond.false
64+
65+
cond.false: ; preds = %entry
66+
br label %cond.end
67+
68+
cond.end: ; preds = %entry, %cond.false
69+
%cond = phi i16 [ %b, %cond.false ], [ %a, %entry ]
70+
ret i16 %cond
71+
}
72+
73+
define i32 @phi_i32(i1 %cnd, i32 %a, i32 %b) {
74+
; CHECK-LABEL: phi_i32:
75+
; CHECK: # %bb.0: # %entry
76+
; CHECK-NEXT: mv a3, a0
77+
; CHECK-NEXT: mv a0, a1
78+
; CHECK-NEXT: andi a3, a3, 1
79+
; CHECK-NEXT: bnez a3, .LBB3_2
80+
; CHECK-NEXT: # %bb.1: # %cond.false
81+
; CHECK-NEXT: mv a0, a2
82+
; CHECK-NEXT: .LBB3_2: # %cond.end
83+
; CHECK-NEXT: ret
84+
entry:
85+
br i1 %cnd, label %cond.end, label %cond.false
86+
87+
cond.false: ; preds = %entry
88+
br label %cond.end
89+
90+
cond.end: ; preds = %entry, %cond.false
91+
%cond = phi i32 [ %b, %cond.false ], [ %a, %entry ]
92+
ret i32 %cond
93+
}
94+
95+
define i64 @phi_i64(i1 %cnd, i64 %a, i64 %b) {
96+
; RV32-LABEL: phi_i64:
97+
; RV32: # %bb.0: # %entry
98+
; RV32-NEXT: mv a5, a0
99+
; RV32-NEXT: mv a0, a1
100+
; RV32-NEXT: mv a1, a2
101+
; RV32-NEXT: andi a5, a5, 1
102+
; RV32-NEXT: bnez a5, .LBB4_2
103+
; RV32-NEXT: # %bb.1: # %cond.false
104+
; RV32-NEXT: mv a0, a3
105+
; RV32-NEXT: mv a1, a4
106+
; RV32-NEXT: .LBB4_2: # %cond.end
107+
; RV32-NEXT: ret
108+
;
109+
; RV64-LABEL: phi_i64:
110+
; RV64: # %bb.0: # %entry
111+
; RV64-NEXT: mv a3, a0
112+
; RV64-NEXT: mv a0, a1
113+
; RV64-NEXT: andi a3, a3, 1
114+
; RV64-NEXT: bnez a3, .LBB4_2
115+
; RV64-NEXT: # %bb.1: # %cond.false
116+
; RV64-NEXT: mv a0, a2
117+
; RV64-NEXT: .LBB4_2: # %cond.end
118+
; RV64-NEXT: ret
119+
entry:
120+
br i1 %cnd, label %cond.end, label %cond.false
121+
122+
cond.false: ; preds = %entry
123+
br label %cond.end
124+
125+
cond.end: ; preds = %entry, %cond.false
126+
%cond = phi i64 [ %b, %cond.false ], [ %a, %entry ]
127+
ret i64 %cond
128+
}
129+
130+
define ptr @phi_ptr(i1 %cnd, ptr %a, ptr %b) {
131+
; CHECK-LABEL: phi_ptr:
132+
; CHECK: # %bb.0: # %entry
133+
; CHECK-NEXT: mv a3, a0
134+
; CHECK-NEXT: mv a0, a1
135+
; CHECK-NEXT: andi a3, a3, 1
136+
; CHECK-NEXT: bnez a3, .LBB5_2
137+
; CHECK-NEXT: # %bb.1: # %cond.false
138+
; CHECK-NEXT: mv a0, a2
139+
; CHECK-NEXT: .LBB5_2: # %cond.end
140+
; CHECK-NEXT: ret
141+
entry:
142+
br i1 %cnd, label %cond.end, label %cond.false
143+
144+
cond.false: ; preds = %entry
145+
br label %cond.end
146+
147+
cond.end: ; preds = %entry, %cond.false
148+
%cond = phi ptr [ %b, %cond.false ], [ %a, %entry ]
149+
ret ptr %cond
150+
}
151+
152+
define float @phi_float(i1 %cnd, float %a, float %b) {
153+
; CHECKI-LABEL: phi_float:
154+
; CHECKI: # %bb.0: # %entry
155+
; CHECKI-NEXT: mv a3, a0
156+
; CHECKI-NEXT: mv a0, a1
157+
; CHECKI-NEXT: andi a3, a3, 1
158+
; CHECKI-NEXT: bnez a3, .LBB6_2
159+
; CHECKI-NEXT: # %bb.1: # %cond.false
160+
; CHECKI-NEXT: mv a0, a2
161+
; CHECKI-NEXT: .LBB6_2: # %cond.end
162+
; CHECKI-NEXT: ret
163+
;
164+
; CHECKIF-LABEL: phi_float:
165+
; CHECKIF: # %bb.0: # %entry
166+
; CHECKIF-NEXT: andi a0, a0, 1
167+
; CHECKIF-NEXT: bnez a0, .LBB6_2
168+
; CHECKIF-NEXT: # %bb.1: # %cond.false
169+
; CHECKIF-NEXT: fmv.s fa0, fa1
170+
; CHECKIF-NEXT: .LBB6_2: # %cond.end
171+
; CHECKIF-NEXT: ret
172+
entry:
173+
br i1 %cnd, label %cond.end, label %cond.false
174+
175+
cond.false: ; preds = %entry
176+
br label %cond.end
177+
178+
cond.end: ; preds = %entry, %cond.false
179+
%cond = phi float [ %b, %cond.false ], [ %a, %entry ]
180+
ret float %cond
181+
}

0 commit comments

Comments
 (0)