Skip to content

Commit f84fc44

Browse files
committed
[RISCV][GISel] Make s16->s32 G_ANYEXT/SEXT/ZEXT legal.
1 parent f082782 commit f84fc44

File tree

2 files changed

+116
-2
lines changed

2 files changed

+116
-2
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &ST)
155155
.clampScalar(0, sXLen, sXLen);
156156

157157
getActionDefinitionsBuilder({G_ZEXT, G_SEXT, G_ANYEXT})
158-
.legalFor({{sXLen, s16}})
159-
.legalFor(ST.is64Bit(), {{s64, s32}})
158+
.legalFor({{s32, s16}})
159+
.legalFor(ST.is64Bit(), {{s64, s16}, {s64, s32}})
160160
.legalIf(all(typeIsLegalIntOrFPVec(0, IntOrFPVecTys, ST),
161161
typeIsLegalIntOrFPVec(1, IntOrFPVecTys, ST)))
162162
.customIf(typeIsLegalBoolVec(1, BoolVecTys, ST))

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

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,117 @@ body: |
4444
PseudoRET implicit $x10
4545
4646
...
47+
---
48+
name: anyext_16_i32
49+
body: |
50+
; CHECK-LABEL: name: anyext_16_i32
51+
; CHECK: bb.0.entry:
52+
; CHECK-NEXT: successors: %bb.1(0x80000000)
53+
; CHECK-NEXT: {{ $}}
54+
; CHECK-NEXT: bb.1:
55+
; CHECK-NEXT: liveins: $x10, $x11
56+
; CHECK-NEXT: {{ $}}
57+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
58+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
59+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
60+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)
61+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
62+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s16)
63+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
64+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[C1]]
65+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[AND]](s64), [[ANYEXT]], [[TRUNC]]
66+
; CHECK-NEXT: [[ANYEXT1:%[0-9]+]]:_(s64) = G_ANYEXT [[SELECT]](s32)
67+
; CHECK-NEXT: $x10 = COPY [[ANYEXT1]](s64)
68+
; CHECK-NEXT: PseudoRET implicit $x10
69+
bb.0.entry:
70+
bb.1:
71+
liveins: $x10, $x11
72+
73+
%0:_(p0) = COPY $x10
74+
%1:_(s64) = COPY $x11
75+
%2:_(s1) = G_TRUNC %1(s64)
76+
%3:_(s32) = G_CONSTANT i32 0
77+
%4:_(s16) = G_LOAD %0(p0) :: (load (s16))
78+
%5:_(s32) = G_ANYEXT %4(s16)
79+
%6:_(s32) = G_SELECT %2(s1), %5, %3
80+
%7:_(s64) = G_ANYEXT %6(s32)
81+
$x10 = COPY %7(s64)
82+
PseudoRET implicit $x10
83+
84+
...
85+
---
86+
name: sext_16_i32
87+
body: |
88+
; CHECK-LABEL: name: sext_16_i32
89+
; CHECK: bb.0.entry:
90+
; CHECK-NEXT: successors: %bb.1(0x80000000)
91+
; CHECK-NEXT: {{ $}}
92+
; CHECK-NEXT: bb.1:
93+
; CHECK-NEXT: liveins: $x10, $x11
94+
; CHECK-NEXT: {{ $}}
95+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
96+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
97+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
98+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)
99+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
100+
; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(s32) = G_SEXT [[LOAD]](s16)
101+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
102+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[C1]]
103+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[AND]](s64), [[SEXT]], [[TRUNC]]
104+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[SELECT]](s32)
105+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
106+
; CHECK-NEXT: PseudoRET implicit $x10
107+
bb.0.entry:
108+
bb.1:
109+
liveins: $x10, $x11
110+
111+
%0:_(p0) = COPY $x10
112+
%1:_(s64) = COPY $x11
113+
%2:_(s1) = G_TRUNC %1(s64)
114+
%3:_(s32) = G_CONSTANT i32 0
115+
%4:_(s16) = G_LOAD %0(p0) :: (load (s16))
116+
%5:_(s32) = G_SEXT %4(s16)
117+
%6:_(s32) = G_SELECT %2(s1), %5, %3
118+
%7:_(s64) = G_ANYEXT %6(s32)
119+
$x10 = COPY %7(s64)
120+
PseudoRET implicit $x10
121+
122+
...
123+
---
124+
name: zext_16_i32
125+
body: |
126+
; CHECK-LABEL: name: zext_16_i32
127+
; CHECK: bb.0.entry:
128+
; CHECK-NEXT: successors: %bb.1(0x80000000)
129+
; CHECK-NEXT: {{ $}}
130+
; CHECK-NEXT: bb.1:
131+
; CHECK-NEXT: liveins: $x10, $x11
132+
; CHECK-NEXT: {{ $}}
133+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10
134+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11
135+
; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
136+
; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s32) = G_TRUNC [[C]](s64)
137+
; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
138+
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(s32) = G_ZEXT [[LOAD]](s16)
139+
; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
140+
; CHECK-NEXT: [[AND:%[0-9]+]]:_(s64) = G_AND [[COPY1]], [[C1]]
141+
; CHECK-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[AND]](s64), [[ZEXT]], [[TRUNC]]
142+
; CHECK-NEXT: [[ANYEXT:%[0-9]+]]:_(s64) = G_ANYEXT [[SELECT]](s32)
143+
; CHECK-NEXT: $x10 = COPY [[ANYEXT]](s64)
144+
; CHECK-NEXT: PseudoRET implicit $x10
145+
bb.0.entry:
146+
bb.1:
147+
liveins: $x10, $x11
148+
149+
%0:_(p0) = COPY $x10
150+
%1:_(s64) = COPY $x11
151+
%2:_(s1) = G_TRUNC %1(s64)
152+
%3:_(s32) = G_CONSTANT i32 0
153+
%4:_(s16) = G_LOAD %0(p0) :: (load (s16))
154+
%5:_(s32) = G_ZEXT %4(s16)
155+
%6:_(s32) = G_SELECT %2(s1), %5, %3
156+
%7:_(s64) = G_ANYEXT %6(s32)
157+
$x10 = COPY %7(s64)
158+
PseudoRET implicit $x10
159+
160+
...

0 commit comments

Comments
 (0)