Skip to content

Commit 9940620

Browse files
authored
[GISel][RISCV] Legalize G_CONSTANT_FOLD_BARRIER (#89960)
This patch supports `G_CONSTANT_FOLD_BARRIER` on RISCV to generate the following inst seq without crash: ``` define i64 @xor_and_i64(i64 %x) { entry: %y = and i64 %x, 16383 %z = xor i64 %y, 16368 ret i64 %z } ```
1 parent ef89057 commit 9940620

File tree

3 files changed

+139
-1
lines changed

3 files changed

+139
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
227227
ConstantActions.widenScalarToNextPow2(0).clampScalar(0, s32, sXLen);
228228

229229
// TODO: transform illegal vector types into legal vector type
230-
getActionDefinitionsBuilder(G_IMPLICIT_DEF)
230+
getActionDefinitionsBuilder({G_IMPLICIT_DEF, G_CONSTANT_FOLD_BARRIER})
231231
.legalFor({s32, sXLen, p0})
232232
.legalIf(typeIsLegalBoolVec(0, BoolVecTys, ST))
233233
.legalIf(typeIsLegalIntOrFPVec(0, IntOrFPVecTys, ST))
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2+
# RUN: llc -mtriple=riscv32 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s
3+
---
4+
name: constbarrier_i32
5+
body: |
6+
bb.0.entry:
7+
; CHECK-LABEL: name: constbarrier_i32
8+
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16368
9+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(s32) = G_CONSTANT_FOLD_BARRIER [[C]]
10+
; CHECK-NEXT: $x10 = COPY [[CONSTANT_FOLD_BARRIER]](s32)
11+
; CHECK-NEXT: PseudoRET implicit $x10
12+
%1:_(s32) = G_CONSTANT i32 16368
13+
%2:_(s32) = G_CONSTANT_FOLD_BARRIER %1
14+
$x10 = COPY %2(s32)
15+
PseudoRET implicit $x10
16+
17+
...
18+
---
19+
name: constbarrier_nxv2i1
20+
body: |
21+
bb.0.entry:
22+
; CHECK-LABEL: name: constbarrier_nxv2i1
23+
; CHECK: [[VMSET_VL:%[0-9]+]]:_(<vscale x 2 x s1>) = G_VMSET_VL $x0
24+
; CHECK-NEXT: [[VMCLR_VL:%[0-9]+]]:_(<vscale x 2 x s1>) = G_VMCLR_VL $x0
25+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(<vscale x 2 x s1>) = G_CONSTANT_FOLD_BARRIER [[VMCLR_VL]]
26+
; CHECK-NEXT: $v8 = COPY [[CONSTANT_FOLD_BARRIER]](<vscale x 2 x s1>)
27+
; CHECK-NEXT: PseudoRET implicit $v8
28+
%1:_(s1) = G_CONSTANT i1 0
29+
%2:_(<vscale x 2 x s1>) = G_SPLAT_VECTOR %1(s1)
30+
%3:_(<vscale x 2 x s1>) = G_CONSTANT_FOLD_BARRIER %2
31+
$v8 = COPY %3(<vscale x 2 x s1>)
32+
PseudoRET implicit $v8
33+
34+
...
35+
---
36+
name: constbarrier_nxv2i32
37+
body: |
38+
bb.0.entry:
39+
; CHECK-LABEL: name: constbarrier_nxv2i32
40+
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
41+
; CHECK-NEXT: [[SPLAT_VECTOR:%[0-9]+]]:_(<vscale x 2 x s32>) = G_SPLAT_VECTOR [[C]](s32)
42+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(<vscale x 2 x s32>) = G_CONSTANT_FOLD_BARRIER [[SPLAT_VECTOR]]
43+
; CHECK-NEXT: $v8 = COPY [[CONSTANT_FOLD_BARRIER]](<vscale x 2 x s32>)
44+
; CHECK-NEXT: PseudoRET implicit $v8
45+
%1:_(s32) = G_CONSTANT i32 0
46+
%2:_(<vscale x 2 x s32>) = G_SPLAT_VECTOR %1(s32)
47+
%3:_(<vscale x 2 x s32>) = G_CONSTANT_FOLD_BARRIER %2
48+
$v8 = COPY %3(<vscale x 2 x s32>)
49+
PseudoRET implicit $v8
50+
51+
...
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 4
2+
# RUN: llc -mtriple=riscv64 -mattr=+v -run-pass=legalizer %s -o - | FileCheck %s
3+
---
4+
name: constbarrier_i32
5+
body: |
6+
bb.0.entry:
7+
; CHECK-LABEL: name: constbarrier_i32
8+
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16368
9+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(s32) = G_CONSTANT_FOLD_BARRIER [[C]]
10+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[CONSTANT_FOLD_BARRIER]](s32)
11+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
12+
; CHECK-NEXT: PseudoRET implicit $x10
13+
%1:_(s32) = G_CONSTANT i32 16368
14+
%2:_(s32) = G_CONSTANT_FOLD_BARRIER %1
15+
%3:_(s64) = G_ANYEXT %2(s32)
16+
$x10 = COPY %3(s64)
17+
PseudoRET implicit $x10
18+
19+
...
20+
---
21+
name: constbarrier_i64
22+
body: |
23+
bb.0.entry:
24+
; CHECK-LABEL: name: constbarrier_i64
25+
; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 16368
26+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(s64) = G_CONSTANT_FOLD_BARRIER [[C]]
27+
; CHECK-NEXT: $x10 = COPY [[CONSTANT_FOLD_BARRIER]](s64)
28+
; CHECK-NEXT: PseudoRET implicit $x10
29+
%1:_(s64) = G_CONSTANT i64 16368
30+
%2:_(s64) = G_CONSTANT_FOLD_BARRIER %1
31+
$x10 = COPY %2(s64)
32+
PseudoRET implicit $x10
33+
34+
...
35+
---
36+
name: constbarrier_nxv2i1
37+
body: |
38+
bb.0.entry:
39+
; CHECK-LABEL: name: constbarrier_nxv2i1
40+
; CHECK: [[VMSET_VL:%[0-9]+]]:_(<vscale x 2 x s1>) = G_VMSET_VL $x0
41+
; CHECK-NEXT: [[VMCLR_VL:%[0-9]+]]:_(<vscale x 2 x s1>) = G_VMCLR_VL $x0
42+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(<vscale x 2 x s1>) = G_CONSTANT_FOLD_BARRIER [[VMCLR_VL]]
43+
; CHECK-NEXT: $v8 = COPY [[CONSTANT_FOLD_BARRIER]](<vscale x 2 x s1>)
44+
; CHECK-NEXT: PseudoRET implicit $v8
45+
%1:_(s1) = G_CONSTANT i1 0
46+
%2:_(<vscale x 2 x s1>) = G_SPLAT_VECTOR %1(s1)
47+
%3:_(<vscale x 2 x s1>) = G_CONSTANT_FOLD_BARRIER %2
48+
$v8 = COPY %3(<vscale x 2 x s1>)
49+
PseudoRET implicit $v8
50+
51+
...
52+
---
53+
name: constbarrier_nxv2i32
54+
body: |
55+
bb.0.entry:
56+
; CHECK-LABEL: name: constbarrier_nxv2i32
57+
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
58+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[C]](s32)
59+
; CHECK-NEXT: [[SPLAT_VECTOR:%[0-9]+]]:_(<vscale x 2 x s32>) = G_SPLAT_VECTOR [[ANYEXT]](s64)
60+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(<vscale x 2 x s32>) = G_CONSTANT_FOLD_BARRIER [[SPLAT_VECTOR]]
61+
; CHECK-NEXT: $v8 = COPY [[CONSTANT_FOLD_BARRIER]](<vscale x 2 x s32>)
62+
; CHECK-NEXT: PseudoRET implicit $v8
63+
%1:_(s32) = G_CONSTANT i32 0
64+
%2:_(<vscale x 2 x s32>) = G_SPLAT_VECTOR %1(s32)
65+
%3:_(<vscale x 2 x s32>) = G_CONSTANT_FOLD_BARRIER %2
66+
$v8 = COPY %3(<vscale x 2 x s32>)
67+
PseudoRET implicit $v8
68+
69+
...
70+
---
71+
name: constbarrier_nxv2i64
72+
body: |
73+
bb.0.entry:
74+
; CHECK-LABEL: name: constbarrier_nxv2i64
75+
; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
76+
; CHECK-NEXT: [[SPLAT_VECTOR:%[0-9]+]]:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR [[C]](s64)
77+
; CHECK-NEXT: [[CONSTANT_FOLD_BARRIER:%[0-9]+]]:_(<vscale x 2 x s64>) = G_CONSTANT_FOLD_BARRIER [[SPLAT_VECTOR]]
78+
; CHECK-NEXT: $v8m2 = COPY [[CONSTANT_FOLD_BARRIER]](<vscale x 2 x s64>)
79+
; CHECK-NEXT: PseudoRET implicit $v8m2
80+
%0:_(<vscale x 2 x s64>) = G_IMPLICIT_DEF
81+
%1:_(s64) = G_CONSTANT i64 0
82+
%2:_(<vscale x 2 x s64>) = G_SPLAT_VECTOR %1(s64)
83+
%3:_(<vscale x 2 x s64>) = G_CONSTANT_FOLD_BARRIER %2(<vscale x 2 x s64>)
84+
$v8m2 = COPY %3(<vscale x 2 x s64>)
85+
PseudoRET implicit $v8m2
86+
87+
...

0 commit comments

Comments
 (0)